home *** CD-ROM | disk | FTP | other *** search
/ Ian & Stuart's Australian Mac: Not for Sale / Another.not.for.sale (Australia).iso / fade into you / getting there / Apps / Moo 1.0d / UpdatedDB < prev    next >
Text File  |  1993-10-12  |  1MB  |  108,284 lines

  1. 434
  2. 1266
  3. 0
  4. 15
  5. 2
  6. 71
  7. 38
  8. 40
  9. 77
  10. 79
  11. 83
  12. 84
  13. 85
  14. 86
  15. 147
  16. 154
  17. 228
  18. 337
  19. 346
  20. #0
  21. The System Object
  22.  
  23. 24
  24. 2
  25. -1
  26. -1
  27. -1
  28. 1
  29. -1
  30. 20
  31. 6
  32. do_login_command
  33. 2
  34. 173
  35. -1
  36. server_started
  37. 2
  38. 173
  39. -1
  40. core_objects
  41. 2
  42. 173
  43. -1
  44. init_for_core
  45. 2
  46. 165
  47. -1
  48. user_connected user_created
  49. 2
  50. 165
  51. -1
  52. user_disconnected user_client_disconnected
  53. 2
  54. 165
  55. -1
  56. 94
  57. builder
  58. login
  59. last_huh
  60. guest_log
  61. last_restart_time
  62. biglist
  63. big_mail_recipient
  64. limbo
  65. registration_db
  66. new_player_log
  67. verb_help
  68. core_help
  69. prog_help
  70. wiz_help
  71. shutdown_task
  72. wiz_utils
  73. site_db
  74. math_utils
  75. set_utils
  76. builtin_function_help
  77. new_prog_log
  78. generic_help
  79. guest
  80. seq_utils
  81. quota_log
  82. you
  83. free_list
  84. max_seconds
  85. max_ticks
  86. hacker
  87. generic_db
  88. shutdown_message
  89. shutdown_time
  90. no_one
  91. player_db
  92. class_registry
  93. player_class
  94. gender_utils
  95. trig_utils
  96. time_utils
  97. editor_help
  98. mail_recipient
  99. mail_agent
  100. mail_editor
  101. note_editor
  102. verb_editor
  103. generic_editor
  104. match_utils
  105. object_utils
  106. lock_utils
  107. gripe_recipients
  108. letter
  109. dump_interval
  110. list_utils
  111. command_utils
  112. player
  113. wiz
  114. prog
  115. code_utils
  116. help
  117. nothing
  118. failed_match
  119. ambiguous_match
  120. perm_utils
  121. building_utils
  122. string_utils
  123. news
  124. note
  125. container
  126. thing
  127. exit
  128. room
  129. player_start
  130. root_class
  131. recycler
  132. garbage
  133. mail_options
  134. edit_options
  135. display_options
  136. generic_options
  137. maxint
  138. minint
  139. list_options
  140. error
  141. newt_log
  142. toad_log
  143. site_log
  144. housekeeper
  145. network
  146. generic_biglist_home
  147. feature
  148. local
  149. gopher
  150. robot
  151. 98
  152. 1
  153. 4
  154. 2
  155. 5
  156. 1
  157. 12
  158. 2
  159. 1
  160. 1
  161. 13
  162. 2
  163. 1
  164. 1
  165. 14
  166. 2
  167. 1
  168. 0
  169. 751897947
  170. 2
  171. 5
  172. 1
  173. 15
  174. 2
  175. 5
  176. 1
  177. 16
  178. 2
  179. 5
  180. 1
  181. 17
  182. 2
  183. 5
  184. 1
  185. 18
  186. 2
  187. 5
  188. 1
  189. 19
  190. 2
  191. 5
  192. 1
  193. 22
  194. 2
  195. 5
  196. 1
  197. 23
  198. 2
  199. 5
  200. 1
  201. 24
  202. 2
  203. 5
  204. 1
  205. 25
  206. 2
  207. 5
  208. 3
  209. 12215416
  210. 2
  211. 5
  212. 1
  213. 26
  214. 2
  215. 5
  216. 1
  217. 27
  218. 2
  219. 5
  220. 1
  221. 28
  222. 2
  223. 5
  224. 1
  225. 29
  226. 2
  227. 5
  228. 1
  229. 30
  230. 2
  231. 5
  232. 1
  233. 31
  234. 2
  235. 5
  236. 1
  237. 32
  238. 2
  239. 5
  240. 1
  241. 33
  242. 2
  243. 1
  244. 1
  245. 35
  246. 2
  247. 5
  248. 1
  249. 36
  250. 2
  251. 5
  252. 1
  253. 37
  254. 38
  255. 1
  256. 4
  257. 0
  258. 2
  259. 5
  260. 0
  261. 5
  262. 2
  263. 5
  264. 0
  265. 30000
  266. 2
  267. 5
  268. 1
  269. 38
  270. 2
  271. 5
  272. 1
  273. 39
  274. 2
  275. 5
  276. 2
  277. Bob (#2): "why not
  278. 2
  279. 5
  280. 0
  281. 750706605
  282. 2
  283. 5
  284. 1
  285. 40
  286. 2
  287. 1
  288. 1
  289. 41
  290. 2
  291. 1
  292. 4
  293. 2
  294. 4
  295. 3
  296. 2
  297. generics
  298. 2
  299. Generic objects intended for use as the parents of new objects
  300. 4
  301. 13
  302. 1
  303. 3
  304. 1
  305. 7
  306. 1
  307. 5
  308. 1
  309. 9
  310. 1
  311. 55
  312. 1
  313. 8
  314. 1
  315. 1
  316. 1
  317. 6
  318. 1
  319. 59
  320. 1
  321. 58
  322. 1
  323. 51
  324. 1
  325. 46
  326. 1
  327. 47
  328. 4
  329. 3
  330. 2
  331. utilities
  332. 2
  333. Objects holding useful general-purpose verbs
  334. 4
  335. 12
  336. 1
  337. 20
  338. 1
  339. 43
  340. 1
  341. 28
  342. 1
  343. 44
  344. 1
  345. 52
  346. 1
  347. 53
  348. 1
  349. 54
  350. 1
  351. 56
  352. 1
  353. 57
  354. 1
  355. 60
  356. 1
  357. 42
  358. 1
  359. 21
  360. 2
  361. 5
  362. 1
  363. 6
  364. 2
  365. 5
  366. 1
  367. 43
  368. 2
  369. 1
  370. 1
  371. 28
  372. 2
  373. 5
  374. 1
  375. 44
  376. 2
  377. 5
  378. 1
  379. 45
  380. 2
  381. 5
  382. 1
  383. 46
  384. 2
  385. 5
  386. 1
  387. 47
  388. 2
  389. 5
  390. 1
  391. 48
  392. 2
  393. 5
  394. 1
  395. 49
  396. 2
  397. 5
  398. 1
  399. 50
  400. 2
  401. 5
  402. 1
  403. 51
  404. 2
  405. 5
  406. 1
  407. 52
  408. 2
  409. 5
  410. 1
  411. 53
  412. 2
  413. 5
  414. 1
  415. 54
  416. 2
  417. 5
  418. 4
  419. 1
  420. 1
  421. 2
  422. 2
  423. 5
  424. 1
  425. 55
  426. 2
  427. 5
  428. 0
  429. 3600
  430. 2
  431. 5
  432. 1
  433. 56
  434. 2
  435. 5
  436. 1
  437. 57
  438. 2
  439. 5
  440. 1
  441. 6
  442. 2
  443. 5
  444. 1
  445. 58
  446. 2
  447. 5
  448. 1
  449. 59
  450. 2
  451. 5
  452. 1
  453. 60
  454. 2
  455. 5
  456. 1
  457. 61
  458. 2
  459. 5
  460. 1
  461. -1
  462. 2
  463. 5
  464. 1
  465. -3
  466. 2
  467. 5
  468. 1
  469. -2
  470. 2
  471. 5
  472. 1
  473. 42
  474. 2
  475. 5
  476. 1
  477. 21
  478. 2
  479. 5
  480. 1
  481. 20
  482. 2
  483. 5
  484. 1
  485. 10
  486. 2
  487. 5
  488. 1
  489. 9
  490. 2
  491. 5
  492. 1
  493. 8
  494. 2
  495. 5
  496. 1
  497. 5
  498. 2
  499. 5
  500. 1
  501. 7
  502. 2
  503. 5
  504. 1
  505. 3
  506. 2
  507. 5
  508. 1
  509. 11
  510. 2
  511. 5
  512. 1
  513. 1
  514. 2
  515. 5
  516. 1
  517. 62
  518. 2
  519. 5
  520. 1
  521. 63
  522. 2
  523. 5
  524. 1
  525. 64
  526. 2
  527. 5
  528. 1
  529. 65
  530. 2
  531. 5
  532. 1
  533. 66
  534. 2
  535. 5
  536. 1
  537. 67
  538. 2
  539. 5
  540. 0
  541. 2147483647
  542. 2
  543. 5
  544. 0
  545. -2147483648
  546. 2
  547. 5
  548. 1
  549. 68
  550. 2
  551. 5
  552. 1
  553. 69
  554. 2
  555. 5
  556. 1
  557. 70
  558. 2
  559. 5
  560. 1
  561. 70
  562. 2
  563. 5
  564. 1
  565. 70
  566. 2
  567. 5
  568. 1
  569. 71
  570. 2
  571. 5
  572. 1
  573. 72
  574. 2
  575. 5
  576. 1
  577. 73
  578. 2
  579. 1
  580. 1
  581. 74
  582. 2
  583. 5
  584. 1
  585. -1
  586. 2
  587. 5
  588. 1
  589. 75
  590. 2
  591. 1
  592. 1
  593. 352
  594. 2
  595. 1
  596. 5
  597. 2
  598. 4
  599. 4
  600. 3
  601. 2
  602. The
  603. 2
  604. Known
  605. 2
  606. Universe
  607. 2
  608. 5
  609. 2
  610. The known universe.
  611. 2
  612. 5
  613. 4
  614. 2
  615. 0
  616. 9962
  617. 0
  618. 743618681
  619. 2
  620. 1
  621. #1
  622. Root Class
  623.  
  624. 152
  625. 2
  626. -1
  627. -1
  628. -1
  629. -1
  630. 3
  631. -1
  632. 37
  633. initialize
  634. 2
  635. 165
  636. -1
  637. recycle
  638. 2
  639. 165
  640. -1
  641. set_name
  642. 2
  643. 165
  644. -1
  645. title
  646. 2
  647. 173
  648. -1
  649. titlec
  650. 2
  651. 173
  652. -1
  653. set_aliases
  654. 2
  655. 165
  656. -1
  657. match
  658. 2
  659. 173
  660. -1
  661. match_object
  662. 2
  663. 173
  664. -1
  665. set_description
  666. 2
  667. 173
  668. -1
  669. description
  670. 2
  671. 173
  672. -1
  673. look_self
  674. 2
  675. 173
  676. -1
  677. exam*ine
  678. 2
  679. 37
  680. -1
  681. notify
  682. 2
  683. 173
  684. -1
  685. tell
  686. 2
  687. 173
  688. -1
  689. tell_lines
  690. 2
  691. 173
  692. -1
  693. accept
  694. 2
  695. 173
  696. -1
  697. moveto
  698. 2
  699. 165
  700. -1
  701. eject eject_nice eject_basic
  702. 2
  703. 165
  704. -1
  705. is_unlocked_for
  706. 2
  707. 173
  708. -1
  709. huh
  710. 2
  711. 173
  712. -1
  713. set_message
  714. 2
  715. 165
  716. -1
  717. do_examine
  718. 2
  719. 165
  720. -1
  721. examine_key
  722. 2
  723. 173
  724. -1
  725. examine_names
  726. 2
  727. 173
  728. -1
  729. examine_desc
  730. 2
  731. 173
  732. -1
  733. examine_contents
  734. 2
  735. 165
  736. -1
  737. examine_verbs
  738. 2
  739. 165
  740. -1
  741. get_message
  742. 2
  743. 165
  744. -1
  745. room_announce*_all_but
  746. 2
  747. 165
  748. -1
  749. init_for_core
  750. 2
  751. 173
  752. -1
  753. contents
  754. 38
  755. 173
  756. -1
  757. examine_verb_ok
  758. 2
  759. 165
  760. -1
  761. is_listening
  762. 2
  763. 173
  764. -1
  765. hidden_verbs
  766. 2
  767. 165
  768. -1
  769. examine_owner
  770. 2
  771. 173
  772. -1
  773. announce*_all_but
  774. 2
  775. 173
  776. -1
  777. tell_lines_suspended
  778. 2
  779. 173
  780. -1
  781. 4
  782. key
  783. aliases
  784. description
  785. object_size
  786. 4
  787. 0
  788. 0
  789. 2
  790. 4
  791. 4
  792. 0
  793. 2
  794. 5
  795. 2
  796.  
  797. 2
  798. 5
  799. 4
  800. 2
  801. 0
  802. 16273
  803. 0
  804. 743618682
  805. 2
  806. 1
  807. #2
  808. Bob
  809.  
  810. 7
  811. 2
  812. 82
  813. 283
  814. -1
  815. 58
  816. -1
  817. 77
  818. 2
  819. reset_password
  820. 2
  821. 89
  822. -2
  823. commentary
  824. 2
  825. 9
  826. -1
  827. 0
  828. 69
  829. 2
  830.  
  831. 2
  832. 5
  833. 2
  834. %n @newts %d (%[#d])
  835. 2
  836. 5
  837. 1
  838. -1
  839. 2
  840. 5
  841. 2
  842. %d is now a programmer.
  843. 2
  844. 5
  845. 2
  846. You are now a programmer.
  847. 2
  848. 5
  849. 2
  850. Have a nice life...
  851. 2
  852. 5
  853. 2
  854. %n @toads %d (%[#d])
  855. 2
  856. 5
  857. 1
  858. -1
  859. 2
  860. 4
  861. 4
  862. 0
  863. 38
  864. 1
  865. 0
  866. 0
  867. 2
  868. 5
  869. 0
  870. 0
  871. 2
  872. 5
  873. 2
  874.  
  875. 2
  876. 5
  877. 0
  878. 1
  879. 2
  880. 5
  881. 4
  882. 0
  883. 38
  884. 1
  885. 4
  886. 2
  887. 0
  888. 751897963
  889. 2
  890. LocalUser@LocalMachine.LocalZone
  891. 2
  892. 0
  893. 4
  894. 0
  895. 2
  896. 5
  897. 2
  898.  
  899. 2
  900. 0
  901. 0
  902. 751893926
  903. 2
  904. 1
  905. 0
  906. 0
  907. 2
  908. 5
  909. 2
  910. *** More ***  %n lines left.  Do @more [rest|flush] for more.
  911. 2
  912. 5
  913. 4
  914. 2
  915. 0
  916. 0
  917. 0
  918. 0
  919. 38
  920. 1
  921. 0
  922. 0
  923. 38
  924. 1
  925. 4
  926. 0
  927. 38
  928. 0
  929. 0
  930. 0
  931. 38
  932. 1
  933. 0
  934. 26458
  935. 2
  936. 5
  937. 4
  938. 181
  939. 1
  940. 82
  941. 1
  942. 80
  943. 1
  944. 81
  945. 1
  946. 88
  947. 1
  948. 87
  949. 1
  950. 89
  951. 1
  952. 90
  953. 1
  954. 91
  955. 1
  956. 93
  957. 1
  958. 92
  959. 1
  960. 94
  961. 1
  962. 95
  963. 1
  964. 96
  965. 1
  966. 97
  967. 1
  968. 98
  969. 1
  970. 99
  971. 1
  972. 100
  973. 1
  974. 102
  975. 1
  976. 101
  977. 1
  978. 103
  979. 1
  980. 104
  981. 1
  982. 105
  983. 1
  984. 106
  985. 1
  986. 107
  987. 1
  988. 108
  989. 1
  990. 109
  991. 1
  992. 110
  993. 1
  994. 111
  995. 1
  996. 112
  997. 1
  998. 113
  999. 1
  1000. 114
  1001. 1
  1002. 115
  1003. 1
  1004. 116
  1005. 1
  1006. 117
  1007. 1
  1008. 118
  1009. 1
  1010. 119
  1011. 1
  1012. 120
  1013. 1
  1014. 121
  1015. 1
  1016. 122
  1017. 1
  1018. 123
  1019. 1
  1020. 125
  1021. 1
  1022. 126
  1023. 1
  1024. 127
  1025. 1
  1026. 128
  1027. 1
  1028. 129
  1029. 1
  1030. 131
  1031. 1
  1032. 132
  1033. 1
  1034. 133
  1035. 1
  1036. 134
  1037. 1
  1038. 135
  1039. 1
  1040. 136
  1041. 1
  1042. 137
  1043. 1
  1044. 138
  1045. 1
  1046. 139
  1047. 1
  1048. 140
  1049. 1
  1050. 141
  1051. 1
  1052. 142
  1053. 1
  1054. 143
  1055. 1
  1056. 148
  1057. 1
  1058. 149
  1059. 1
  1060. 150
  1061. 1
  1062. 151
  1063. 1
  1064. 152
  1065. 1
  1066. 153
  1067. 1
  1068. 156
  1069. 1
  1070. 146
  1071. 1
  1072. 78
  1073. 1
  1074. 158
  1075. 1
  1076. 159
  1077. 1
  1078. 160
  1079. 1
  1080. 161
  1081. 1
  1082. 162
  1083. 1
  1084. 163
  1085. 1
  1086. 165
  1087. 1
  1088. 164
  1089. 1
  1090. 168
  1091. 1
  1092. 169
  1093. 1
  1094. 170
  1095. 1
  1096. 171
  1097. 1
  1098. 172
  1099. 1
  1100. 175
  1101. 1
  1102. 176
  1103. 1
  1104. 177
  1105. 1
  1106. 178
  1107. 1
  1108. 179
  1109. 1
  1110. 180
  1111. 1
  1112. 181
  1113. 1
  1114. 182
  1115. 1
  1116. 183
  1117. 1
  1118. 184
  1119. 1
  1120. 185
  1121. 1
  1122. 186
  1123. 1
  1124. 187
  1125. 1
  1126. 188
  1127. 1
  1128. 189
  1129. 1
  1130. 190
  1131. 1
  1132. 191
  1133. 1
  1134. 192
  1135. 1
  1136. 193
  1137. 1
  1138. 194
  1139. 1
  1140. 195
  1141. 1
  1142. 196
  1143. 1
  1144. 197
  1145. 1
  1146. 198
  1147. 1
  1148. 199
  1149. 1
  1150. 200
  1151. 1
  1152. 201
  1153. 1
  1154. 202
  1155. 1
  1156. 203
  1157. 1
  1158. 204
  1159. 1
  1160. 205
  1161. 1
  1162. 206
  1163. 1
  1164. 207
  1165. 1
  1166. 208
  1167. 1
  1168. 209
  1169. 1
  1170. 210
  1171. 1
  1172. 211
  1173. 1
  1174. 212
  1175. 1
  1176. 213
  1177. 1
  1178. 214
  1179. 1
  1180. 215
  1181. 1
  1182. 216
  1183. 1
  1184. 217
  1185. 1
  1186. 218
  1187. 1
  1188. 219
  1189. 1
  1190. 220
  1191. 1
  1192. 221
  1193. 1
  1194. 222
  1195. 1
  1196. 223
  1197. 1
  1198. 224
  1199. 1
  1200. 225
  1201. 1
  1202. 145
  1203. 1
  1204. 144
  1205. 1
  1206. 226
  1207. 1
  1208. 227
  1209. 1
  1210. 229
  1211. 1
  1212. 230
  1213. 1
  1214. 173
  1215. 1
  1216. 269
  1217. 1
  1218. 291
  1219. 1
  1220. 292
  1221. 1
  1222. 293
  1223. 1
  1224. 294
  1225. 1
  1226. 295
  1227. 1
  1228. 296
  1229. 1
  1230. 297
  1231. 1
  1232. 298
  1233. 1
  1234. 301
  1235. 1
  1236. 302
  1237. 1
  1238. 303
  1239. 1
  1240. 304
  1241. 1
  1242. 305
  1243. 1
  1244. 306
  1245. 1
  1246. 308
  1247. 1
  1248. 309
  1249. 1
  1250. 310
  1251. 1
  1252. 311
  1253. 1
  1254. 312
  1255. 1
  1256. 313
  1257. 1
  1258. 314
  1259. 1
  1260. 315
  1261. 1
  1262. 316
  1263. 1
  1264. 317
  1265. 1
  1266. 318
  1267. 1
  1268. 319
  1269. 1
  1270. 324
  1271. 1
  1272. 326
  1273. 1
  1274. 333
  1275. 1
  1276. 342
  1277. 1
  1278. 343
  1279. 1
  1280. 328
  1281. 1
  1282. 352
  1283. 1
  1284. 353
  1285. 1
  1286. 423
  1287. 1
  1288. 424
  1289. 1
  1290. 426
  1291. 1
  1292. 427
  1293. 1
  1294. 428
  1295. 1
  1296. 429
  1297. 1
  1298. 430
  1299. 1
  1300. 431
  1301. 2
  1302. 1
  1303. 0
  1304. -70
  1305. 38
  1306. 1
  1307. 1
  1308. 2
  1309. 2
  1310. 4
  1311. 4
  1312. 12
  1313. 2
  1314. LocalUser@LocalMachine.LocalZone
  1315. 2
  1316. foobar@apple.com
  1317. 2
  1318. Bob_Monsen@Sartre.Orion
  1319. 2
  1320. Bob_Monsen@Hawksbill_Station.E.T._Phone_Home
  1321. 2
  1322. bob_monsen@Dalmation.Orion
  1323. 2
  1324. @Hawksbill_Station.E.T._Phone_Home
  1325. 2
  1326. Bob_Monsen@.E.T._Phone_Home
  1327. 2
  1328. s_Macintosh.E.T._Phone_Home
  1329. 2
  1330. @Kant.Orion
  1331. 2
  1332. Bob_Monsen@Kant.Orion
  1333. 2
  1334. Home'
  1335. 2
  1336. 'Orion'
  1337. 2
  1338. 0
  1339. 2
  1340. LocalUser@LocalMachine.LocalZone
  1341. 2
  1342. 0
  1343. 4
  1344. 0
  1345. 2
  1346. 5
  1347. 4
  1348. 0
  1349. 2
  1350. 4
  1351. 0
  1352. 0
  1353. 2
  1354. 5
  1355. 4
  1356. 11
  1357. 4
  1358. 2
  1359. 4
  1360. 5
  1361. 4
  1362. 5
  1363. 1
  1364. 180
  1365. 2
  1366. announce_all
  1367. 1
  1368. 2
  1369. 1
  1370. 3
  1371. 1
  1372. 2
  1373. 4
  1374. 5
  1375. 1
  1376. -1
  1377. 2
  1378.  
  1379. 1
  1380. 2
  1381. 1
  1382. -1
  1383. 1
  1384. 2
  1385. 4
  1386. 5
  1387. 1
  1388. 2
  1389. 2
  1390. eval_cmd_string
  1391. 1
  1392. 2
  1393. 1
  1394. 59
  1395. 1
  1396. 2
  1397. 4
  1398. 5
  1399. 1
  1400. 2
  1401. 2
  1402. eval
  1403. 1
  1404. 2
  1405. 1
  1406. 59
  1407. 1
  1408. 2
  1409. 4
  1410. 3
  1411. 1
  1412. 2
  1413. 2
  1414. <cmd-line>
  1415. 1
  1416. 2
  1417. 4
  1418. 1
  1419. 2
  1420. The_Demolished_Man sighs
  1421. 4
  1422. 2
  1423. 4
  1424. 3
  1425. 4
  1426. 5
  1427. 1
  1428. 124
  1429. 2
  1430. announce
  1431. 1
  1432. 2
  1433. 1
  1434. 3
  1435. 1
  1436. 77
  1437. 4
  1438. 5
  1439. 1
  1440. 124
  1441. 2
  1442. say
  1443. 1
  1444. 2
  1445. 1
  1446. 3
  1447. 1
  1448. 77
  1449. 4
  1450. 3
  1451. 1
  1452. 77
  1453. 2
  1454. <cmd-line>
  1455. 1
  1456. 77
  1457. 4
  1458. 4
  1459. 2
  1460. The_Demolished_Man
  1461. 2
  1462.  says, "
  1463. 2
  1464. oh my god!
  1465. 2
  1466. "
  1467. 4
  1468. 2
  1469. 4
  1470. 3
  1471. 4
  1472. 5
  1473. 1
  1474. 124
  1475. 2
  1476. look_self
  1477. 1
  1478. 2
  1479. 1
  1480. 3
  1481. 1
  1482. 2
  1483. 4
  1484. 5
  1485. 1
  1486. 124
  1487. 2
  1488. l
  1489. 1
  1490. 2
  1491. 1
  1492. 3
  1493. 1
  1494. 2
  1495. 4
  1496. 3
  1497. 1
  1498. 2
  1499. 2
  1500. <cmd-line>
  1501. 1
  1502. 2
  1503. 4
  1504. 1
  1505. 2
  1506. JL's Cube
  1507. 4
  1508. 2
  1509. 4
  1510. 4
  1511. 4
  1512. 5
  1513. 1
  1514. 124
  1515. 2
  1516. look_self
  1517. 1
  1518. 2
  1519. 1
  1520. 1
  1521. 1
  1522. 2
  1523. 4
  1524. 5
  1525. 1
  1526. 124
  1527. 2
  1528. look_self
  1529. 1
  1530. 2
  1531. 1
  1532. 3
  1533. 1
  1534. 2
  1535. 4
  1536. 5
  1537. 1
  1538. 124
  1539. 2
  1540. l
  1541. 1
  1542. 2
  1543. 1
  1544. 3
  1545. 1
  1546. 2
  1547. 4
  1548. 3
  1549. 1
  1550. 2
  1551. 2
  1552. <cmd-line>
  1553. 1
  1554. 2
  1555. 4
  1556. 1
  1557. 2
  1558. You see nothing special.
  1559. 4
  1560. 2
  1561. 4
  1562. 4
  1563. 4
  1564. 5
  1565. 1
  1566. 124
  1567. 2
  1568. tell_contents
  1569. 1
  1570. 2
  1571. 1
  1572. 3
  1573. 1
  1574. 2
  1575. 4
  1576. 5
  1577. 1
  1578. 124
  1579. 2
  1580. look_self
  1581. 1
  1582. 2
  1583. 1
  1584. 3
  1585. 1
  1586. 2
  1587. 4
  1588. 5
  1589. 1
  1590. 124
  1591. 2
  1592. l
  1593. 1
  1594. 2
  1595. 1
  1596. 3
  1597. 1
  1598. 2
  1599. 4
  1600. 3
  1601. 1
  1602. 2
  1603. 2
  1604. <cmd-line>
  1605. 1
  1606. 2
  1607. 4
  1608. 3
  1609. 2
  1610. You see 
  1611. 2
  1612. stinking dog turd
  1613. 2
  1614.  here.
  1615. 4
  1616. 2
  1617. 4
  1618. 4
  1619. 4
  1620. 5
  1621. 1
  1622. 124
  1623. 2
  1624. tell_contents
  1625. 1
  1626. 2
  1627. 1
  1628. 3
  1629. 1
  1630. 2
  1631. 4
  1632. 5
  1633. 1
  1634. 124
  1635. 2
  1636. look_self
  1637. 1
  1638. 2
  1639. 1
  1640. 3
  1641. 1
  1642. 2
  1643. 4
  1644. 5
  1645. 1
  1646. 124
  1647. 2
  1648. l
  1649. 1
  1650. 2
  1651. 1
  1652. 3
  1653. 1
  1654. 2
  1655. 4
  1656. 3
  1657. 1
  1658. 2
  1659. 2
  1660. <cmd-line>
  1661. 1
  1662. 2
  1663. 4
  1664. 3
  1665. 2
  1666. LiverSpot, The_Demolished_Man, and Guest
  1667. 2
  1668.  are
  1669. 2
  1670.  here.
  1671. 4
  1672. 2
  1673. 4
  1674. 2
  1675. 4
  1676. 5
  1677. 1
  1678. 124
  1679. 2
  1680. say
  1681. 1
  1682. 2
  1683. 1
  1684. 3
  1685. 1
  1686. 2
  1687. 4
  1688. 3
  1689. 1
  1690. 2
  1691. 2
  1692. <cmd-line>
  1693. 1
  1694. 2
  1695. 4
  1696. 3
  1697. 2
  1698. You say, "
  1699. 2
  1700. say something
  1701. 2
  1702. "
  1703. 4
  1704. 2
  1705. 4
  1706. 3
  1707. 4
  1708. 5
  1709. 1
  1710. 124
  1711. 2
  1712. announce
  1713. 1
  1714. 2
  1715. 1
  1716. 3
  1717. 1
  1718. 77
  1719. 4
  1720. 5
  1721. 1
  1722. 124
  1723. 2
  1724. say
  1725. 1
  1726. 2
  1727. 1
  1728. 3
  1729. 1
  1730. 77
  1731. 4
  1732. 3
  1733. 1
  1734. 77
  1735. 2
  1736. <cmd-line>
  1737. 1
  1738. 77
  1739. 4
  1740. 4
  1741. 2
  1742. The_Demolished_Man
  1743. 2
  1744.  says, "
  1745. 2
  1746. yah i get complete tracebacks -- amazing
  1747. 2
  1748. "
  1749. 4
  1750. 2
  1751. 4
  1752. 2
  1753. 4
  1754. 5
  1755. 1
  1756. 124
  1757. 2
  1758. say
  1759. 1
  1760. 2
  1761. 1
  1762. 3
  1763. 1
  1764. 2
  1765. 4
  1766. 3
  1767. 1
  1768. 2
  1769. 2
  1770. <cmd-line>
  1771. 1
  1772. 2
  1773. 4
  1774. 3
  1775. 2
  1776. You say, "
  1777. 2
  1778. I'm playing with it
  1779. 2
  1780. "
  1781. 4
  1782. 2
  1783. 4
  1784. 3
  1785. 4
  1786. 5
  1787. 1
  1788. 124
  1789. 2
  1790. announce
  1791. 1
  1792. 2
  1793. 1
  1794. 3
  1795. 1
  1796. 77
  1797. 4
  1798. 5
  1799. 1
  1800. 331
  1801. 2
  1802. take
  1803. 1
  1804. 77
  1805. 1
  1806. 5
  1807. 1
  1808. 77
  1809. 4
  1810. 3
  1811. 1
  1812. 77
  1813. 2
  1814. <cmd-line>
  1815. 1
  1816. 77
  1817. 4
  1818. 3
  1819. 2
  1820. The_Demolished_Man
  1821. 2
  1822.  
  1823. 2
  1824. picks up stinking dog turd.
  1825. 4
  1826. 2
  1827. 4
  1828. 3
  1829. 4
  1830. 5
  1831. 1
  1832. 124
  1833. 2
  1834. announce
  1835. 1
  1836. 2
  1837. 1
  1838. 3
  1839. 1
  1840. 77
  1841. 4
  1842. 5
  1843. 1
  1844. 331
  1845. 2
  1846. drop
  1847. 1
  1848. 77
  1849. 1
  1850. 5
  1851. 1
  1852. 77
  1853. 4
  1854. 3
  1855. 1
  1856. 77
  1857. 2
  1858. <cmd-line>
  1859. 1
  1860. 77
  1861. 4
  1862. 3
  1863. 2
  1864. The_Demolished_Man
  1865. 2
  1866.  
  1867. 2
  1868. drops stinking dog turd.
  1869. 2
  1870. 4
  1871. 0
  1872. 0
  1873. 2
  1874. 4
  1875. 2
  1876. %N is not currently logged in.
  1877. 2
  1878. 5
  1879. 2
  1880. his
  1881. 2
  1882. 5
  1883. 2
  1884. His
  1885. 2
  1886. 5
  1887. 2
  1888. You sense that %n is looking for you in %l.
  1889. 2
  1890. 5
  1891. 2
  1892. Your message has been sent.
  1893. 2
  1894. 5
  1895. 4
  1896. 0
  1897. 2
  1898. 5
  1899. 4
  1900. 0
  1901. 2
  1902. 5
  1903. 4
  1904. 0
  1905. 2
  1906. 5
  1907. 4
  1908. 0
  1909. 2
  1910. 5
  1911. 4
  1912. 2
  1913. 0
  1914. 5
  1915. 0
  1916. 750695372
  1917. 2
  1918. 4
  1919. 4
  1920. 0
  1921. 2
  1922. 4
  1923. 0
  1924. 751898049
  1925. 2
  1926. 1
  1927. 0
  1928. 59
  1929. 2
  1930. 0
  1931. 2
  1932. male
  1933. 2
  1934. 5
  1935. 2
  1936. Himself
  1937. 2
  1938. 5
  1939. 2
  1940. His
  1941. 2
  1942. 5
  1943. 2
  1944. Him
  1945. 2
  1946. 5
  1947. 2
  1948. He
  1949. 2
  1950. 5
  1951. 2
  1952. himself
  1953. 2
  1954. 5
  1955. 2
  1956. his
  1957. 2
  1958. 5
  1959. 2
  1960. him
  1961. 2
  1962. 5
  1963. 2
  1964. he
  1965. 2
  1966. 5
  1967. 1
  1968. 82
  1969. 2
  1970. 5
  1971. 0
  1972. 0
  1973. 2
  1974. 0
  1975. 4
  1976. 0
  1977. 2
  1978. 5
  1979. 0
  1980. 0
  1981. 2
  1982. 5
  1983. 4
  1984. 0
  1985. 2
  1986. 5
  1987. 4
  1988. 0
  1989. 2
  1990. 5
  1991. 4
  1992. 0
  1993. 2
  1994. 5
  1995. 0
  1996. -1465214118
  1997. 2
  1998. 1
  1999. 0
  2000. 0
  2001. 2
  2002. 4
  2003. 4
  2004. 1
  2005. 2
  2006. Bob
  2007. 2
  2008. 1
  2009. 2
  2010. The_Demolished_Man's Evil Twin
  2011. 2
  2012. 5
  2013. 4
  2014. 2
  2015. 0
  2016. 74432
  2017. 0
  2018. 743619811
  2019. 2
  2020. 1
  2021. #3
  2022. generic room
  2023.  
  2024. 152
  2025. 2
  2026. -1
  2027. -1
  2028. -1
  2029. 1
  2030. 51
  2031. 0
  2032. 42
  2033. confunc
  2034. 2
  2035. 173
  2036. -1
  2037. disfunc
  2038. 2
  2039. 173
  2040. -1
  2041. say
  2042. 2
  2043. 85
  2044. -2
  2045. emote
  2046. 2
  2047. 93
  2048. -2
  2049. announce
  2050. 2
  2051. 173
  2052. -1
  2053. match_exit
  2054. 2
  2055. 173
  2056. -1
  2057. add_exit
  2058. 2
  2059. 165
  2060. -1
  2061. tell_contents
  2062. 2
  2063. 173
  2064. -1
  2065. @exits
  2066. 2
  2067. 5
  2068. -1
  2069. look_self
  2070. 2
  2071. 173
  2072. -1
  2073. accept
  2074. 2
  2075. 173
  2076. -1
  2077. add_entrance
  2078. 2
  2079. 165
  2080. -1
  2081. bless_for_entry
  2082. 2
  2083. 173
  2084. -1
  2085. @entrances
  2086. 2
  2087. 1
  2088. -1
  2089. go
  2090. 2
  2091. 29
  2092. -1
  2093. l*ook
  2094. 2
  2095. 93
  2096. -2
  2097. announce_all
  2098. 2
  2099. 173
  2100. -1
  2101. announce_all_but
  2102. 2
  2103. 173
  2104. -1
  2105. enterfunc
  2106. 2
  2107. 173
  2108. -1
  2109. exitfunc
  2110. 2
  2111. 173
  2112. -1
  2113. remove_exit
  2114. 2
  2115. 173
  2116. -1
  2117. remove_entrance
  2118. 2
  2119. 173
  2120. -1
  2121. @add-exit
  2122. 2
  2123. 17
  2124. -1
  2125. @add-entrance
  2126. 2
  2127. 17
  2128. -1
  2129. recycle
  2130. 2
  2131. 165
  2132. -1
  2133. e east w west s south n north ne northeast nw northwest se southeast sw southwest u up d down
  2134. 2
  2135. 13
  2136. -1
  2137. @eject
  2138. 2
  2139. 25
  2140. -1
  2141. ejection_msg oejection_msg victim_ejection_msg
  2142. 38
  2143. 173
  2144. -1
  2145. accept_for_abode
  2146. 2
  2147. 173
  2148. -1
  2149. @resident*s
  2150. 2
  2151. 25
  2152. -1
  2153. match
  2154. 2
  2155. 173
  2156. -1
  2157. @remove-exit
  2158. 2
  2159. 25
  2160. -1
  2161. @remove-entrance
  2162. 2
  2163. 25
  2164. -1
  2165. moveto
  2166. 2
  2167. 173
  2168. -1
  2169. who_location_msg
  2170. 2
  2171. 173
  2172. -1
  2173. exits
  2174. 2
  2175. 173
  2176. -1
  2177. obvious_exits
  2178. 2
  2179. 165
  2180. -1
  2181. here_huh
  2182. 2
  2183. 173
  2184. -1
  2185. room_announce*_all_but
  2186. 2
  2187. 173
  2188. -1
  2189. examine_commands_ok
  2190. 2
  2191. 173
  2192. -1
  2193. examine_key
  2194. 2
  2195. 173
  2196. -1
  2197. examine_contents
  2198. 2
  2199. 165
  2200. -1
  2201. 13
  2202. who_location_msg
  2203. free_home
  2204. victim_ejection_msg
  2205. ejection_msg
  2206. oejection_msg
  2207. residents
  2208. free_entry
  2209. entrances
  2210. blessed_object
  2211. blessed_task
  2212. exits
  2213. dark
  2214. ctype
  2215. 17
  2216. 2
  2217. %T
  2218. 2
  2219. 5
  2220. 0
  2221. 0
  2222. 2
  2223. 5
  2224. 2
  2225. You have been expelled from %i by %n.
  2226. 2
  2227. 5
  2228. 2
  2229. You expel %d from %i.
  2230. 2
  2231. 5
  2232. 2
  2233. %D is unceremoniously expelled from %i by %n.
  2234. 2
  2235. 5
  2236. 4
  2237. 0
  2238. 2
  2239. 5
  2240. 0
  2241. 1
  2242. 2
  2243. 5
  2244. 4
  2245. 0
  2246. 2
  2247. 4
  2248. 1
  2249. -1
  2250. 2
  2251. 5
  2252. 0
  2253. 0
  2254. 2
  2255. 5
  2256. 4
  2257. 0
  2258. 2
  2259. 4
  2260. 0
  2261. 0
  2262. 2
  2263. 5
  2264. 0
  2265. 3
  2266. 2
  2267. 5
  2268. 5
  2269. 2
  2270. 4
  2271. 4
  2272. 1
  2273. 2
  2274. generic room
  2275. 2
  2276. 5
  2277. 5
  2278. 2
  2279. 5
  2280. 4
  2281. 2
  2282. 0
  2283. 23317
  2284. 0
  2285. 743618922
  2286. 2
  2287. 1
  2288. #4
  2289. generic builder
  2290.  
  2291. 144
  2292. 2
  2293. -1
  2294. -1
  2295. -1
  2296. 6
  2297. 59
  2298. -1
  2299. 32
  2300. @quota
  2301. 2
  2302. 17
  2303. -1
  2304. @create
  2305. 2
  2306. 81
  2307. -2
  2308. @recycle
  2309. 2
  2310. 17
  2311. -1
  2312. @recreate
  2313. 2
  2314. 89
  2315. 13
  2316. @dig
  2317. 2
  2318. 81
  2319. -2
  2320. @audit
  2321. 2
  2322. 89
  2323. -2
  2324. @auditDB
  2325. 2
  2326. 89
  2327. -2
  2328. @count
  2329. 2
  2330. 25
  2331. -1
  2332. @countDB
  2333. 2
  2334. 25
  2335. -1
  2336. @sort-owned*-objects
  2337. 2
  2338. 9
  2339. -1
  2340. @add-owned
  2341. 2
  2342. 25
  2343. -1
  2344. @verify-owned
  2345. 2
  2346. 9
  2347. -1
  2348. @unlock
  2349. 2
  2350. 17
  2351. -1
  2352. @lock
  2353. 2
  2354. 89
  2355. 0
  2356. @newmess*age
  2357. 2
  2358. 81
  2359. -2
  2360. @unmess*age
  2361. 2
  2362. 81
  2363. -2
  2364. _messagify
  2365. 2
  2366. 173
  2367. -1
  2368. @kids
  2369. 2
  2370. 29
  2371. -1
  2372. @contents
  2373. 2
  2374. 25
  2375. -1
  2376. @par*ents
  2377. 2
  2378. 25
  2379. -1
  2380. @location*s
  2381. 2
  2382. 25
  2383. -1
  2384. @realm
  2385. 2
  2386. 93
  2387. -2
  2388. realm2
  2389. 2
  2390. 173
  2391. -1
  2392. @cl*asses
  2393. 2
  2394. 89
  2395. -2
  2396. classes_2
  2397. 2
  2398. 173
  2399. -1
  2400. _create
  2401. 2
  2402. 173
  2403. -1
  2404. _recycle
  2405. 2
  2406. 173
  2407. -1
  2408. @chparent
  2409. 2
  2410. 81
  2411. 1
  2412. @check-chp*arent
  2413. 2
  2414. 89
  2415. 1
  2416. @set*prop
  2417. 2
  2418. 89
  2419. 1
  2420. object_audit_string
  2421. 2
  2422. 173
  2423. -1
  2424. audit_object_category
  2425. 2
  2426. 173
  2427. -1
  2428. 1
  2429. recreate_enabled
  2430. 57
  2431. 0
  2432. 1
  2433. 2
  2434. 5
  2435. 5
  2436. 38
  2437. 1
  2438. 5
  2439. 2
  2440. 0
  2441. 5
  2442. 2
  2443. 5
  2444. 5
  2445. 2
  2446. 0
  2447. 5
  2448. 2
  2449. 1
  2450. 0
  2451. 0
  2452. 2
  2453. 5
  2454. 5
  2455. 2
  2456. 5
  2457. 5
  2458. 38
  2459. 1
  2460. 5
  2461. 38
  2462. 1
  2463. 5
  2464. 38
  2465. 0
  2466. 5
  2467. 38
  2468. 1
  2469. 5
  2470. 2
  2471. 5
  2472. 5
  2473. 2
  2474. 1
  2475. 5
  2476. 38
  2477. 1
  2478. 5
  2479. 2
  2480. 4
  2481. 5
  2482. 2
  2483. 0
  2484. 5
  2485. 2
  2486. 0
  2487. 5
  2488. 2
  2489. 5
  2490. 5
  2491. 2
  2492. 4
  2493. 5
  2494. 2
  2495. 5
  2496. 5
  2497. 2
  2498. 4
  2499. 5
  2500. 2
  2501. 4
  2502. 5
  2503. 2
  2504. 5
  2505. 5
  2506. 2
  2507. 5
  2508. 5
  2509. 2
  2510. 5
  2511. 5
  2512. 2
  2513. 5
  2514. 5
  2515. 2
  2516. 5
  2517. 5
  2518. 2
  2519. 5
  2520. 5
  2521. 2
  2522. 5
  2523. 5
  2524. 2
  2525. 5
  2526. 5
  2527. 2
  2528. 5
  2529. 5
  2530. 2
  2531. 4
  2532. 5
  2533. 2
  2534. 4
  2535. 5
  2536. 2
  2537. 1
  2538. 0
  2539. 7
  2540. 2
  2541. 0
  2542. 5
  2543. 2
  2544. 5
  2545. 5
  2546. 2
  2547. 5
  2548. 5
  2549. 2
  2550. 5
  2551. 5
  2552. 2
  2553. 5
  2554. 5
  2555. 2
  2556. 5
  2557. 5
  2558. 2
  2559. 5
  2560. 5
  2561. 2
  2562. 5
  2563. 5
  2564. 2
  2565. 5
  2566. 5
  2567. 2
  2568. 5
  2569. 1
  2570. 11
  2571. 2
  2572. 5
  2573. 5
  2574. 2
  2575. 0
  2576. 5
  2577. 2
  2578. 5
  2579. 5
  2580. 2
  2581. 5
  2582. 5
  2583. 2
  2584. 5
  2585. 5
  2586. 2
  2587. 5
  2588. 5
  2589. 2
  2590. 5
  2591. 5
  2592. 2
  2593. 1
  2594. 5
  2595. 2
  2596. 4
  2597. 4
  2598. 1
  2599. 2
  2600. generic builder
  2601. 2
  2602. 1
  2603. 2
  2604. You see a player who should type '@describe me as ...'.
  2605. 2
  2606. 5
  2607. 4
  2608. 2
  2609. 0
  2610. 39745
  2611. 0
  2612. 743584326
  2613. 2
  2614. 1
  2615. #5
  2616. generic thing
  2617.  
  2618. 152
  2619. 2
  2620. -1
  2621. -1
  2622. -1
  2623. 1
  2624. 8
  2625. 6
  2626. 6
  2627. g*et t*ake
  2628. 2
  2629. 45
  2630. -1
  2631. d*rop th*row
  2632. 2
  2633. 45
  2634. -1
  2635. moveto
  2636. 2
  2637. 173
  2638. -1
  2639. take_failed_msg take_succeeded_msg otake_failed_msg otake_succeeded_msg drop_failed_msg drop_succeeded_msg odrop_failed_msg odrop_succeeded_msg
  2640. 2
  2641. 173
  2642. -1
  2643. gi*ve ha*nd
  2644. 2
  2645. 109
  2646. 1
  2647. examine_key
  2648. 2
  2649. 173
  2650. -1
  2651. 8
  2652. drop_failed_msg
  2653. drop_succeeded_msg
  2654. odrop_failed_msg
  2655. odrop_succeeded_msg
  2656. otake_succeeded_msg
  2657. otake_failed_msg
  2658. take_succeeded_msg
  2659. take_failed_msg
  2660. 12
  2661. 2
  2662. You can't seem to drop %t here.
  2663. 2
  2664. 5
  2665. 2
  2666. You drop %t.
  2667. 2
  2668. 5
  2669. 2
  2670. tries to drop %t but fails!
  2671. 2
  2672. 5
  2673. 2
  2674. drops %t.
  2675. 2
  2676. 5
  2677. 2
  2678. picks up %t.
  2679. 2
  2680. 5
  2681. 2
  2682.  
  2683. 2
  2684. 5
  2685. 2
  2686. You take %t.
  2687. 2
  2688. 5
  2689. 2
  2690. You can't pick that up.
  2691. 2
  2692. 5
  2693. 5
  2694. 2
  2695. 4
  2696. 4
  2697. 1
  2698. 2
  2699. generic thing
  2700. 2
  2701. 5
  2702. 5
  2703. 2
  2704. 5
  2705. 4
  2706. 2
  2707. 0
  2708. 4365
  2709. 0
  2710. 743618923
  2711. 2
  2712. 1
  2713. #6
  2714. generic player
  2715.  
  2716. 152
  2717. 2
  2718. -1
  2719. -1
  2720. -1
  2721. 1
  2722. 40
  2723. 7
  2724. 134
  2725. init_for_core
  2726. 2
  2727. 173
  2728. -1
  2729. confunc
  2730. 2
  2731. 173
  2732. -1
  2733. disfunc
  2734. 2
  2735. 173
  2736. -1
  2737. initialize
  2738. 2
  2739. 173
  2740. -1
  2741. recycle
  2742. 2
  2743. 173
  2744. -1
  2745. accept
  2746. 2
  2747. 173
  2748. -1
  2749. my_huh
  2750. 2
  2751. 165
  2752. -1
  2753. last_huh
  2754. 2
  2755. 173
  2756. -1
  2757. my_match_object
  2758. 2
  2759. 173
  2760. -1
  2761. tell_contents
  2762. 2
  2763. 173
  2764. -1
  2765. titlec
  2766. 2
  2767. 173
  2768. -1
  2769. notify
  2770. 2
  2771. 173
  2772. -1
  2773. notify_lines
  2774. 2
  2775. 173
  2776. -1
  2777. linesplit
  2778. 2
  2779. 173
  2780. -1
  2781. linelen
  2782. 38
  2783. 173
  2784. -1
  2785. @more
  2786. 2
  2787. 25
  2788. -1
  2789. @wrap
  2790. 38
  2791. 1
  2792. -2
  2793. @linelen*gth
  2794. 38
  2795. 17
  2796. -1
  2797. @pagelen*gth
  2798. 2
  2799. 17
  2800. -1
  2801. tell
  2802. 2
  2803. 173
  2804. -1
  2805. gag_p
  2806. 2
  2807. 173
  2808. -1
  2809. set_gaglist
  2810. 2
  2811. 173
  2812. -1
  2813. @gag
  2814. 2
  2815. 89
  2816. -2
  2817. @listgag @gaglist
  2818. 2
  2819. 5
  2820. -1
  2821. @ungag
  2822. 2
  2823. 29
  2824. -1
  2825. whodunnit
  2826. 2
  2827. 173
  2828. -1
  2829. @ch*eck-full
  2830. 2
  2831. 89
  2832. -2
  2833. @paranoid
  2834. 2
  2835. 89
  2836. -2
  2837. @sw*eep
  2838. 2
  2839. 9
  2840. -1
  2841. wh*isper
  2842. 2
  2843. 157
  2844. 1
  2845. page
  2846. 2
  2847. 93
  2848. -2
  2849. receive_page
  2850. 2
  2851. 173
  2852. -1
  2853. page_origin_msg page_echo_msg page_absent_msg
  2854. 38
  2855. 165
  2856. -1
  2857. i inv*entory
  2858. 2
  2859. 9
  2860. -1
  2861. look_self
  2862. 2
  2863. 173
  2864. -1
  2865. home
  2866. 2
  2867. 9
  2868. -1
  2869. @sethome
  2870. 2
  2871. 9
  2872. -1
  2873. g*et take
  2874. 2
  2875. 45
  2876. -1
  2877. @move
  2878. 2
  2879. 93
  2880. 1
  2881. @eject
  2882. 2
  2883. 89
  2884. 5
  2885. where*is @where*is
  2886. 2
  2887. 93
  2888. -2
  2889. @who
  2890. 2
  2891. 85
  2892. -2
  2893. @wizards
  2894. 2
  2895. 29
  2896. -1
  2897. ?* help info*rmation @help
  2898. 2
  2899. 85
  2900. -2
  2901. news
  2902. 2
  2903. 13
  2904. -1
  2905. mail_forward mail_notify
  2906. 2
  2907. 173
  2908. -1
  2909. receive_message
  2910. 2
  2911. 173
  2912. -1
  2913. display_message
  2914. 2
  2915. 173
  2916. -1
  2917. parse_message_seq from_msg_seq %from_msg_seq to_msg_seq %to_msg_seq subject_msg_seq body_msg_seq display_seq_headers display_seq_full messages_in_seq list_rmm new_message_num length_num_le length_date_le length_date_gt length_all_msgs exists_num_eq rm_message_seq undo_rmm expunge_rmm renumber
  2918. 2
  2919. 173
  2920. -1
  2921. msg_summary_line
  2922. 38
  2923. 173
  2924. -1
  2925. msg_text
  2926. 2
  2927. 173
  2928. -1
  2929. notify_mail
  2930. 2
  2931. 173
  2932. -1
  2933. __fix
  2934. 2
  2935. 173
  2936. -1
  2937. current_message
  2938. 2
  2939. 173
  2940. -1
  2941. get_current_message
  2942. 2
  2943. 173
  2944. -1
  2945. set_current_message
  2946. 2
  2947. 173
  2948. -1
  2949. make_current_message
  2950. 2
  2951. 173
  2952. -1
  2953. kill_current_message
  2954. 2
  2955. 173
  2956. -1
  2957. current_folder
  2958. 2
  2959. 173
  2960. -1
  2961. set_current_folder
  2962. 2
  2963. 173
  2964. -1
  2965. parse_folder_spec
  2966. 2
  2967. 173
  2968. -1
  2969. parse_mailread_cmd
  2970. 2
  2971. 173
  2972. -1
  2973. @mail
  2974. 2
  2975. 85
  2976. -2
  2977. @read @peek
  2978. 2
  2979. 93
  2980. -2
  2981. @next @prev
  2982. 2
  2983. 89
  2984. -2
  2985. @rmm*ail
  2986. 2
  2987. 89
  2988. -2
  2989. @renumber
  2990. 2
  2991. 25
  2992. -1
  2993. @unrmm*ail
  2994. 2
  2995. 89
  2996. -2
  2997. @send
  2998. 2
  2999. 93
  3000. -2
  3001. @answer @repl*y
  3002. 2
  3003. 89
  3004. -2
  3005. @forward
  3006. 2
  3007. 93
  3008. -2
  3009. @gripe
  3010. 2
  3011. 89
  3012. -2
  3013. @typo @bug @suggest*ion @idea @comment
  3014. 2
  3015. 89
  3016. -2
  3017. @skip
  3018. 2
  3019. 89
  3020. -2
  3021. @subscribe @unsubscribed
  3022. 2
  3023. 25
  3024. -1
  3025. mail_catch_up
  3026. 2
  3027. 173
  3028. -1
  3029. @rn check_mail_lists @subscribed
  3030. 2
  3031. 5
  3032. -1
  3033. mail_option
  3034. 2
  3035. 173
  3036. -1
  3037. display_option
  3038. 2
  3039. 173
  3040. -1
  3041. edit_option
  3042. 2
  3043. 173
  3044. -1
  3045. list_option
  3046. 2
  3047. 173
  3048. -1
  3049. set_mail_option set_edit_option set_list_option set_display_option
  3050. 2
  3051. 173
  3052. -1
  3053. @mailo*ptions @mail-o*ptions @edito*ptions @edit-o*ptions @displayo*ptions @display-o*ptions
  3054. 2
  3055. 89
  3056. -2
  3057. set_name
  3058. 2
  3059. 173
  3060. -1
  3061. set_aliases
  3062. 2
  3063. 173
  3064. -1
  3065. @rename
  3066. 2
  3067. 81
  3068. 1
  3069. @addalias
  3070. 2
  3071. 81
  3072. 1
  3073. @rmalias
  3074. 2
  3075. 81
  3076. 5
  3077. @desc*ribe
  3078. 2
  3079. 89
  3080. 13
  3081. @mess*ages
  3082. 2
  3083. 17
  3084. -1
  3085. @notedit
  3086. 38
  3087. 25
  3088. -1
  3089. @password
  3090. 2
  3091. 89
  3092. -2
  3093. @last-c*onnection
  3094. 2
  3095. 29
  3096. -1
  3097. set_gender
  3098. 2
  3099. 173
  3100. -1
  3101. @gender
  3102. 2
  3103. 25
  3104. -1
  3105. set_brief
  3106. 2
  3107. 173
  3108. -1
  3109. @mode
  3110. 2
  3111. 81
  3112. -2
  3113. @exam*ine
  3114. 2
  3115. 29
  3116. -1
  3117. exam*ine
  3118. 2
  3119. 25
  3120. -1
  3121. add_feature
  3122. 38
  3123. 165
  3124. -1
  3125. remove_feature
  3126. 38
  3127. 165
  3128. -1
  3129. @add-feature @addfeature
  3130. 2
  3131. 25
  3132. -1
  3133. @remove-feature @rmfeature
  3134. 2
  3135. 25
  3136. -1
  3137. @features
  3138. 2
  3139. 85
  3140. 11
  3141. @features
  3142. 2
  3143. 17
  3144. -1
  3145. @memory
  3146. 38
  3147. 9
  3148. -1
  3149. @version
  3150. 38
  3151. 9
  3152. -1
  3153. @uptime
  3154. 38
  3155. 9
  3156. -1
  3157. @quit
  3158. 2
  3159. 9
  3160. -1
  3161. examine_commands_ok
  3162. 2
  3163. 173
  3164. -1
  3165. is_listening
  3166. 2
  3167. 165
  3168. -1
  3169. moveto
  3170. 2
  3171. 173
  3172. -1
  3173. announce*_all_but
  3174. 2
  3175. 165
  3176. -1
  3177. linewrap
  3178. 38
  3179. 173
  3180. -1
  3181. @set-note-string @set-note-text
  3182. 2
  3183. 17
  3184. -1
  3185. verb_sub
  3186. 2
  3187. 165
  3188. -1
  3189. ownership_quota
  3190. 2
  3191. 173
  3192. -1
  3193. tell_lines
  3194. 2
  3195. 173
  3196. -1
  3197. @lastlog
  3198. 2
  3199. 29
  3200. -1
  3201. set_linelength
  3202. 2
  3203. 173
  3204. -1
  3205. set_pagelength
  3206. 2
  3207. 165
  3208. -1
  3209. set_home
  3210. 2
  3211. 165
  3212. -1
  3213. @unsub*scribe
  3214. 2
  3215. 89
  3216. -2
  3217. @registerme
  3218. 2
  3219. 73
  3220. 13
  3221. ctime
  3222. 2
  3223. 173
  3224. -1
  3225. @join
  3226. 2
  3227. 25
  3228. -1
  3229. beep
  3230. 2
  3231. 45
  3232. -1
  3233. Yield
  3234. 147
  3235. 41
  3236. -1
  3237. StopAlert
  3238. 147
  3239. 105
  3240. 0
  3241. NoteAlert
  3242. 147
  3243. 105
  3244. 0
  3245. CautionAlert
  3246. 147
  3247. 105
  3248. 0
  3249. Alert
  3250. 147
  3251. 105
  3252. 0
  3253. Speak
  3254. 147
  3255. 153
  3256. 1
  3257. Whistle
  3258. 147
  3259. 41
  3260. -1
  3261. 52
  3262. features
  3263. previous_connection
  3264. mail_lists
  3265. email_address
  3266. last_disconnect_time
  3267. help
  3268. more_msg
  3269. linetask
  3270. linesleft
  3271. linebuffer
  3272. pagelen
  3273. _mail_task
  3274. owned_objects
  3275. linelen
  3276. current_folder
  3277. all_connect_places
  3278. last_connect_place
  3279. dict
  3280. messages_going
  3281. brief
  3282. responsible
  3283. lines
  3284. page_absent_msg
  3285. pq
  3286. pqc
  3287. page_origin_msg
  3288. page_echo_msg
  3289. mail_notify
  3290. mail_forward
  3291. edit_options
  3292. mail_options
  3293. current_message
  3294. messages
  3295. last_connect_time
  3296. ownership_quota
  3297. gender
  3298. prc
  3299. ppc
  3300. poc
  3301. psc
  3302. pr
  3303. pp
  3304. po
  3305. ps
  3306. home
  3307. password
  3308. gaglist
  3309. paranoid
  3310. display_options
  3311. list_options
  3312. verb_subs
  3313. first_connect_time
  3314. 56
  3315. 4
  3316. 0
  3317. 38
  3318. 1
  3319. 0
  3320. 0
  3321. 2
  3322. 0
  3323. 4
  3324. 0
  3325. 2
  3326. 5
  3327. 2
  3328.  
  3329. 2
  3330. 0
  3331. 0
  3332. 0
  3333. 2
  3334. 1
  3335. 0
  3336. 0
  3337. 2
  3338. 5
  3339. 2
  3340. *** More ***  %n lines left.  Do @more [rest|flush] for more.
  3341. 2
  3342. 5
  3343. 4
  3344. 2
  3345. 0
  3346. 0
  3347. 0
  3348. 0
  3349. 38
  3350. 1
  3351. 0
  3352. 0
  3353. 38
  3354. 1
  3355. 4
  3356. 0
  3357. 38
  3358. 0
  3359. 0
  3360. 0
  3361. 38
  3362. 1
  3363. 0
  3364. 0
  3365. 2
  3366. 5
  3367. 4
  3368. 0
  3369. 2
  3370. 1
  3371. 0
  3372. -79
  3373. 38
  3374. 1
  3375. 0
  3376. 1
  3377. 2
  3378. 4
  3379. 4
  3380. 0
  3381. 2
  3382. 0
  3383. 2
  3384. ?
  3385. 2
  3386. 0
  3387. 4
  3388. 0
  3389. 2
  3390. 5
  3391. 4
  3392. 0
  3393. 2
  3394. 4
  3395. 0
  3396. 0
  3397. 2
  3398. 5
  3399. 4
  3400. 0
  3401. 2
  3402. 4
  3403. 0
  3404. 10
  3405. 2
  3406. 4
  3407. 2
  3408. %N is not currently logged in.
  3409. 2
  3410. 5
  3411. 2
  3412. its
  3413. 2
  3414. 5
  3415. 2
  3416. Its
  3417. 2
  3418. 5
  3419. 2
  3420. You sense that %n is looking for you in %l.
  3421. 2
  3422. 5
  3423. 2
  3424. Your message has been sent.
  3425. 2
  3426. 5
  3427. 4
  3428. 0
  3429. 2
  3430. 5
  3431. 4
  3432. 0
  3433. 2
  3434. 5
  3435. 4
  3436. 0
  3437. 2
  3438. 5
  3439. 4
  3440. 0
  3441. 2
  3442. 5
  3443. 4
  3444. 2
  3445. 0
  3446. 0
  3447. 0
  3448. 0
  3449. 2
  3450. 4
  3451. 4
  3452. 0
  3453. 2
  3454. 4
  3455. 0
  3456. 0
  3457. 2
  3458. 1
  3459. 0
  3460. 0
  3461. 2
  3462. 0
  3463. 2
  3464. neuter
  3465. 2
  3466. 5
  3467. 2
  3468. Itself
  3469. 2
  3470. 5
  3471. 2
  3472. Its
  3473. 2
  3474. 5
  3475. 2
  3476. It
  3477. 2
  3478. 5
  3479. 2
  3480. It
  3481. 2
  3482. 5
  3483. 2
  3484. itself
  3485. 2
  3486. 5
  3487. 2
  3488. its
  3489. 2
  3490. 5
  3491. 2
  3492. it
  3493. 2
  3494. 5
  3495. 2
  3496. it
  3497. 2
  3498. 5
  3499. 1
  3500. 11
  3501. 2
  3502. 5
  3503. 2
  3504. impossible password to type
  3505. 2
  3506. 0
  3507. 4
  3508. 0
  3509. 2
  3510. 5
  3511. 0
  3512. 0
  3513. 2
  3514. 5
  3515. 4
  3516. 0
  3517. 2
  3518. 5
  3519. 4
  3520. 0
  3521. 2
  3522. 5
  3523. 4
  3524. 0
  3525. 2
  3526. 5
  3527. 0
  3528. 2147483647
  3529. 2
  3530. 1
  3531. 5
  3532. 2
  3533. 4
  3534. 4
  3535. 1
  3536. 2
  3537. generic player
  3538. 2
  3539. 1
  3540. 2
  3541. You see a player who should type '@describe me as ...'.
  3542. 2
  3543. 5
  3544. 4
  3545. 2
  3546. 0
  3547. 125266
  3548. 0
  3549. 743662679
  3550. 2
  3551. 1
  3552. #7
  3553. generic exit
  3554.  
  3555. 152
  3556. 2
  3557. -1
  3558. -1
  3559. -1
  3560. 1
  3561. 80
  3562. 52
  3563. 10
  3564. invoke
  3565. 2
  3566. 173
  3567. -1
  3568. move
  3569. 2
  3570. 173
  3571. -1
  3572. recycle
  3573. 2
  3574. 165
  3575. -1
  3576. leave_msg oleave_msg arrive_msg oarrive_msg nogo_msg onogo_msg
  3577. 2
  3578. 173
  3579. -1
  3580. set_name
  3581. 2
  3582. 173
  3583. -1
  3584. set_aliases
  3585. 2
  3586. 173
  3587. -1
  3588. announce_all_but
  3589. 2
  3590. 173
  3591. -1
  3592. defaulting_oleave_msg
  3593. 2
  3594. 173
  3595. -1
  3596. moveto
  3597. 2
  3598. 173
  3599. -1
  3600. examine_key
  3601. 2
  3602. 173
  3603. -1
  3604. 9
  3605. obvious
  3606. source
  3607. dest
  3608. nogo_msg
  3609. onogo_msg
  3610. arrive_msg
  3611. oarrive_msg
  3612. oleave_msg
  3613. leave_msg
  3614. 13
  3615. 0
  3616. 1
  3617. 2
  3618. 5
  3619. 1
  3620. -1
  3621. 2
  3622. 5
  3623. 1
  3624. -1
  3625. 2
  3626. 5
  3627. 0
  3628. 0
  3629. 2
  3630. 5
  3631. 0
  3632. 0
  3633. 2
  3634. 5
  3635. 0
  3636. 0
  3637. 2
  3638. 5
  3639. 0
  3640. 0
  3641. 2
  3642. 5
  3643. 0
  3644. 0
  3645. 2
  3646. 5
  3647. 0
  3648. 0
  3649. 2
  3650. 5
  3651. 5
  3652. 2
  3653. 4
  3654. 4
  3655. 1
  3656. 2
  3657. generic exit
  3658. 2
  3659. 5
  3660. 5
  3661. 2
  3662. 5
  3663. 4
  3664. 2
  3665. 0
  3666. 5338
  3667. 0
  3668. 743618947
  3669. 2
  3670. 1
  3671. #8
  3672. generic container
  3673.  
  3674. 152
  3675. 2
  3676. -1
  3677. -1
  3678. -1
  3679. 5
  3680. 157
  3681. 9
  3682. 14
  3683. p*ut in*sert d*rop
  3684. 2
  3685. 157
  3686. 3
  3687. re*move ta*ke g*et
  3688. 2
  3689. 157
  3690. 5
  3691. look_self
  3692. 2
  3693. 173
  3694. -1
  3695. accept
  3696. 2
  3697. 173
  3698. -1
  3699. open
  3700. 2
  3701. 45
  3702. -1
  3703. @lock_for_open
  3704. 2
  3705. 105
  3706. 0
  3707. is_openable_by
  3708. 2
  3709. 173
  3710. -1
  3711. close
  3712. 2
  3713. 45
  3714. -1
  3715. @unlock_for_open
  3716. 2
  3717. 41
  3718. -1
  3719. tell_contents
  3720. 2
  3721. 173
  3722. -1
  3723. set_opened
  3724. 2
  3725. 165
  3726. -1
  3727. @opacity
  3728. 2
  3729. 97
  3730. 12
  3731. set_opaque
  3732. 2
  3733. 165
  3734. -1
  3735. oclose_msg close_msg oopen_msg open_msg oput_fail_msg put_fail_msg oremove_fail_msg oremove_msg remove_fail_msg remove_msg oput_msg put_msg oopen_fail_msg open_fail_msg empty_msg
  3736. 38
  3737. 165
  3738. -1
  3739. 19
  3740. oclose_msg
  3741. close_msg
  3742. oopen_msg
  3743. open_msg
  3744. oput_fail_msg
  3745. put_fail_msg
  3746. opaque
  3747. dark
  3748. oremove_fail_msg
  3749. oremove_msg
  3750. remove_fail_msg
  3751. remove_msg
  3752. oput_msg
  3753. put_msg
  3754. oopen_fail_msg
  3755. open_fail_msg
  3756. empty_msg
  3757. opened
  3758. open_key
  3759. 31
  3760. 2
  3761. closes %d.
  3762. 2
  3763. 5
  3764. 2
  3765. You close %d.
  3766. 2
  3767. 5
  3768. 2
  3769. opens %d.
  3770. 2
  3771. 5
  3772. 2
  3773. You open %d.
  3774. 2
  3775. 5
  3776. 2
  3777.  
  3778. 2
  3779. 5
  3780. 2
  3781. You can't put %d in that.
  3782. 2
  3783. 5
  3784. 0
  3785. 1
  3786. 2
  3787. 1
  3788. 0
  3789. 0
  3790. 2
  3791. 1
  3792. 2
  3793.  
  3794. 2
  3795. 5
  3796. 2
  3797. removes %d from %i.
  3798. 2
  3799. 5
  3800. 2
  3801. You can't remove that.
  3802. 2
  3803. 5
  3804. 2
  3805. You remove %d from %i.
  3806. 2
  3807. 5
  3808. 2
  3809. puts %d in %i.
  3810. 2
  3811. 5
  3812. 2
  3813. You put %d in %i.
  3814. 2
  3815. 5
  3816. 2
  3817.  
  3818. 2
  3819. 5
  3820. 2
  3821. You can't open that.
  3822. 2
  3823. 5
  3824. 2
  3825. It is empty.
  3826. 2
  3827. 5
  3828. 0
  3829. 1
  3830. 2
  3831. 1
  3832. 0
  3833. 0
  3834. 2
  3835. 4
  3836. 5
  3837. 2
  3838. 5
  3839. 5
  3840. 2
  3841. 5
  3842. 5
  3843. 2
  3844. 5
  3845. 5
  3846. 2
  3847. 5
  3848. 5
  3849. 2
  3850. 5
  3851. 5
  3852. 2
  3853. 5
  3854. 5
  3855. 2
  3856. 5
  3857. 5
  3858. 2
  3859. 5
  3860. 5
  3861. 2
  3862. 4
  3863. 4
  3864. 1
  3865. 2
  3866. generic container
  3867. 2
  3868. 5
  3869. 5
  3870. 2
  3871. 5
  3872. 4
  3873. 2
  3874. 0
  3875. 7203
  3876. 0
  3877. 743618948
  3878. 2
  3879. 1
  3880. #9
  3881. generic note
  3882.  
  3883. 152
  3884. 2
  3885. -1
  3886. -1
  3887. -1
  3888. 5
  3889. 10
  3890. 62
  3891. 11
  3892. r*ead
  3893. 2
  3894. 45
  3895. -1
  3896. er*ase
  3897. 2
  3898. 45
  3899. -1
  3900. wr*ite
  3901. 2
  3902. 157
  3903. 4
  3904. del*ete rem*ove
  3905. 2
  3906. 153
  3907. 5
  3908. encrypt
  3909. 2
  3910. 97
  3911. 0
  3912. decrypt
  3913. 2
  3914. 33
  3915. -1
  3916. text
  3917. 2
  3918. 173
  3919. -1
  3920. is_readable_by
  3921. 2
  3922. 173
  3923. -1
  3924. set_text
  3925. 2
  3926. 173
  3927. -1
  3928. is_writable_by
  3929. 2
  3930. 173
  3931. -1
  3932. mailme
  3933. 2
  3934. 41
  3935. -1
  3936. 3
  3937. writers
  3938. encryption_key
  3939. text
  3940. 15
  3941. 4
  3942. 0
  3943. 2
  3944. 5
  3945. 0
  3946. 0
  3947. 2
  3948. 4
  3949. 4
  3950. 0
  3951. 2
  3952. 4
  3953. 5
  3954. 2
  3955. 5
  3956. 5
  3957. 2
  3958. 5
  3959. 5
  3960. 2
  3961. 5
  3962. 5
  3963. 2
  3964. 5
  3965. 5
  3966. 2
  3967. 5
  3968. 5
  3969. 2
  3970. 5
  3971. 5
  3972. 2
  3973. 5
  3974. 5
  3975. 2
  3976. 5
  3977. 5
  3978. 2
  3979. 4
  3980. 4
  3981. 1
  3982. 2
  3983. generic note
  3984. 2
  3985. 5
  3986. 2
  3987. There appears to be some writing on the note ...
  3988. 2
  3989. 5
  3990. 4
  3991. 2
  3992. 0
  3993. 4800
  3994. 0
  3995. 743618948
  3996. 2
  3997. 1
  3998. #10
  3999. a newspaper
  4000.  
  4001. 16
  4002. 2
  4003. 11
  4004. -1
  4005. 170
  4006. 9
  4007. -1
  4008. 55
  4009. 8
  4010. description
  4011. 2
  4012. 173
  4013. -1
  4014. read
  4015. 2
  4016. 45
  4017. -1
  4018. check
  4019. 2
  4020. 173
  4021. -1
  4022. touch
  4023. 2
  4024. 45
  4025. -1
  4026. init_for_core
  4027. 2
  4028. 173
  4029. -1
  4030. announce_new_edition
  4031. 2
  4032. 173
  4033. -1
  4034. gc garbage_collect
  4035. 2
  4036. 41
  4037. -1
  4038. set_text
  4039. 2
  4040. 173
  4041. -1
  4042. 3
  4043. readtimes
  4044. readers
  4045. last_write_time
  4046. 18
  4047. 4
  4048. 6
  4049. 0
  4050. -1464531029
  4051. 0
  4052. -1464414887
  4053. 0
  4054. -1463591068
  4055. 0
  4056. -1464504474
  4057. 0
  4058. -1464452973
  4059. 0
  4060. -1464182246
  4061. 2
  4062. 5
  4063. 4
  4064. 6
  4065. 1
  4066. 2
  4067. 1
  4068. 77
  4069. 1
  4070. 154
  4071. 1
  4072. 147
  4073. 1
  4074. 79
  4075. 1
  4076. 337
  4077. 2
  4078. 5
  4079. 0
  4080. -1464596922
  4081. 2
  4082. 5
  4083. 4
  4084. 0
  4085. 2
  4086. 5
  4087. 5
  4088. 2
  4089. 4
  4090. 4
  4091. 3
  4092. 2
  4093. New rooms have been set up to represent the Orion Network Systems office.
  4094. 2
  4095. Feel free to add objects that might enhance that virtuality.
  4096. 2
  4097. You may wish to visit the First Aid laserwriter, the Lab, or the Library.
  4098. 2
  4099. 5
  4100. 5
  4101. 2
  4102. 5
  4103. 5
  4104. 2
  4105. 5
  4106. 5
  4107. 2
  4108. 5
  4109. 5
  4110. 2
  4111. 5
  4112. 5
  4113. 38
  4114. 5
  4115. 5
  4116. 38
  4117. 5
  4118. 5
  4119. 38
  4120. 5
  4121. 2
  4122. Realizing that the newspaper is to be shared among all of the players, you change your mind about picking it up.
  4123. 38
  4124. 5
  4125. 1
  4126. 10
  4127. 2
  4128. 4
  4129. 4
  4130. 2
  4131. 2
  4132. newspaper
  4133. 2
  4134. a newspaper
  4135. 38
  4136. 5
  4137. 2
  4138. It's the latest issue of the MOO Herald-Examiner, dated %d.
  4139. 38
  4140. 5
  4141. 4
  4142. 2
  4143. 0
  4144. 55681
  4145. 0
  4146. 743619310
  4147. 2
  4148. 1
  4149. #11
  4150. Air Conditioning Duct
  4151.  
  4152. 16
  4153. 38
  4154. -1
  4155. 10
  4156. -1
  4157. 3
  4158. -1
  4159. 82
  4160. 5
  4161. keep_clean
  4162. 2
  4163. 173
  4164. -1
  4165. disfunc
  4166. 2
  4167. 173
  4168. -1
  4169. enterfunc
  4170. 2
  4171. 173
  4172. -1
  4173. match
  4174. 38
  4175. 173
  4176. -1
  4177. init_for_core
  4178. 2
  4179. 173
  4180. -1
  4181. 1
  4182. body_bag
  4183. 18
  4184. 1
  4185. 25489
  4186. 38
  4187. 5
  4188. 2
  4189. %T
  4190. 38
  4191. 5
  4192. 0
  4193. 0
  4194. 38
  4195. 5
  4196. 2
  4197. You have been expelled from %i by %n.
  4198. 38
  4199. 5
  4200. 2
  4201. You expel %d from %i.
  4202. 38
  4203. 5
  4204. 2
  4205. %D is unceremoniously expelled from %i by %n.
  4206. 38
  4207. 5
  4208. 4
  4209. 0
  4210. 38
  4211. 5
  4212. 0
  4213. 1
  4214. 38
  4215. 5
  4216. 4
  4217. 2
  4218. 1
  4219. 81
  4220. 1
  4221. 314
  4222. 38
  4223. 4
  4224. 1
  4225. -1
  4226. 38
  4227. 5
  4228. 0
  4229. 12415
  4230. 38
  4231. 5
  4232. 4
  4233. 2
  4234. 1
  4235. 80
  4236. 1
  4237. 313
  4238. 38
  4239. 4
  4240. 0
  4241. 0
  4242. 38
  4243. 5
  4244. 0
  4245. 3
  4246. 38
  4247. 5
  4248. 0
  4249. 0
  4250. 38
  4251. 4
  4252. 4
  4253. 2
  4254. 2
  4255. Air Conditioning Duct
  4256. 2
  4257. duct
  4258. 38
  4259. 5
  4260. 2
  4261. You are in an air conditioning duct above Bob Monsen's cubicle. You hear a loud whirring here
  4262. 38
  4263. 5
  4264. 4
  4265. 2
  4266. 0
  4267. 23317
  4268. 0
  4269. 743618922
  4270. 2
  4271. 1
  4272. #12
  4273. Login Commands
  4274.  
  4275. 16
  4276. 2
  4277. -1
  4278. -1
  4279. -1
  4280. 1
  4281. -1
  4282. 67
  4283. 26
  4284. ?
  4285. 2
  4286. 93
  4287. -1
  4288. h*elp @h*elp
  4289. 2
  4290. 93
  4291. -1
  4292. w*ho @w*ho
  4293. 2
  4294. 93
  4295. -1
  4296. co*nnect @co*nnect
  4297. 2
  4298. 93
  4299. -1
  4300. cr*eate @cr*eate
  4301. 2
  4302. 93
  4303. -1
  4304. q*uit @q*uit
  4305. 2
  4306. 93
  4307. -1
  4308. up*time @up*time
  4309. 2
  4310. 93
  4311. -1
  4312. v*ersion @v*ersion
  4313. 2
  4314. 93
  4315. -1
  4316. parse_command
  4317. 2
  4318. 165
  4319. -1
  4320. check_for_shutdown
  4321. 2
  4322. 173
  4323. -1
  4324. check_player_db
  4325. 2
  4326. 173
  4327. -1
  4328. _match_player
  4329. 2
  4330. 165
  4331. -1
  4332. notify
  4333. 2
  4334. 165
  4335. -1
  4336. tell
  4337. 38
  4338. 173
  4339. -1
  4340. player_creation_enabled
  4341. 2
  4342. 173
  4343. -1
  4344. newt_registration_string registration_string
  4345. 2
  4346. 173
  4347. -1
  4348. init_for_core
  4349. 2
  4350. 173
  4351. -1
  4352. special_action
  4353. 2
  4354. 164
  4355. -1
  4356. blacklisted graylisted redlisted spooflisted
  4357. 2
  4358. 165
  4359. -1
  4360. blacklist_add graylist_add redlist_add spooflist_add
  4361. 2
  4362. 173
  4363. -1
  4364. blacklist_remove graylist_remove redlist_remove spooflist_remove
  4365. 2
  4366. 173
  4367. -1
  4368. listname
  4369. 2
  4370. 173
  4371. -1
  4372. record_connection
  4373. 2
  4374. 173
  4375. -1
  4376. who(vanilla)
  4377. 2
  4378. 173
  4379. -1
  4380. spooflisted
  4381. 2
  4382. 173
  4383. -1
  4384. login_me
  4385. 2
  4386. 93
  4387. -1
  4388. 14
  4389. welcome_message
  4390. newt_registration_string
  4391. registration_string
  4392. registration_address
  4393. create_enabled
  4394. bogus_command
  4395. blank_command
  4396. graylist
  4397. blacklist
  4398. redlist
  4399. who_masks_wizards
  4400. max_player_name
  4401. spooflist
  4402. ignored
  4403. 18
  4404. 4
  4405. 2
  4406. 2
  4407. Welcome to Orion Network Systems
  4408. 2
  4409. Type 'Help' for help, or CO <name> <password> to connect
  4410. 2
  4411. 5
  4412. 2
  4413. Your character is temporarily hosed.
  4414. 2
  4415. 5
  4416. 2
  4417. Character creation is disabled.
  4418. 2
  4419. 5
  4420. 2
  4421.  
  4422. 2
  4423. 5
  4424. 0
  4425. 0
  4426. 2
  4427. 5
  4428. 2
  4429. ?
  4430. 2
  4431. 1
  4432. 2
  4433. login_me
  4434. 2
  4435. 1
  4436. 4
  4437. 2
  4438. 4
  4439. 0
  4440. 4
  4441. 0
  4442. 2
  4443. 0
  4444. 4
  4445. 2
  4446. 4
  4447. 0
  4448. 4
  4449. 0
  4450. 2
  4451. 0
  4452. 4
  4453. 2
  4454. 4
  4455. 0
  4456. 4
  4457. 0
  4458. 2
  4459. 0
  4460. 0
  4461. 0
  4462. 2
  4463. 0
  4464. 0
  4465. 40
  4466. 2
  4467. 5
  4468. 4
  4469. 2
  4470. 4
  4471. 0
  4472. 4
  4473. 0
  4474. 2
  4475. 0
  4476. 4
  4477. 0
  4478. 2
  4479. 5
  4480. 5
  4481. 2
  4482. 4
  4483. 4
  4484. 1
  4485. 2
  4486. Login Commands
  4487. 2
  4488. 5
  4489. 2
  4490. This provides everything needed by #0:do_login_command.  See `help $login' on $core_help for details.
  4491. 2
  4492. 5
  4493. 4
  4494. 2
  4495. 0
  4496. 23360
  4497. 0
  4498. 742881264
  4499. 2
  4500. 1
  4501. #13
  4502. Player Last_huh Verbs
  4503.  
  4504. 16
  4505. 2
  4506. -1
  4507. -1
  4508. -1
  4509. 1
  4510. -1
  4511. 12
  4512. 4
  4513. @*
  4514. 2
  4515. 165
  4516. -1
  4517. give hand
  4518. 2
  4519. 173
  4520. -1
  4521. get take
  4522. 2
  4523. 173
  4524. -1
  4525. drop throw
  4526. 2
  4527. 173
  4528. -1
  4529. 0
  4530. 4
  4531. 5
  4532. 2
  4533. 4
  4534. 4
  4535. 1
  4536. 2
  4537. Player Last_huh Verbs
  4538. 2
  4539. 5
  4540. 2
  4541. A repository of last-resort player verbs to be called by $player:last_huh
  4542. 2
  4543. 5
  4544. 4
  4545. 2
  4546. 0
  4547. 5153
  4548. 0
  4549. 743584517
  4550. 2
  4551. 1
  4552. #14
  4553. Guest Log
  4554.  
  4555. 0
  4556. 2
  4557. -1
  4558. -1
  4559. -1
  4560. 1
  4561. -1
  4562. 13
  4563. 3
  4564. enter
  4565. 2
  4566. 173
  4567. -1
  4568. last
  4569. 2
  4570. 157
  4571. 4
  4572. init_for_core
  4573. 2
  4574. 173
  4575. -1
  4576. 1
  4577. connections
  4578. 5
  4579. 4
  4580. 100
  4581. 4
  4582. 4
  4583. 1
  4584. 83
  4585. 0
  4586. 0
  4587. 0
  4588. 750853387
  4589. 2
  4590. foobar@apple.com
  4591. 4
  4592. 4
  4593. 1
  4594. 84
  4595. 0
  4596. 0
  4597. 0
  4598. 750853349
  4599. 2
  4600. foobar@apple.com
  4601. 4
  4602. 4
  4603. 1
  4604. 86
  4605. 0
  4606. 0
  4607. 0
  4608. 750853346
  4609. 2
  4610. foobar@apple.com
  4611. 4
  4612. 4
  4613. 1
  4614. 85
  4615. 0
  4616. 0
  4617. 0
  4618. 750853344
  4619. 2
  4620. foobar@apple.com
  4621. 4
  4622. 4
  4623. 1
  4624. 84
  4625. 0
  4626. 1
  4627. 0
  4628. 750853124
  4629. 2
  4630. foobar@apple.com
  4631. 4
  4632. 4
  4633. 1
  4634. 86
  4635. 0
  4636. 1
  4637. 0
  4638. 750853114
  4639. 2
  4640. foobar@apple.com
  4641. 4
  4642. 4
  4643. 1
  4644. 85
  4645. 0
  4646. 1
  4647. 0
  4648. 750853106
  4649. 2
  4650. foobar@apple.com
  4651. 4
  4652. 4
  4653. 1
  4654. 83
  4655. 0
  4656. 1
  4657. 0
  4658. 750853071
  4659. 2
  4660. foobar@apple.com
  4661. 4
  4662. 4
  4663. 1
  4664. 83
  4665. 0
  4666. 0
  4667. 0
  4668. 750802467
  4669. 2
  4670. Bob_Monsen@Hawksbill_Station.E.T._Phone_Home
  4671. 4
  4672. 4
  4673. 1
  4674. 83
  4675. 0
  4676. 1
  4677. 0
  4678. 750802386
  4679. 2
  4680. Bob_Monsen@Hawksbill_Station.E.T._Phone_Home
  4681. 4
  4682. 4
  4683. 1
  4684. 83
  4685. 0
  4686. 0
  4687. 0
  4688. -1462983008
  4689. 2
  4690. Guest@Sartre.Orion
  4691. 4
  4692. 4
  4693. 1
  4694. 83
  4695. 0
  4696. 1
  4697. 0
  4698. -1462983087
  4699. 2
  4700. Guest@Sartre.Orion
  4701. 4
  4702. 4
  4703. 1
  4704. 83
  4705. 0
  4706. 0
  4707. 0
  4708. -1462995344
  4709. 2
  4710. LocalUser@LocalMachine.LocalZone
  4711. 4
  4712. 4
  4713. 1
  4714. 83
  4715. 0
  4716. 1
  4717. 0
  4718. -1462995597
  4719. 2
  4720. LocalUser@LocalMachine.LocalZone
  4721. 4
  4722. 4
  4723. 1
  4724. 83
  4725. 0
  4726. 0
  4727. 0
  4728. -1463168476
  4729. 2
  4730. Guest@LiverSpot.E.T._Phone_Home
  4731. 4
  4732. 4
  4733. 1
  4734. 83
  4735. 0
  4736. 1
  4737. 0
  4738. -1463168996
  4739. 2
  4740. Guest@LiverSpot.E.T._Phone_Home
  4741. 4
  4742. 4
  4743. 1
  4744. 83
  4745. 0
  4746. 0
  4747. 0
  4748. -1463169407
  4749. 2
  4750. Guest@LiverSpot.E.T._Phone_Home
  4751. 4
  4752. 4
  4753. 1
  4754. 83
  4755. 0
  4756. 1
  4757. 0
  4758. -1463169427
  4759. 2
  4760. Guest@LiverSpot.E.T._Phone_Home
  4761. 4
  4762. 4
  4763. 1
  4764. 83
  4765. 0
  4766. 0
  4767. 0
  4768. -1463203906
  4769. 2
  4770. Guest@LiverSpot.E.T._Phone_Home
  4771. 4
  4772. 4
  4773. 1
  4774. 83
  4775. 0
  4776. 1
  4777. 0
  4778. -1463203977
  4779. 2
  4780. Guest@LiverSpot.E.T._Phone_Home
  4781. 4
  4782. 4
  4783. 1
  4784. 83
  4785. 0
  4786. 0
  4787. 0
  4788. -1463204008
  4789. 2
  4790. Guest@LiverSpot.E.T._Phone_Home
  4791. 4
  4792. 4
  4793. 1
  4794. 83
  4795. 0
  4796. 1
  4797. 0
  4798. -1463204018
  4799. 2
  4800. Guest@LiverSpot.E.T._Phone_Home
  4801. 4
  4802. 4
  4803. 1
  4804. 83
  4805. 0
  4806. 0
  4807. 0
  4808. -1463230621
  4809. 2
  4810. Bob_Monsen@Sartre.Orion
  4811. 4
  4812. 4
  4813. 1
  4814. 83
  4815. 0
  4816. 1
  4817. 0
  4818. -1463230635
  4819. 2
  4820. Bob_Monsen@Sartre.Orion
  4821. 4
  4822. 4
  4823. 1
  4824. 83
  4825. 0
  4826. 0
  4827. 0
  4828. -1463403259
  4829. 2
  4830. Bob_Monsen@Sartre.Orion
  4831. 4
  4832. 4
  4833. 1
  4834. 83
  4835. 0
  4836. 1
  4837. 0
  4838. -1463403426
  4839. 2
  4840. Bob_Monsen@Sartre.Orion
  4841. 4
  4842. 4
  4843. 1
  4844. 83
  4845. 0
  4846. 0
  4847. 0
  4848. -1463516142
  4849. 2
  4850. Guest@Spot.Orion
  4851. 4
  4852. 4
  4853. 1
  4854. 83
  4855. 0
  4856. 1
  4857. 0
  4858. -1463516153
  4859. 2
  4860. Guest@Spot.Orion
  4861. 4
  4862. 4
  4863. 1
  4864. 83
  4865. 0
  4866. 0
  4867. 0
  4868. -1463586562
  4869. 2
  4870. Bob_Monsen@Sartre.Orion
  4871. 4
  4872. 4
  4873. 1
  4874. 85
  4875. 0
  4876. 0
  4877. 0
  4878. -1463586562
  4879. 2
  4880. Bob_Monsen@Sartre.Orion
  4881. 4
  4882. 4
  4883. 1
  4884. 86
  4885. 0
  4886. 0
  4887. 0
  4888. -1463586562
  4889. 2
  4890. Bob_Monsen@Sartre.Orion
  4891. 4
  4892. 4
  4893. 1
  4894. 84
  4895. 0
  4896. 0
  4897. 0
  4898. -1463586562
  4899. 2
  4900. Bob_Monsen@Sartre.Orion
  4901. 4
  4902. 4
  4903. 1
  4904. 85
  4905. 0
  4906. 1
  4907. 0
  4908. -1463586565
  4909. 2
  4910. Bob_Monsen@Sartre.Orion
  4911. 4
  4912. 4
  4913. 1
  4914. 86
  4915. 0
  4916. 1
  4917. 0
  4918. -1463586579
  4919. 2
  4920. Bob_Monsen@Sartre.Orion
  4921. 4
  4922. 4
  4923. 1
  4924. 84
  4925. 0
  4926. 1
  4927. 0
  4928. -1463586594
  4929. 2
  4930. Bob_Monsen@Sartre.Orion
  4931. 4
  4932. 4
  4933. 1
  4934. 83
  4935. 0
  4936. 1
  4937. 0
  4938. -1463586608
  4939. 2
  4940. Bob_Monsen@Sartre.Orion
  4941. 4
  4942. 4
  4943. 1
  4944. 83
  4945. 0
  4946. 0
  4947. 0
  4948. -1464015435
  4949. 2
  4950. Guest@Sartre.Orion
  4951. 4
  4952. 4
  4953. 1
  4954. 83
  4955. 0
  4956. 1
  4957. 0
  4958. -1464015472
  4959. 2
  4960. Guest@Sartre.Orion
  4961. 4
  4962. 4
  4963. 1
  4964. 83
  4965. 0
  4966. 0
  4967. 0
  4968. -1464028557
  4969. 2
  4970. Guest@Sartre.Orion
  4971. 4
  4972. 4
  4973. 1
  4974. 83
  4975. 0
  4976. 1
  4977. 0
  4978. -1464028591
  4979. 2
  4980. Guest@Sartre.Orion
  4981. 4
  4982. 4
  4983. 1
  4984. 83
  4985. 0
  4986. 0
  4987. 0
  4988. -1464028595
  4989. 2
  4990. Guest@Sartre.Orion
  4991. 4
  4992. 4
  4993. 1
  4994. 83
  4995. 0
  4996. 1
  4997. 0
  4998. -1464028603
  4999. 2
  5000. Guest@Sartre.Orion
  5001. 4
  5002. 4
  5003. 1
  5004. 83
  5005. 0
  5006. 0
  5007. 0
  5008. -1464095988
  5009. 2
  5010. uest@murdock.Orion
  5011. 4
  5012. 4
  5013. 1
  5014. 83
  5015. 0
  5016. 1
  5017. 0
  5018. -1464100755
  5019. 2
  5020. uest@murdock.Orion
  5021. 4
  5022. 4
  5023. 1
  5024. 83
  5025. 0
  5026. 0
  5027. 0
  5028. -1464103676
  5029. 2
  5030. uest@Spot.Orion
  5031. 4
  5032. 4
  5033. 1
  5034. 83
  5035. 0
  5036. 1
  5037. 0
  5038. -1464104475
  5039. 2
  5040. uest@Spot.Orion
  5041. 4
  5042. 4
  5043. 1
  5044. 83
  5045. 0
  5046. 0
  5047. 0
  5048. -1464104516
  5049. 2
  5050. uest@Spot.Orion
  5051. 4
  5052. 4
  5053. 1
  5054. 83
  5055. 0
  5056. 1
  5057. 0
  5058. -1464104544
  5059. 2
  5060. uest@Spot.Orion
  5061. 4
  5062. 4
  5063. 1
  5064. 83
  5065. 0
  5066. 0
  5067. 0
  5068. -1464162978
  5069. 2
  5070. Bob_Monsen@Hawksbill_Station.E.T._Phone_Home
  5071. 4
  5072. 4
  5073. 1
  5074. 83
  5075. 0
  5076. 1
  5077. 0
  5078. -1464163068
  5079. 2
  5080. Bob_Monsen@Hawksbill_Station.E.T._Phone_Home
  5081. 4
  5082. 4
  5083. 1
  5084. 83
  5085. 0
  5086. 0
  5087. 0
  5088. -1464180254
  5089. 2
  5090. uest@Dalmation.Orion
  5091. 4
  5092. 4
  5093. 1
  5094. 83
  5095. 0
  5096. 1
  5097. 0
  5098. -1464180316
  5099. 2
  5100. uest@Dalmation.Orion
  5101. 4
  5102. 4
  5103. 1
  5104. 83
  5105. 0
  5106. 0
  5107. 0
  5108. -1464194063
  5109. 2
  5110. uest@Spot.Orion
  5111. 4
  5112. 4
  5113. 1
  5114. 83
  5115. 0
  5116. 1
  5117. 0
  5118. -1464194499
  5119. 2
  5120. uest@Spot.Orion
  5121. 4
  5122. 4
  5123. 1
  5124. 83
  5125. 0
  5126. 0
  5127. 0
  5128. -1464196914
  5129. 2
  5130. Bob_Monsen@Sartre.Orion
  5131. 4
  5132. 4
  5133. 1
  5134. 83
  5135. 0
  5136. 1
  5137. 0
  5138. -1464196956
  5139. 2
  5140. Bob_Monsen@Sartre.Orion
  5141. 4
  5142. 4
  5143. 1
  5144. 83
  5145. 0
  5146. 0
  5147. 0
  5148. -1464205591
  5149. 2
  5150. Bob_Monsen@Sartre.Orion
  5151. 4
  5152. 4
  5153. 1
  5154. 83
  5155. 0
  5156. 1
  5157. 0
  5158. -1464205712
  5159. 2
  5160. Bob_Monsen@Sartre.Orion
  5161. 4
  5162. 4
  5163. 1
  5164. 83
  5165. 0
  5166. 0
  5167. 0
  5168. -1464208251
  5169. 2
  5170. Bob_Monsen@Sartre.Orion
  5171. 4
  5172. 4
  5173. 1
  5174. 83
  5175. 0
  5176. 1
  5177. 0
  5178. -1464208256
  5179. 2
  5180. Bob_Monsen@Sartre.Orion
  5181. 4
  5182. 4
  5183. 1
  5184. 83
  5185. 0
  5186. 0
  5187. 0
  5188. -1464247622
  5189. 2
  5190. Bob_Monsen@Hawksbill_Station.E.T._Phone_Home
  5191. 4
  5192. 4
  5193. 1
  5194. 83
  5195. 0
  5196. 1
  5197. 0
  5198. -1464248749
  5199. 2
  5200. Bob_Monsen@Hawksbill_Station.E.T._Phone_Home
  5201. 4
  5202. 4
  5203. 1
  5204. 83
  5205. 0
  5206. 0
  5207. 0
  5208. -1464249735
  5209. 2
  5210. @Hawksbill_Station.E.T._Phone_Home
  5211. 4
  5212. 4
  5213. 1
  5214. 83
  5215. 0
  5216. 1
  5217. 0
  5218. -1464250200
  5219. 2
  5220. @Hawksbill_Station.E.T._Phone_Home
  5221. 4
  5222. 4
  5223. 1
  5224. 83
  5225. 0
  5226. 0
  5227. 0
  5228. -1464325878
  5229. 2
  5230. @Black_Buffalo_Woman.E.T._Phone_Home
  5231. 4
  5232. 4
  5233. 1
  5234. 83
  5235. 0
  5236. 1
  5237. 0
  5238. -1464331159
  5239. 2
  5240. @Black_Buffalo_Woman.E.T._Phone_Home
  5241. 4
  5242. 4
  5243. 1
  5244. 83
  5245. 0
  5246. 0
  5247. 0
  5248. -1464412478
  5249. 2
  5250. @Black_Buffalo_Woman.E.T._Phone_Home
  5251. 4
  5252. 4
  5253. 1
  5254. 83
  5255. 0
  5256. 1
  5257. 0
  5258. -1464415281
  5259. 2
  5260. @Black_Buffalo_Woman.E.T._Phone_Home
  5261. 4
  5262. 4
  5263. 1
  5264. 83
  5265. 0
  5266. 0
  5267. 0
  5268. -1464438517
  5269. 2
  5270. @Red_Cloud.Orion
  5271. 4
  5272. 4
  5273. 1
  5274. 83
  5275. 0
  5276. 1
  5277. 0
  5278. -1464440591
  5279. 2
  5280. @Red_Cloud.Orion
  5281. 4
  5282. 4
  5283. 1
  5284. 83
  5285. 0
  5286. 0
  5287. 0
  5288. -1464453022
  5289. 2
  5290. @Mighty_Mouse.Orion
  5291. 4
  5292. 4
  5293. 1
  5294. 83
  5295. 0
  5296. 1
  5297. 0
  5298. -1464453190
  5299. 2
  5300. @Mighty_Mouse.Orion
  5301. 4
  5302. 4
  5303. 1
  5304. 83
  5305. 0
  5306. 0
  5307. 0
  5308. -1464513191
  5309. 2
  5310. s_Macintosh.E.T._Phone_Home
  5311. 4
  5312. 4
  5313. 1
  5314. 83
  5315. 0
  5316. 1
  5317. 0
  5318. -1464513308
  5319. 2
  5320. s_Macintosh.E.T._Phone_Home
  5321. 4
  5322. 4
  5323. 1
  5324. 83
  5325. 0
  5326. 0
  5327. 0
  5328. -1464515299
  5329. 2
  5330. s_Macintosh.E.T._Phone_Home
  5331. 4
  5332. 4
  5333. 1
  5334. 83
  5335. 0
  5336. 1
  5337. 0
  5338. -1464515307
  5339. 2
  5340. s_Macintosh.E.T._Phone_Home
  5341. 4
  5342. 4
  5343. 1
  5344. 83
  5345. 0
  5346. 0
  5347. 0
  5348. -1464536514
  5349. 2
  5350. @Kant.Orion
  5351. 4
  5352. 4
  5353. 1
  5354. 83
  5355. 0
  5356. 1
  5357. 0
  5358. -1464536529
  5359. 2
  5360. @Kant.Orion
  5361. 4
  5362. 4
  5363. 1
  5364. 83
  5365. 0
  5366. 0
  5367. 0
  5368. -1464618802
  5369. 2
  5370. John_Louch@Spot.Orion
  5371. 4
  5372. 4
  5373. 1
  5374. 83
  5375. 0
  5376. 1
  5377. 0
  5378. -1464618945
  5379. 2
  5380. John_Louch@Spot.Orion
  5381. 4
  5382. 4
  5383. 1
  5384. 83
  5385. 0
  5386. 0
  5387. 0
  5388. -1464625335
  5389. 2
  5390. John_Louch@Spot.Orion
  5391. 4
  5392. 4
  5393. 1
  5394. 83
  5395. 0
  5396. 1
  5397. 0
  5398. -1464625473
  5399. 2
  5400. John_Louch@Spot.Orion
  5401. 4
  5402. 4
  5403. 1
  5404. 83
  5405. 0
  5406. 0
  5407. 0
  5408. -1464632552
  5409. 2
  5410. Bob_Monsen@Sartre.Orion
  5411. 4
  5412. 4
  5413. 1
  5414. 83
  5415. 0
  5416. 1
  5417. 0
  5418. -1464632574
  5419. 2
  5420. Bob_Monsen@Sartre.Orion
  5421. 4
  5422. 4
  5423. 1
  5424. 83
  5425. 0
  5426. 0
  5427. 0
  5428. -1464632851
  5429. 2
  5430. John_Louch@Dalmation.Orion
  5431. 4
  5432. 4
  5433. 1
  5434. 84
  5435. 0
  5436. 0
  5437. 0
  5438. -1464634382
  5439. 2
  5440. Bob_Monsen@Sartre.Orion
  5441. 4
  5442. 4
  5443. 1
  5444. 84
  5445. 0
  5446. 1
  5447. 0
  5448. -1464634411
  5449. 2
  5450. Bob_Monsen@Sartre.Orion
  5451. 4
  5452. 4
  5453. 1
  5454. 83
  5455. 0
  5456. 1
  5457. 0
  5458. -1464636558
  5459. 2
  5460. John_Louch@Dalmation.Orion
  5461. 4
  5462. 4
  5463. 1
  5464. 83
  5465. 0
  5466. 0
  5467. 0
  5468. -1464638300
  5469. 2
  5470. John_Louch@Dalmation.Orion
  5471. 4
  5472. 4
  5473. 1
  5474. 83
  5475. 0
  5476. 1
  5477. 0
  5478. -1464641590
  5479. 2
  5480. John_Louch@Dalmation.Orion
  5481. 4
  5482. 4
  5483. 1
  5484. 83
  5485. 0
  5486. 0
  5487. 0
  5488. -1464700603
  5489. 2
  5490. Bob_Monsen@Sartre.Orion
  5491. 4
  5492. 4
  5493. 1
  5494. 83
  5495. 0
  5496. 1
  5497. 0
  5498. -1464700609
  5499. 2
  5500. Bob_Monsen@Sartre.Orion
  5501. 4
  5502. 4
  5503. 1
  5504. 86
  5505. 0
  5506. 0
  5507. 0
  5508. -1465032759
  5509. 2
  5510. Bob_Monsen@Kant.Orion
  5511. 4
  5512. 4
  5513. 1
  5514. 83
  5515. 0
  5516. 0
  5517. 0
  5518. -1465044099
  5519. 2
  5520. Bob_Monsen@Sartre.Orion
  5521. 4
  5522. 4
  5523. 1
  5524. 86
  5525. 0
  5526. 1
  5527. 0
  5528. -1465044140
  5529. 2
  5530. Bob_Monsen@Kant.Orion
  5531. 4
  5532. 4
  5533. 1
  5534. 83
  5535. 0
  5536. 1
  5537. 0
  5538. -1465044160
  5539. 2
  5540. Bob_Monsen@Sartre.Orion
  5541. 4
  5542. 4
  5543. 1
  5544. 83
  5545. 0
  5546. 0
  5547. 0
  5548. -1465044418
  5549. 2
  5550. Bob_Monsen@Kant.Orion
  5551. 4
  5552. 4
  5553. 1
  5554. 83
  5555. 0
  5556. 1
  5557. 0
  5558. -1465045605
  5559. 2
  5560. Bob_Monsen@Kant.Orion
  5561. 4
  5562. 4
  5563. 1
  5564. 83
  5565. 0
  5566. 0
  5567. 0
  5568. -1465146164
  5569. 2
  5570. 'Orion'
  5571. 4
  5572. 4
  5573. 1
  5574. 83
  5575. 0
  5576. 1
  5577. 0
  5578. -1465146205
  5579. 2
  5580. 'Orion'
  5581. 2
  5582. 0
  5583. 5
  5584. 2
  5585. 4
  5586. 4
  5587. 1
  5588. 2
  5589. Guest Log
  5590. 2
  5591. 5
  5592. 5
  5593. 2
  5594. 5
  5595. 4
  5596. 2
  5597. 0
  5598. 9077
  5599. 0
  5600. 743666595
  5601. 2
  5602. 1
  5603. #15
  5604. Generic BigList Utilities
  5605.  
  5606. 144
  5607. 38
  5608. -1
  5609. -1
  5610. -1
  5611. 1
  5612. -1
  5613. 73
  5614. 25
  5615. length
  5616. 38
  5617. 173
  5618. -1
  5619. find_nth
  5620. 38
  5621. 173
  5622. -1
  5623. find_ord
  5624. 38
  5625. 173
  5626. -1
  5627. set_nth
  5628. 38
  5629. 173
  5630. -1
  5631. kill
  5632. 38
  5633. 173
  5634. -1
  5635. insert_after insert_before
  5636. 38
  5637. 173
  5638. -1
  5639. extract_range
  5640. 38
  5641. 173
  5642. -1
  5643. delete_range
  5644. 38
  5645. 173
  5646. -1
  5647. keep_range
  5648. 38
  5649. 173
  5650. -1
  5651. insert_last
  5652. 38
  5653. 173
  5654. -1
  5655. start
  5656. 38
  5657. 173
  5658. -1
  5659. next
  5660. 38
  5661. 173
  5662. -1
  5663. _find_nth
  5664. 38
  5665. 173
  5666. -1
  5667. _find_ord
  5668. 38
  5669. 173
  5670. -1
  5671. _set_nth
  5672. 38
  5673. 173
  5674. -1
  5675. _skill
  5676. 38
  5677. 173
  5678. -1
  5679. _extract
  5680. 38
  5681. 173
  5682. -1
  5683. _merge
  5684. 38
  5685. 173
  5686. -1
  5687. _smerge
  5688. 38
  5689. 173
  5690. -1
  5691. _split
  5692. 38
  5693. 173
  5694. -1
  5695. _rmerge
  5696. 38
  5697. 173
  5698. -1
  5699. _scrunch
  5700. 38
  5701. 173
  5702. -1
  5703. _listfind_nth
  5704. 38
  5705. 173
  5706. -1
  5707. _insertfirst
  5708. 38
  5709. 173
  5710. -1
  5711. debug
  5712. 38
  5713. 173
  5714. -1
  5715. 2
  5716. about
  5717. maxfanout
  5718. 6
  5719. 4
  5720. 15
  5721. 2
  5722. Implementation notes
  5723. 2
  5724. --------------------
  5725. 2
  5726. Each biglist is actually a tree (a kind of B-tree, actually).
  5727. 2
  5728. The routines above pass around handles of the form
  5729. 2
  5730.  
  5731. 2
  5732.     {root_node, size, leftmost_ord}
  5733. 2
  5734.  
  5735. 2
  5736. where root_node is the (string) name of a property that holds the root of the tree, size is the number of leaves in the tree, and leftmost_ord is the :_ord value of the leftmost element of the list (i.e., the leftmost leaf).
  5737. 2
  5738. Each node property has a value of the form 
  5739. 2
  5740.  
  5741. 2
  5742.     {height,list of subtrees}.
  5743. 2
  5744.  
  5745. 2
  5746. where the each of the subtrees is itself a 3-element list as above unless
  5747. 2
  5748. the height is 0, in which case the subtrees are actually biglist elements of the arbitrary form determined by the home object.
  5749. 2
  5750. At every level, each node except the rightmost has between this.maxfanout/2 and this.maxfanout subtrees; the rightmost is allowed to have as few as 1 subtree.
  5751. 38
  5752. 5
  5753. 0
  5754. 7
  5755. 38
  5756. 5
  5757. 5
  5758. 38
  5759. 4
  5760. 4
  5761. 2
  5762. 2
  5763. ghblu
  5764. 2
  5765. biglist_utils
  5766. 38
  5767. 1
  5768. 4
  5769. 73
  5770. 2
  5771. Generic BigList Utilities
  5772. 2
  5773. ----------------------------
  5774. 2
  5775. This is a package for maintaining huge persistent (sorted) lists in a format that is less likely to spam the server (which runs into a certain amount of trouble dealing with long ordinary lists --- btw we use `biglist' to refer to the huge data structure we're about to describe and `list' to refer to ordinary MOO lists {...}).  The biglist in question lives on a particular object, to which we will refer in the discussion below as the `home' object, and its various elements appear as leaves of a tree whose nodes are kept in properties of the home object.  It should be noted that the home object does not need to be (and in fact should *not* be) a descendant of this one; this object merely provides utilities for manipulating the properties on the home object that are used in a particular biglist manipulation.  
  5776. 2
  5777.  
  5778. 2
  5779. All of the utilities below refer to `caller' to locate the home object.  Thus verbs to manipulate a given biglist must be located on or inherited by its home object itself.  The home object needs to define the following verbs
  5780. 2
  5781.  
  5782. 2
  5783.   :_make(@args)     => new property on home object with value args
  5784. 2
  5785.   :_kill(prop)      delete a given property that was created by :_make
  5786. 2
  5787.   :_get(prop)       => home.prop
  5788. 2
  5789.   :_put(prop,@args) set home.prop = args
  5790. 2
  5791.   :_ord(element)    given something that is of the form of a biglist element
  5792. 2
  5793.                     return the corresponding ordinal (for sorting purposes).
  5794. 2
  5795.                     If you never intend to use :find_ord, then this can be a 
  5796. 2
  5797.                     routine that always returns 0 or some other random value.
  5798. 2
  5799.  
  5800. 2
  5801. See #5546 (Generic Biglist Resident) or $big_mail_recipient
  5802. 2
  5803. for examples.
  5804. 2
  5805.  
  5806. 2
  5807. Those of the following routines that take a biglist argument are expecting
  5808. 2
  5809. either {} (empty biglist) or some biglist returned by one of the other routines
  5810. 2
  5811.  
  5812. 2
  5813.   :length(biglist)          => length(biglist) (i.e., number of elements)
  5814. 2
  5815.   :find_nth(biglist,n)      => biglist[n]
  5816. 2
  5817.   :find_ord(biglist,k,comp) => n where n is
  5818. 2
  5819.      the largest such that home:(comp)(k,home:_ord(biglist[n])) is false, or
  5820. 2
  5821.      the smallest such that home:(comp)(k,home:_ord(biglist[n+1])) is true.
  5822. 2
  5823.      Always returns a value between 0 and length(biglist) inclusive.
  5824. 2
  5825.      This assumes biglist to be sorted in order of increasing :_ord values 
  5826. 2
  5827.      with respect to home:(comp)().
  5828. 2
  5829.      Standard situation is :_ord returns a number and comp is a < verb.
  5830. 2
  5831.  
  5832. 2
  5833.   :start(biglist,s,e)  => {biglist[s..?],@handle} or {}
  5834. 2
  5835.   :next(@handle)       => {biglist[?+1..??],@newhandle} or {}
  5836. 2
  5837.      These two are used for iterating over a range of elements of a biglist
  5838. 2
  5839.      The canonical incantation for doing
  5840. 2
  5841.         for elt in (biglist[first..last])
  5842. 2
  5843.           ...
  5844. 2
  5845.         endfor
  5846. 2
  5847.      is
  5848. 2
  5849.         handle = :start(biglist,first,last);
  5850. 2
  5851.         while(handle)
  5852. 2
  5853.           for elt in (handle[1])
  5854. 2
  5855.             ...
  5856. 2
  5857.           endfor
  5858. 2
  5859.           handle = :next(@listdelete(handle,1));
  5860. 2
  5861.         endwhile
  5862. 2
  5863.  
  5864. 2
  5865. The following all destructively modify their biglist argument(s) L (and M).
  5866. 2
  5867.  
  5868. 2
  5869.   :set_nth(L,n,value)  =>  L[n] = value
  5870. 2
  5871.      replaces the indicated element
  5872. 2
  5873.  
  5874. 2
  5875.   :insert_before(L,M,n) => {@L[1..n-1],@M,@L[n..length(L)]}
  5876. 2
  5877.   :insert_after (L,M,n) => {@L[1..n],  @M,@L[n+1..length(L)]}
  5878. 2
  5879.      takes two distinct biglists, inserts one into the other at the given point
  5880. 2
  5881.      returns the resulting consolidated biglist
  5882. 2
  5883.  
  5884. 2
  5885.   :extract_range(L,m,n) => {{@L[1..m-1],@L[n+1..]}, L[m..n]} 
  5886. 2
  5887.      breaks the given biglist into two distinct biglists.
  5888. 2
  5889.  
  5890. 2
  5891.   :delete_range(L,m,n[,leafkiller]) => {@L[1..m-1],@L[n+1..]}
  5892. 2
  5893.   :keep_range  (L,m,n[,leafkiller]) => L[m..n]
  5894. 2
  5895.      like extract_range only we destroy what we don't want.
  5896. 2
  5897.  
  5898. 2
  5899.   :insertlast(L,value)  => {@L,value}
  5900. 2
  5901.      inserts a new element at the end of biglist.  
  5902. 2
  5903.      If find_ord is to continue to work properly, it is assumed that the 
  5904. 2
  5905.      home:_ord(elt) is greater (comp-wise) than all of the :_ord values
  5906. 2
  5907.      of elements currently in the biglist.
  5908. 2
  5909.  
  5910. 2
  5911.   :kill(L[,leafkiller]) 
  5912. 2
  5913.      destroys all nodes used by biglist.  
  5914. 2
  5915.      Calls home:leafkiller on each element.
  5916. 38
  5917. 5
  5918. 4
  5919. 2
  5920. 0
  5921. 24940
  5922. 0
  5923. 743667426
  5924. 2
  5925. 1
  5926. #16
  5927. Generic Large-Capacity Mail Recipient
  5928.  
  5929. 144
  5930. 38
  5931. -1
  5932. -1
  5933. -1
  5934. 46
  5935. 19
  5936. 70
  5937. 40
  5938. _genprop
  5939. 38
  5940. 173
  5941. -1
  5942. _make
  5943. 2
  5944. 173
  5945. -1
  5946. _kill
  5947. 2
  5948. 165
  5949. -1
  5950. _get
  5951. 38
  5952. 165
  5953. -1
  5954. _put
  5955. 38
  5956. 173
  5957. -1
  5958. _ord
  5959. 38
  5960. 173
  5961. -1
  5962. _makemsg
  5963. 38
  5964. 173
  5965. -1
  5966. _killmsg
  5967. 38
  5968. 173
  5969. -1
  5970. _message_num
  5971. 38
  5972. 173
  5973. -1
  5974. _message_date
  5975. 38
  5976. 173
  5977. -1
  5978. _message_hdr
  5979. 38
  5980. 173
  5981. -1
  5982. _message_text
  5983. 38
  5984. 173
  5985. -1
  5986. _lt_msgnum
  5987. 38
  5988. 173
  5989. -1
  5990. _lt_msgdate
  5991. 38
  5992. 173
  5993. -1
  5994. receive_batch
  5995. 38
  5996. 173
  5997. -1
  5998. receive_message
  5999. 38
  6000. 173
  6001. -1
  6002. messages_in_seq
  6003. 38
  6004. 173
  6005. -1
  6006. display_seq_headers
  6007. 38
  6008. 173
  6009. -1
  6010. display_seq_full
  6011. 38
  6012. 173
  6013. -1
  6014. list_rmm
  6015. 38
  6016. 173
  6017. -1
  6018. undo_rmm
  6019. 38
  6020. 173
  6021. -1
  6022. expunge_rmm
  6023. 38
  6024. 173
  6025. -1
  6026. rm_message_seq
  6027. 38
  6028. 165
  6029. -1
  6030. renumber
  6031. 38
  6032. 173
  6033. -1
  6034. length_all_msgs
  6035. 38
  6036. 173
  6037. -1
  6038. length_num_le
  6039. 38
  6040. 173
  6041. -1
  6042. length_date_le
  6043. 38
  6044. 173
  6045. -1
  6046. exists_num_eq
  6047. 38
  6048. 173
  6049. -1
  6050. new_message_num
  6051. 38
  6052. 173
  6053. -1
  6054. from_msg_seq
  6055. 38
  6056. 173
  6057. -1
  6058. %from_msg_seq
  6059. 38
  6060. 173
  6061. -1
  6062. to_msg_seq
  6063. 38
  6064. 173
  6065. -1
  6066. %to_msg_seq
  6067. 38
  6068. 173
  6069. -1
  6070. subject_msg_seq
  6071. 38
  6072. 173
  6073. -1
  6074. body_msg_seq
  6075. 38
  6076. 173
  6077. -1
  6078. date_sort
  6079. 38
  6080. 173
  6081. -1
  6082. _fix_last_msg_date
  6083. 38
  6084. 173
  6085. -1
  6086. __fix
  6087. 38
  6088. 173
  6089. -1
  6090. init_for_core
  6091. 38
  6092. 173
  6093. -1
  6094. length_date_gt
  6095. 38
  6096. 173
  6097. -1
  6098. 4
  6099. summary_uses_body
  6100. _mgr
  6101. mowner
  6102. _genprop
  6103. 22
  6104. 0
  6105. 0
  6106. 38
  6107. 5
  6108. 1
  6109. 15
  6110. 38
  6111. 5
  6112. 1
  6113. 38
  6114. 38
  6115. 1
  6116. 2
  6117.  
  6118. 38
  6119. 1
  6120. 5
  6121. 38
  6122. 5
  6123. 0
  6124. 0
  6125. 38
  6126. 1
  6127. 4
  6128. 0
  6129. 38
  6130. 0
  6131. 5
  6132. 38
  6133. 5
  6134. 5
  6135. 38
  6136. 5
  6137. 5
  6138. 38
  6139. 5
  6140. 5
  6141. 38
  6142. 5
  6143. 5
  6144. 38
  6145. 1
  6146. 5
  6147. 38
  6148. 1
  6149. 5
  6150. 38
  6151. 5
  6152. 5
  6153. 38
  6154. 1
  6155. 5
  6156. 38
  6157. 0
  6158. 5
  6159. 38
  6160. 5
  6161. 5
  6162. 38
  6163. 5
  6164. 5
  6165. 38
  6166. 4
  6167. 4
  6168. 1
  6169. 2
  6170. Generic Large-Capacity Mail Recipient
  6171. 38
  6172. 1
  6173. 4
  6174. 24
  6175. 2
  6176. Generic Large Capacity Mail Recipient
  6177. 2
  6178. -------------------------------------
  6179. 2
  6180. Since any modifications to large lists entail copying the entire list
  6181. 2
  6182. over, operations on ordinary mail recipients having large numbers of
  6183. 2
  6184. messages, that actually change the content of .messages will take
  6185. 2
  6186. inordinately long.  Thus we have this version which makes use of the
  6187. 2
  6188. $biglist package, scattering the messages onto numerous properties so
  6189. 2
  6190. that write operations involving only a few messages will not require
  6191. 2
  6192. recopying of the entire list.
  6193. 2
  6194.  
  6195. 2
  6196. In nearly all respects it behaves as the ordinary Mail Recipient,
  6197. 2
  6198. except that it is faster for certain kinds of operations.
  6199. 2
  6200.  
  6201. 2
  6202. Certain unimplemented verbs, like :date_sort(), and :messages()
  6203. 2
  6204. currently return E_VERBNF.
  6205. 2
  6206.  
  6207. 2
  6208. To convert an existing $mail_recipient-child (call it #MR) into a
  6209. 2
  6210. $big_mail_recipient-child the basic procedure is
  6211. 2
  6212.  
  6213. 2
  6214.     ;;something.foo= #MR:messages();
  6215. 2
  6216.     @rmm 1-$ from #MR
  6217. 2
  6218.     @unrmm expunge
  6219. 2
  6220.     @chparent #MR to $big_mail_recipient
  6221. 2
  6222.     ;#MR:receive_batch(@something.foo);
  6223. 38
  6224. 5
  6225. 4
  6226. 2
  6227. 0
  6228. 22901
  6229. 0
  6230. 743668054
  6231. 2
  6232. 1
  6233. #17
  6234. The Body Bag
  6235.  
  6236. 16
  6237. 2
  6238. -1
  6239. 337
  6240. -1
  6241. 1
  6242. -1
  6243. 29
  6244. 3
  6245. accept
  6246. 2
  6247. 173
  6248. -1
  6249. confunc
  6250. 2
  6251. 173
  6252. -1
  6253. who_location_msg
  6254. 38
  6255. 173
  6256. -1
  6257. 0
  6258. 4
  6259. 5
  6260. 2
  6261. 4
  6262. 4
  6263. 1
  6264. 2
  6265. The Body Bag
  6266. 2
  6267. 5
  6268. 5
  6269. 2
  6270. 5
  6271. 4
  6272. 2
  6273. 0
  6274. 579
  6275. 0
  6276. 743619836
  6277. 2
  6278. 1
  6279. #18
  6280. Registration Database
  6281.  
  6282. 0
  6283. 38
  6284. -1
  6285. -1
  6286. -1
  6287. 39
  6288. -1
  6289. -1
  6290. 5
  6291. find* _only
  6292. 38
  6293. 173
  6294. -1
  6295. add
  6296. 38
  6297. 173
  6298. -1
  6299. init_for_core
  6300. 38
  6301. 173
  6302. -1
  6303. suspicious_address
  6304. 2
  6305. 173
  6306. -1
  6307. suspicious_userid
  6308. 2
  6309. 173
  6310. -1
  6311. 1
  6312. registrar
  6313. 8
  6314. 1
  6315. 2
  6316. 38
  6317. 5
  6318. 2
  6319.  
  6320. 38
  6321. 5
  6322. 5
  6323. 38
  6324. 1
  6325. 4
  6326. 4
  6327. 2
  6328.  
  6329. 2
  6330.  
  6331. 4
  6332. 3
  6333. 2
  6334. any.orion
  6335. 2
  6336. none
  6337. 2
  6338. ORION
  6339. 4
  6340. 3
  6341. 4
  6342. 1
  6343. 4
  6344. 1
  6345. 1
  6346. 228
  6347. 4
  6348. 2
  6349. 4
  6350. 1
  6351. 1
  6352. 82
  6353. 4
  6354. 1
  6355. 1
  6356. 337
  6357. 4
  6358. 8
  6359. 4
  6360. 1
  6361. 1
  6362. 77
  6363. 4
  6364. 1
  6365. 1
  6366. 78
  6367. 4
  6368. 1
  6369. 1
  6370. 79
  6371. 4
  6372. 1
  6373. 1
  6374. 146
  6375. 4
  6376. 1
  6377. 1
  6378. 147
  6379. 4
  6380. 1
  6381. 1
  6382. 154
  6383. 4
  6384. 1
  6385. 1
  6386. 158
  6387. 4
  6388. 1
  6389. 1
  6390. 346
  6391. 38
  6392. 0
  6393. 5
  6394. 38
  6395. 4
  6396. 4
  6397. 1
  6398. 2
  6399. Registration Database
  6400. 38
  6401. 5
  6402. 5
  6403. 38
  6404. 5
  6405. 4
  6406. 2
  6407. 0
  6408. 438440
  6409. 0
  6410. 743667395
  6411. 2
  6412. 1
  6413. #19
  6414. Player-Creation-Log
  6415.  
  6416. 0
  6417. 38
  6418. -1
  6419. -1
  6420. -1
  6421. 16
  6422. -1
  6423. -1
  6424. 4
  6425. display_seq_headers
  6426. 2
  6427. 173
  6428. -1
  6429. msg_summary_line
  6430. 2
  6431. 173
  6432. -1
  6433. init_for_core
  6434. 2
  6435. 173
  6436. -1
  6437. is_usable_by
  6438. 38
  6439. 165
  6440. -1
  6441. 15
  6442. autoregistration_player
  6443.  a
  6444.  b
  6445.  c
  6446.  d
  6447.  e
  6448.  f
  6449.  g
  6450.  h
  6451.  i
  6452.  j
  6453.  k
  6454.  l
  6455.  m
  6456.  n
  6457. 37
  6458. 1
  6459. 49853
  6460. 38
  6461. 5
  6462. 4
  6463. 1
  6464. 2
  6465. ORION
  6466. 38
  6467. 0
  6468. 4
  6469. 2
  6470. 0
  6471. 0
  6472. 4
  6473. 7
  6474. 4
  6475. 6
  6476. 2
  6477.  a
  6478. 0
  6479. 1
  6480. 0
  6481. -1465213997
  6482. 2
  6483. Wizard (#2)
  6484. 2
  6485. *Player-Creation-Log (#19)
  6486. 2
  6487. The_Demolished_Man (#77)
  6488. 4
  6489. 6
  6490. 2
  6491.  c
  6492. 0
  6493. 2
  6494. 0
  6495. -1465213975
  6496. 2
  6497. Wizard (#2)
  6498. 2
  6499. *Player-Creation-Log (#19)
  6500. 2
  6501. LapDog (#78)
  6502. 4
  6503. 6
  6504. 2
  6505.  d
  6506. 0
  6507. 3
  6508. 0
  6509. -1465213946
  6510. 2
  6511. Wizard (#2)
  6512. 2
  6513. *Player-Creation-Log (#19)
  6514. 2
  6515. Dead_Meat (#79)
  6516. 4
  6517. 6
  6518. 2
  6519.  e
  6520. 0
  6521. 4
  6522. 0
  6523. -1465205326
  6524. 2
  6525. Wizard (#2)
  6526. 2
  6527. *Player-Creation-Log (#19)
  6528. 2
  6529. guest (#82)
  6530. 4
  6531. 6
  6532. 2
  6533.  f
  6534. 0
  6535. 5
  6536. 0
  6537. -1465142484
  6538. 2
  6539. Wizard (#2)
  6540. 2
  6541. *Player-Creation-Log (#19)
  6542. 2
  6543. JL (#146)
  6544. 4
  6545. 6
  6546. 2
  6547.  g
  6548. 0
  6549. 6
  6550. 0
  6551. -1465141018
  6552. 2
  6553. Wizard (#2)
  6554. 2
  6555. *Player-Creation-Log (#19)
  6556. 2
  6557. LiverSpot (#147)
  6558. 4
  6559. 6
  6560. 2
  6561.  h
  6562. 0
  6563. 7
  6564. 0
  6565. -1465130308
  6566. 2
  6567. Wizard (#2)
  6568. 2
  6569. *Player-Creation-Log (#19)
  6570. 2
  6571. Mark (#154)
  6572. 38
  6573. 0
  6574. 4
  6575. 1
  6576. 2
  6577. ORION
  6578. 38
  6579. 0
  6580. 4
  6581. 1
  6582. 2
  6583. ORION
  6584. 38
  6585. 0
  6586. 4
  6587. 1
  6588. 2
  6589. none
  6590. 38
  6591. 0
  6592. 4
  6593. 1
  6594. 2
  6595. ORION
  6596. 38
  6597. 0
  6598. 4
  6599. 1
  6600. 2
  6601. ORION
  6602. 38
  6603. 0
  6604. 4
  6605. 1
  6606. 2
  6607. Orion
  6608. 38
  6609. 0
  6610. 4
  6611. 1
  6612. 2
  6613. Orion
  6614. 38
  6615. 0
  6616. 4
  6617. 2
  6618. 0
  6619. 0
  6620. 4
  6621. 4
  6622. 4
  6623. 6
  6624. 2
  6625.  i
  6626. 0
  6627. 8
  6628. 0
  6629. -1465116197
  6630. 2
  6631. Wizard (#2)
  6632. 2
  6633. *Player-Creation-Log (#19)
  6634. 2
  6635. Betsy (#158)
  6636. 4
  6637. 6
  6638. 2
  6639.  l
  6640. 0
  6641. 9
  6642. 0
  6643. -1465041735
  6644. 2
  6645. Bob (#2)
  6646. 2
  6647. *Player-Creation-Log (#19)
  6648. 2
  6649. builder (#228)
  6650. 4
  6651. 6
  6652. 2
  6653.  m
  6654. 0
  6655. 10
  6656. 0
  6657. -1464183662
  6658. 2
  6659. Bob (#2)
  6660. 2
  6661. *Player-Creation-Log (#19)
  6662. 2
  6663. Trygve (#337)
  6664. 4
  6665. 6
  6666. 2
  6667.  n
  6668. 0
  6669. 11
  6670. 0
  6671. -1464094740
  6672. 2
  6673. LiverSpot (#147)
  6674. 2
  6675. *Player-Creation-Log (#19)
  6676. 2
  6677. shelby (#346)
  6678. 38
  6679. 0
  6680. 4
  6681. 2
  6682. 0
  6683. 1
  6684. 4
  6685. 2
  6686. 4
  6687. 3
  6688. 2
  6689.  b
  6690. 0
  6691. 7
  6692. 4
  6693. 2
  6694. 0
  6695. 1
  6696. 0
  6697. -1465213997
  6698. 4
  6699. 3
  6700. 2
  6701.  j
  6702. 0
  6703. 4
  6704. 4
  6705. 2
  6706. 0
  6707. 8
  6708. 0
  6709. -1465116197
  6710. 38
  6711. 0
  6712. 4
  6713. 1
  6714. 2
  6715. any.orion
  6716. 38
  6717. 0
  6718. 4
  6719. 1
  6720. 2
  6721. none No Comment
  6722. 38
  6723. 0
  6724. 4
  6725. 1
  6726. 2
  6727. orion none
  6728. 38
  6729. 0
  6730. 0
  6731. 1
  6732. 38
  6733. 5
  6734. 1
  6735. 15
  6736. 38
  6737. 5
  6738. 1
  6739. 38
  6740. 38
  6741. 1
  6742. 2
  6743. n
  6744. 38
  6745. 1
  6746. 5
  6747. 38
  6748. 5
  6749. 0
  6750. -1464094740
  6751. 38
  6752. 1
  6753. 4
  6754. 0
  6755. 38
  6756. 0
  6757. 0
  6758. 1
  6759. 38
  6760. 5
  6761. 2
  6762. %n (%#) can't send to moderated list %t (%[#t]) directly.
  6763. 38
  6764. 5
  6765. 4
  6766. 0
  6767. 38
  6768. 5
  6769. 4
  6770. 0
  6771. 38
  6772. 5
  6773. 4
  6774. 1
  6775. 1
  6776. 2
  6777. 38
  6778. 1
  6779. 4
  6780. 2
  6781. 1
  6782. 2
  6783. 1
  6784. 19
  6785. 38
  6786. 1
  6787. 0
  6788. 2592000
  6789. 38
  6790. 5
  6791. 0
  6792. -1464094740
  6793. 38
  6794. 1
  6795. 4
  6796. 3
  6797. 2
  6798.  k
  6799. 0
  6800. 11
  6801. 4
  6802. 2
  6803. 0
  6804. 1
  6805. 0
  6806. -1465213997
  6807. 38
  6808. 0
  6809. 5
  6810. 38
  6811. 5
  6812. 5
  6813. 38
  6814. 5
  6815. 5
  6816. 38
  6817. 4
  6818. 4
  6819. 3
  6820. 2
  6821. Player-Creation-Log
  6822. 2
  6823. Player_Creation_Log
  6824. 2
  6825. PCL
  6826. 38
  6827. 1
  6828. 2
  6829. Log of player creations.
  6830. 38
  6831. 5
  6832. 4
  6833. 2
  6834. 0
  6835. 421467
  6836. 0
  6837. 743971078
  6838. 2
  6839. 1
  6840. #20
  6841. string utilities
  6842.  
  6843. 24
  6844. 2
  6845. -1
  6846. -1
  6847. -1
  6848. 1
  6849. -1
  6850. 21
  6851. 64
  6852. space
  6853. 38
  6854. 173
  6855. -1
  6856. left
  6857. 38
  6858. 173
  6859. -1
  6860. right
  6861. 38
  6862. 173
  6863. -1
  6864. centre center
  6865. 38
  6866. 173
  6867. -1
  6868. columnize columnise
  6869. 38
  6870. 173
  6871. -1
  6872. from_list
  6873. 38
  6874. 173
  6875. -1
  6876. english_list
  6877. 38
  6878. 173
  6879. -1
  6880. names_of
  6881. 38
  6882. 173
  6883. -1
  6884. from_seconds
  6885. 38
  6886. 173
  6887. -1
  6888. trim
  6889. 38
  6890. 173
  6891. -1
  6892. triml
  6893. 38
  6894. 173
  6895. -1
  6896. trimr
  6897. 38
  6898. 173
  6899. -1
  6900. strip_chars
  6901. 38
  6902. 173
  6903. -1
  6904. strip_all_but
  6905. 38
  6906. 173
  6907. -1
  6908. uppercase lowercase
  6909. 38
  6910. 173
  6911. -1
  6912. capitalize capitalise
  6913. 38
  6914. 173
  6915. -1
  6916. literal_object
  6917. 38
  6918. 173
  6919. -1
  6920. match
  6921. 38
  6922. 165
  6923. -1
  6924. match_str*ing
  6925. 38
  6926. 173
  6927. -1
  6928. match_object
  6929. 38
  6930. 173
  6931. -1
  6932. match_player
  6933. 38
  6934. 173
  6935. -1
  6936. match_player_or_object
  6937. 38
  6938. 173
  6939. -1
  6940. find_prefix
  6941. 38
  6942. 173
  6943. -1
  6944. index_d*elimited
  6945. 38
  6946. 165
  6947. -1
  6948. is_numeric
  6949. 38
  6950. 173
  6951. -1
  6952. ordinal
  6953. 38
  6954. 173
  6955. -1
  6956. group_number
  6957. 38
  6958. 173
  6959. -1
  6960. english_number
  6961. 2
  6962. 173
  6963. -1
  6964. english_ordinal
  6965. 38
  6966. 173
  6967. -1
  6968. english_ones
  6969. 38
  6970. 173
  6971. -1
  6972. english_tens
  6973. 38
  6974. 173
  6975. -1
  6976. subst*itute
  6977. 38
  6978. 173
  6979. -1
  6980. substitute_d*elimited
  6981. 2
  6982. 13
  6983. -1
  6984. _cap_property
  6985. 2
  6986. 165
  6987. -1
  6988. pronoun_sub
  6989. 2
  6990. 173
  6991. -1
  6992. pronoun_sub_secure
  6993. 38
  6994. 173
  6995. -1
  6996. pronoun_quote
  6997. 38
  6998. 173
  6999. -1
  7000. alt_pronoun_sub
  7001. 2
  7002. 13
  7003. -1
  7004. explode
  7005. 38
  7006. 173
  7007. -1
  7008. words
  7009. 38
  7010. 173
  7011. -1
  7012. word_start
  7013. 38
  7014. 173
  7015. -1
  7016. to_value
  7017. 38
  7018. 173
  7019. -1
  7020. prefix_to_value
  7021. 38
  7022. 173
  7023. -1
  7024. _tolist
  7025. 38
  7026. 173
  7027. -1
  7028. _unquote
  7029. 38
  7030. 173
  7031. -1
  7032. _toscalar
  7033. 38
  7034. 173
  7035. -1
  7036. parse_command
  7037. 2
  7038. 173
  7039. -1
  7040. from_value
  7041. 2
  7042. 173
  7043. -1
  7044. print
  7045. 38
  7046. 173
  7047. -1
  7048. print_suspended
  7049. 2
  7050. 173
  7051. -1
  7052. reverse
  7053. 38
  7054. 173
  7055. -1
  7056. char_list
  7057. 38
  7058. 173
  7059. -1
  7060. regexp_quote
  7061. 38
  7062. 173
  7063. -1
  7064. connection_hostname_bsd
  7065. 38
  7066. 173
  7067. -1
  7068. connection_hostname
  7069. 38
  7070. 173
  7071. -1
  7072. from_value_suspended
  7073. 2
  7074. 173
  7075. -1
  7076. end_expression
  7077. 38
  7078. 173
  7079. -1
  7080. first_word
  7081. 38
  7082. 173
  7083. -1
  7084. common
  7085. 38
  7086. 173
  7087. -1
  7088. title_list*c list_title*c
  7089. 38
  7090. 173
  7091. -1
  7092. name_and_number nn
  7093. 38
  7094. 173
  7095. -1
  7096. name_and_number_list
  7097. 38
  7098. 173
  7099. -1
  7100. columnize_suspended columnise_suspended
  7101. 38
  7102. 173
  7103. -1
  7104. a_or_an
  7105. 38
  7106. 173
  7107. -1
  7108. 5
  7109. digits
  7110. ascii
  7111. alphabet
  7112. use_article_a
  7113. use_article_an
  7114. 9
  7115. 2
  7116. 0123456789
  7117. 2
  7118. 5
  7119. 2
  7120.  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
  7121. 2
  7122. 5
  7123. 2
  7124. abcdefghijklmnopqrstuvwxyz
  7125. 2
  7126. 5
  7127. 4
  7128. 5
  7129. 2
  7130. unit
  7131. 2
  7132. unix
  7133. 2
  7134. one
  7135. 2
  7136. once
  7137. 2
  7138. utility
  7139. 38
  7140. 1
  7141. 4
  7142. 0
  7143. 38
  7144. 1
  7145. 5
  7146. 2
  7147. 4
  7148. 4
  7149. 2
  7150. 2
  7151. string
  7152. 2
  7153. utils
  7154. 2
  7155. 5
  7156. 4
  7157. 66
  7158. 2
  7159. For a complete description of a given verb, do `help $string_utils:verbname'
  7160. 2
  7161.  
  7162. 2
  7163.     Conversion routines:
  7164. 2
  7165.  
  7166. 2
  7167. :from_list    (list [,sep])                          => "foo1foo2foo3"
  7168. 2
  7169. :english_list (str-list[,none-str[,and-str[, sep]]]) => "foo1, foo2, and foo3"
  7170. 2
  7171. :title_list*c (obj-list[,none-str[,and-str[, sep]]]) => "foo1, foo2, and foo3"
  7172. 2
  7173.                                                   or => "Foo1, foo2, and foo3"
  7174. 2
  7175. :from_value   (value [,quoteflag [,maxlistdepth]])   => "{foo1, foo2, foo3}"
  7176. 2
  7177.  
  7178. 2
  7179. :english_number(42)          => "forty-two"
  7180. 2
  7181. :english_ordinal(42)         => "forty-second"
  7182. 2
  7183. :ordinal(42)                 => "42nd"
  7184. 2
  7185. :group_number(42135 [,sep])  => "42,135"
  7186. 2
  7187.  
  7188. 2
  7189.     Type checking:
  7190. 2
  7191.  
  7192. 2
  7193. :is_numeric   (string) => return true if string is composed entirely of digits
  7194. 2
  7195.  
  7196. 2
  7197.     Parsing:
  7198. 2
  7199.  
  7200. 2
  7201. :explode (string,char) -- string => list of words delimited by char
  7202. 2
  7203. :words   (string)      -- string => list of words (as with command line parser)
  7204. 2
  7205. :word_start (string)   -- string => list of start-end pairs.
  7206. 2
  7207.  
  7208. 2
  7209.     Matching:
  7210. 2
  7211.  
  7212. 2
  7213. :match_string (string, pattern, options)       => * wildcard matching
  7214. 2
  7215. :find_prefix  (prefix, string-list)=>list index of element starting with prefix
  7216. 2
  7217. :index_delimited(string,target[,case]) =>index of delimited string occurrence
  7218. 2
  7219. :match        (string, [obj-list, prop-name]+) => matching object
  7220. 2
  7221. :match_player (string-list[,me-object])        => list of matching players
  7222. 2
  7223. :match_object (string, location)               => default object match...
  7224. 2
  7225.  
  7226. 2
  7227.     Pretty printing:
  7228. 2
  7229.  
  7230. 2
  7231. :space         (n/string[,filler])     => n spaces
  7232. 2
  7233. :left          (string,width[,filler]) => left justified string in field 
  7234. 2
  7235. :right         (string,width[,filler]) => right justified string in field
  7236. 2
  7237. :center/re     (string,width[,filler]) => centered string in field
  7238. 2
  7239. :columnize/se  (list,n[,width])        => list of strings in n columns
  7240. 2
  7241.  
  7242. 2
  7243.     Substitutions
  7244. 2
  7245.  
  7246. 2
  7247. :substitute (string,subst_list [,case])   -- general substitutions.
  7248. 2
  7249. :pronoun_sub (string/list[,who[,thing[,location]]])
  7250. 2
  7251.                                           -- pronoun substitutions.
  7252. 2
  7253. :pronoun_sub_secure (string[,who[,thing[,location]]],default)
  7254. 2
  7255.                                           -- substitute and check for names.
  7256. 2
  7257. :pronoun_quote (string/list/subst_list)   -- quoting for pronoun substitutions.
  7258. 2
  7259.  
  7260. 2
  7261.     Miscellaneous string munging:
  7262. 2
  7263.  
  7264. 2
  7265. :trim         (string)       => string with outside whitespace removed.
  7266. 2
  7267. :triml        (string)       => string with leading whitespace removed.
  7268. 2
  7269. :trimr        (string)       => string with trailing whitespace removed.
  7270. 2
  7271. :strip_chars  (string,chars) => string with all chars in `chars' removed.
  7272. 2
  7273. :strip_all_but(string,chars) => string with all chars not in `chars' removed.
  7274. 2
  7275. :capitalize/se(string)       => string with first letter capitalized.
  7276. 2
  7277. :uppercase/lowercase(string) => string with all letters upper or lowercase.
  7278. 2
  7279. :names_of     (list of OBJ)  => string with names and object numbers of items.
  7280. 2
  7281. :a_or_an      (word)         => "a" or "an" as appropriate for that word.
  7282. 2
  7283.  
  7284. 2
  7285.     A useful property:
  7286. 2
  7287.  
  7288. 2
  7289. .alphabet                    => "abcdefghijklmnopqrstuvwxyz"
  7290. 2
  7291. 5
  7292. 4
  7293. 2
  7294. 0
  7295. 68496
  7296. 0
  7297. 743619405
  7298. 2
  7299. 1
  7300. #21
  7301. building utilities
  7302.  
  7303. 24
  7304. 2
  7305. -1
  7306. -1
  7307. -1
  7308. 1
  7309. -1
  7310. 42
  7311. 5
  7312. make_exit
  7313. 2
  7314. 173
  7315. -1
  7316. set_names
  7317. 2
  7318. 165
  7319. -1
  7320. recreate
  7321. 2
  7322. 173
  7323. -1
  7324. transfer_ownership(useless)
  7325. 2
  7326. 169
  7327. -1
  7328. parse_names
  7329. 2
  7330. 173
  7331. -1
  7332. 0
  7333. 4
  7334. 5
  7335. 2
  7336. 4
  7337. 4
  7338. 2
  7339. 2
  7340. building
  7341. 2
  7342. utils
  7343. 2
  7344. 5
  7345. 4
  7346. 13
  7347. 2
  7348. Verbs useful for building.  For a complete description of a given verb, do `help $building_utils:verbname'.
  7349. 2
  7350.  
  7351. 2
  7352. make_exit(spec,source,dest[,don't-really-create]) => a new exit
  7353. 2
  7354.           spec is an exit-spec as described in `help @dig'
  7355. 2
  7356.  
  7357. 2
  7358. set_names(object, spec) - sets name and aliases for an object
  7359. 2
  7360. parse_names(spec) => list of {name, aliases}
  7361. 2
  7362.           in both of these, spec is of the form
  7363. 2
  7364.             <name>[[,:]<alias>,<alias>,...]
  7365. 2
  7366.           (as described in `help @rename')
  7367. 2
  7368.  
  7369. 2
  7370. recreate(object, newparent) - effectively recycle and recreate object
  7371. 2
  7372.           as a child of newparent
  7373. 2
  7374. 5
  7375. 4
  7376. 2
  7377. 0
  7378. 7048
  7379. 0
  7380. 743619406
  7381. 2
  7382. 1
  7383. #22
  7384. Verb Help DB
  7385.  
  7386. 16
  7387. 38
  7388. -1
  7389. -1
  7390. -1
  7391. 1
  7392. -1
  7393. 14
  7394. 3
  7395. find_topics
  7396. 38
  7397. 173
  7398. -1
  7399. get_topic
  7400. 2
  7401. 173
  7402. -1
  7403. dump_topic
  7404. 2
  7405. 173
  7406. -1
  7407. 0
  7408. 4
  7409. 5
  7410. 38
  7411. 4
  7412. 4
  7413. 2
  7414. 2
  7415. verbhelp
  7416. 2
  7417. vh
  7418. 38
  7419. 5
  7420. 2
  7421. A `help database' that knows about all of the documented verbs.
  7422. 38
  7423. 5
  7424. 4
  7425. 2
  7426. 0
  7427. 2482
  7428. 0
  7429. 743584526
  7430. 2
  7431. 1
  7432. #23
  7433. Core Utility Help
  7434.  
  7435. 16
  7436. 38
  7437. -1
  7438. -1
  7439. -1
  7440. 32
  7441. -1
  7442. -1
  7443. 3
  7444. find_topics
  7445. 38
  7446. 165
  7447. -1
  7448. get_topic
  7449. 38
  7450. 173
  7451. -1
  7452. dump_topic
  7453. 2
  7454. 173
  7455. -1
  7456. 31
  7457. $login
  7458. $container
  7459. $mail_agent
  7460. MR-subscribing
  7461. MR-naming
  7462. MR-access
  7463. $mail_recipient
  7464. receiving-mail
  7465. mail-format
  7466. mail-resolve
  7467. sending-mail
  7468. mail-system
  7469. $player_db
  7470. core-index
  7471. object-matching
  7472. $no_one
  7473. $exit
  7474. $room
  7475. $help
  7476. $generic_db
  7477. $generic_editor
  7478. $generic_help
  7479. $generic_options
  7480. MR-sequences
  7481. MR-reading
  7482. MR-writing
  7483. MR-searching
  7484. $housekeeper
  7485. $recycler
  7486. $error
  7487. $biglist
  7488. 36
  7489. 4
  7490. 70
  7491. 2
  7492. $login
  7493. 2
  7494. ------
  7495. 2
  7496. This object manages command parsing for unconnected players and governs the initiation of an actual connection.  There are verbs pertaining to registration, controlling player creation, and doing site-locks (see `help blacklist' on $wiz_help).
  7497. 2
  7498.  
  7499. 2
  7500. COMMANDS FOR UNCONNECTED PLAYERS
  7501. 2
  7502.  
  7503. 2
  7504. Recall that for each line that an unconnected player types, the server parses that line into words (the same way normal commands are parsed into a list of words that is then assigned to `args') and then #0:do_login_command is called.
  7505. 2
  7506.  
  7507. 2
  7508.   :parse_command (@args) => {verb, @args}
  7509. 2
  7510.     given the sequence of arguments that were fed to #0:do_login_command
  7511. 2
  7512.     this returns the name of a verb on $login to be called together with a 
  7513. 2
  7514.     list of arguments to be passed to it.
  7515. 2
  7516.  
  7517. 2
  7518. By default this just returns args iff args[1] names an actual verb on $login that is +x and has args {"any","none","any"}.  Otherwise, it returns one of
  7519. 2
  7520.  
  7521. 2
  7522.   .blank_command   -- verb to call if command line is empty
  7523. 2
  7524.   .bogus_command   -- verb to call if command line otherwise unintelligible
  7525. 2
  7526.  
  7527. 2
  7528. In both cases :parse_command returns a verbname followed by the entire args list passed to it (including the would-be verb at the beginning if any).
  7529. 2
  7530.  
  7531. 2
  7532. Currently the following verbs are availabe to non-connected players
  7533. 2
  7534.  
  7535. 2
  7536.   h*elp @h*elp       -- print .welcome_message
  7537. 2
  7538.   ?                  -- print a short list of available commands
  7539. 2
  7540.   w*ho @w*ho         -- print a list of logged in players (excluding wizards)
  7541. 2
  7542.   co*nnect @co*nnect -- connect to an existing player
  7543. 2
  7544.   cr*eate @cr*eate   -- create a new player
  7545. 2
  7546.   up*time @up*time   -- tell how long the server has been running
  7547. 2
  7548.   version @version   -- tell which version of the server is running
  7549. 2
  7550.   q*uit @q*uit       -- logoff
  7551. 2
  7552.  
  7553. 2
  7554. Adding a new command is fairly straightforward; just create a verb on $login, making sure a previous verb doesn't already match the name you want to give it.  Then give it args of "any" "none "any" and make sure it is +x.  Such a verb should begin with `if (caller != #0) return E_PERM; ...' so as to prevent anyone other from a not-logged-in player from making use of it.
  7555. 2
  7556.  
  7557. 2
  7558. CUSTOMIZATIONS
  7559. 2
  7560.  
  7561. 2
  7562.   .welcome_message 
  7563. 2
  7564.     -- the message for "help" to print.
  7565. 2
  7566.   .create_enabled 
  7567. 2
  7568.     == 0 => @create prints .registration_string if one tries to use it
  7569. 2
  7570.     == 1 => anyone from a non-blacklisted site (see `help blacklist')
  7571. 2
  7572.             may use @create to make a new player
  7573. 2
  7574.  
  7575. 2
  7576.   .registration_address
  7577. 2
  7578.     -- an email address for character creation requests
  7579. 2
  7580.   .registration_string  
  7581. 2
  7582.     -- string to print to players to give them information about how to get 
  7583. 2
  7584.        a character created for them, .registration_address is substituted 
  7585. 2
  7586.        for %e, % for %%
  7587. 2
  7588.   .newt_registration_string
  7589. 2
  7590.     -- string to print to @newted players (see `help @newt').
  7591. 2
  7592.        same substitutions as for .registration_string.
  7593. 2
  7594.  
  7595. 2
  7596. Other verbs
  7597. 2
  7598.    :registration_string()      => .registration_string with substitutions
  7599. 2
  7600.    :newt_registration_string() => .newt_registration_string with substitutions
  7601. 2
  7602.    :player_creation_enabled(connection) 
  7603. 2
  7604.        decides whether someone on connection should be allowed to create 
  7605. 2
  7606.        a player.  If you decide this shouldn't depend strictly on the blacklist
  7607. 2
  7608.        and on the value of .create_enabled, here's where the extra code can go.
  7609. 2
  7610.    :check_for_shutdown()
  7611. 2
  7612.        prints a warning message to append to the login banner in the event 
  7613. 2
  7614.        that the server will be going down soon.
  7615. 2
  7616.    :check_player_db()
  7617. 2
  7618.        prints a warning message to append to the login banner in the event 
  7619. 2
  7620.        that $player_db is being reloaded to warn players that their character
  7621. 2
  7622.        names might not be recognized.
  7623. 2
  7624.  
  7625. 2
  7626. SITE LOCKS
  7627. 2
  7628. see `help blacklist'
  7629. 2
  7630.  
  7631. 38
  7632. 5
  7633. 4
  7634. 29
  7635. 2
  7636. The Generic Container (for programmers)
  7637. 2
  7638.  
  7639. 2
  7640. In addition to the command verbs described under `help containers'
  7641. 2
  7642. and the _msg properties described in `help container-messages',
  7643. 2
  7644. the following verbs and properties are available for use within programs
  7645. 2
  7646.  
  7647. 2
  7648. .opened == TRUE iff the container is open
  7649. 2
  7650. .dark   == TRUE iff the contents of the container may be seen
  7651. 2
  7652. .opaque -- describes the correlation between .open and .dark
  7653. 2
  7654.    == 0  container is always !dark
  7655. 2
  7656.    == 1  container is dark iff it is closed
  7657. 2
  7658.    == 2  container is always dark              
  7659. 2
  7660.  
  7661. 2
  7662. :set_opaque(newvalue)   
  7663. 2
  7664.   changes the .opaque value for the container
  7665. 2
  7666.   => newvalue or E_PERM or E_INVARG
  7667. 2
  7668.  
  7669. 2
  7670. :set_opened(newvalue)   
  7671. 2
  7672.   opens/closes the container (updates .open and .dark) according to newvalue
  7673. 2
  7674.   => newvalue or E_PERM
  7675. 2
  7676.  
  7677. 2
  7678. :is_openable_by(player) 
  7679. 2
  7680.  what the :open command uses to test whether the player should be able to open
  7681. 2
  7682.  the container.  By default this refers to .open_key  (set by
  7683. 2
  7684.  @(un)lock_for_open), but the object owner is free to customize this.
  7685. 2
  7686.  
  7687. 2
  7688. N.B.:  There is no way to directly set .dark; .dark can be changed only by 
  7689. 2
  7690. changing one of .opaque or .opened.  Use :set_opaque(0) and :set_opaque(2)
  7691. 2
  7692. to have .dark change independently of the value of .opened.
  7693. 38
  7694. 5
  7695. 4
  7696. 68
  7697. 2
  7698. $mail_agent
  7699. 2
  7700.  
  7701. 2
  7702. This object contains a two distinct sets of routines:
  7703. 2
  7704.  
  7705. 2
  7706.   1.  utilities for performing basic mailsystem functions, e.g.,
  7707. 2
  7708.       matching on recipient names, resolving mail forwarding, 
  7709. 2
  7710.       formatting messages, sending messages
  7711. 2
  7712.  
  7713. 2
  7714. Recipient Matching
  7715. 2
  7716.  
  7717. 2
  7718. match           - match on a $mail_recipient
  7719. 2
  7720. match_recipient - match on either a $mail_recipient or a player
  7721. 2
  7722. match_failed    - print angry messages to the user for $failed/ambiguous_match
  7723. 2
  7724.  
  7725. 2
  7726. look_self  - provides a list of available $mail_recipients
  7727. 2
  7728. check_names
  7729. 2
  7730. touch
  7731. 2
  7732. accept
  7733. 2
  7734.  
  7735. 2
  7736. Message Format
  7737. 2
  7738.  
  7739. 2
  7740. make_message        - produces a message in the canonical transmission format
  7741. 2
  7742. name                - single recipient     => string for address field
  7743. 2
  7744. name_list           - list of recipients   => string for address field
  7745. 2
  7746. parse_address_field - address field string => object list
  7747. 2
  7748.  
  7749. 2
  7750. Sending Messages
  7751. 2
  7752.  
  7753. 2
  7754. send_message  - advertised message sending routine.
  7755. 2
  7756. raw_send      - raw message sending routine 
  7757. 2
  7758.                 (only called by $mail_editor:send and this:send_message)
  7759. 2
  7760. resolve_addr  - converts a given list recipients into a list of actual 
  7761. 2
  7762.                 recipients and objects to be notified.
  7763. 2
  7764. sends_to      - Does X forward (transitively) to Y
  7765. 2
  7766.  
  7767. 2
  7768. Mail Options
  7769. 2
  7770.  
  7771. 2
  7772. option         
  7773. 2
  7774. option_verbose
  7775. 2
  7776.  
  7777. 2
  7778.   2.  canonical versions of mail_recipient verbs
  7779. 2
  7780.  
  7781. 2
  7782. Ideally, the verbs to perform operations on a given mail recipient would be located on the recipient itself, except for the fact that these verbs also need to be located on players, which for various reasons, shouldn't be children of $mail_recipient.  Multiple inheritance would solve our problems, but we don't have it yet.  Ergo, both $mail_recipient and $player refer to the following verbs here:
  7783. 2
  7784.  
  7785. 2
  7786. display_seq_full     print entire text of messages  (@read)
  7787. 2
  7788. display_seq_headers  print headers of messages      (@mail)
  7789. 2
  7790. rm_message_seq       remove messages                (@rmm)
  7791. 2
  7792. undo_rmm             undo last rm_message_seq       (@unrmm)
  7793. 2
  7794. expunge_rmm          flush removed messages         (@unrmm expunge)
  7795. 2
  7796. list_rmm             list removed messages          (@unrmm list)
  7797. 2
  7798. renumber             renumber messages              (@renumber)
  7799. 2
  7800. msg_summary_line     msg header => display_seq_headers/list_rmm summary line
  7801. 2
  7802.  
  7803. 2
  7804. parse_message_seq    command line msg sequence spec => message sequence
  7805. 2
  7806. new_message_num      => message number of next new message
  7807. 2
  7808. length_all_msgs      => number of messages (total)
  7809. 2
  7810. length_num_le        => number of messages numbered <= some number
  7811. 2
  7812. length_date_le       => number of messages dated <= some date
  7813. 2
  7814. exists_num_eq        => true iff there exists a messsage with the given number
  7815. 2
  7816. from_msg_seq         => message sequence of msgs from given sender(s)
  7817. 2
  7818. to_msg_seq           => message sequence of msgs to given recipient(s)
  7819. 2
  7820. subject_msg_seq      => message sequence of msgs with subjects containing text
  7821. 2
  7822. body_msg_seq         => message sequence of msgs with bodies containing text
  7823. 2
  7824. messages_in_seq      => list of {message number, message} pairs
  7825. 2
  7826.  
  7827. 2
  7828. messages             == :messages_in_seq(1,:length_all_msgs()+1)   (obsolete)
  7829. 2
  7830.  
  7831. 2
  7832. The $mail_agent versions of these verbs are set_task_perms(caller_perms()) and perform their operations on caller, which in turn is assumed to have done any necessary security checks.
  7833. 38
  7834. 5
  7835. 4
  7836. 38
  7837. 2
  7838. Subscribing to Mail Recipients
  7839. 2
  7840. ------------------------------
  7841. 2
  7842. There are two notions of being "subscribed" to a mailing list/recipient.
  7843. 2
  7844.  
  7845. 2
  7846. (1) Hard subscribed == being on the recipient's .mail_forward list so that mail sent to this list is forwarded to one's own .messages as well (see `help mail-forwarding').
  7847. 2
  7848.  
  7849. 2
  7850. (2) Soft subscribed == keeping track of a current message for this recipient and (optionally) being on the recipient's .mail_notify list.
  7851. 2
  7852.  
  7853. 2
  7854.  
  7855. 2
  7856. Each player has a .current_message property that contains, for each recipient the player cares to keep track of, a current message number and a last read date.
  7857. 2
  7858.  
  7859. 2
  7860. player:current_message(rcpt)                 (somewhat obsolete)
  7861. 2
  7862.  => player's current message number for rcpt 
  7863. 2
  7864.  
  7865. 2
  7866. player:get_current_message(rcpt) 
  7867. 2
  7868.  => player's {current message number for rcpt, last-read-date for rcpt}
  7869. 2
  7870.  
  7871. 2
  7872. player:make_current_message(rcpt)
  7873. 2
  7874.  => adds a current_message entry for rcpt  (NOOP if rcpt == player)
  7875. 2
  7876.  
  7877. 2
  7878. player:set_current_message(rcpt,n|E_NONE,[,date])
  7879. 2
  7880.  => sets player's current message number for rcpt to n iff n!=E_NONE
  7881. 2
  7882.     updates the last-read-date for rcpt to date iff date > last-read-date
  7883. 2
  7884.  
  7885. 2
  7886. player:kill_current_message(rcpt)
  7887. 2
  7888.  => removes current-message info for rcpt  (NOOP if rcpt == player)
  7889. 2
  7890.  
  7891. 2
  7892.  
  7893. 2
  7894. On $mail_recipient, .mail_forward and .mail_notify are -c so one needs to use the following verbs to actually modify them.
  7895. 2
  7896.  
  7897. 2
  7898.     :add_forward(@new_recipients)
  7899. 2
  7900.     :delete_forward(@recpients)
  7901. 2
  7902.     :add_notify(@new_notifiees)
  7903. 2
  7904.     :delete_notify(@notifiees)
  7905. 2
  7906.  
  7907. 2
  7908. A recipient's owner is, of course, allowed to make arbitrary changes to .mail_forward and .mail_notify.  However, the default versions of these verbs also allow any player to add him/herself to a recipient's .mail_forward or .mail_notify if the recipient is readable (see `help MR-access') by him/her.
  7909. 2
  7910.  
  7911. 2
  7912. Likewise any player may use the :delete* verbs to delete him/herself from any .mail_forward/.mail_notify list, regardless of his actual access to the list.
  7913. 38
  7914. 5
  7915. 4
  7916. 15
  7917. 2
  7918. One may always refer to a list by its object number.  In order to refer to it by name, it must be contained in $mail_agent, which holds all mailing lists, i.e., those that you want others to be able to refer to by name.
  7919. 2
  7920.  
  7921. 2
  7922. The .aliases field holds the names by which one may refer to the list, but only those names not containing spaces actually count for anything.  As with certain other types of objects (e.g., players), set_aliases() needs to be called in order to change the .aliases field.
  7923. 2
  7924.  
  7925. 2
  7926. $mail_agent:match(name) 
  7927. 2
  7928.     is the canonical way to obtain the objectid of a mailing list 
  7929. 2
  7930.     given the name ("*" is assumed; an initial "*" will be dropped).
  7931. 2
  7932.  
  7933. 2
  7934. $mail_agent:match_recipient(name) 
  7935. 2
  7936.     is the canonical way to obtain the objectid of a list or player
  7937. 2
  7938.     matching the given name.  An initial "*" indicates that this is 
  7939. 2
  7940.     supposed to be a list.
  7941. 2
  7942.  
  7943. 2
  7944. $mail_agent:match_failed(objid,name) 
  7945. 2
  7946.     is the mail_recipient counterpart to $command_utils:object_match_failed
  7947. 38
  7948. 5
  7949. 4
  7950. 32
  7951. 2
  7952. Controlling Access to Mail Recipients
  7953. 2
  7954. -------------------------------------
  7955. 2
  7956. :is_writable_by(one) - one may alter/add/remove saved messages
  7957. 2
  7958. :is_readable_by(one) - one may read messages.
  7959. 2
  7960. :is_usable_by(one)   - one may send to this list
  7961. 2
  7962.  
  7963. 2
  7964. By default, these verbs refer to the following properties:
  7965. 2
  7966.  
  7967. 2
  7968. writers   - list of players other from the owner who can do anything
  7969. 2
  7970. readers   - if == 1, indicates a public mailing list.
  7971. 2
  7972.             list of additional readers (by default anyone who receives mail 
  7973. 2
  7974.             sent to the list can read the saved messages).
  7975. 2
  7976. moderated - if false, indicates a normal mail recipient everyone can send to.
  7977. 2
  7978.             otherwise this should be a list of approved senders.
  7979. 2
  7980.  
  7981. 2
  7982. Terminology:
  7983. 2
  7984.   A mailing list is "public" if everyone can read it.
  7985. 2
  7986.   A mailing list is "moderated" if not everyone can send to it.
  7987. 2
  7988.  
  7989. 2
  7990. Note that while being able to write to a recipient implies being able to read from it or send to it, neither of read-ability or send-ability implies the other.
  7991. 2
  7992.  
  7993. 2
  7994. It is highly recommended that if you are creating custom mail recipients with variable reader/sender lists, i.e., you find you need to write your own :is_readable/usable/writabe_by verbs, you are best off if such verbs are of the form
  7995. 2
  7996.  
  7997. 2
  7998.   return pass(@args) || << your_test(args[1]) >>
  7999. 2
  8000.  
  8001. 2
  8002. and have .writers == .readers == {} and .moderated == 1.  This will ensure
  8003. 2
  8004.  (1) wizards having write access
  8005. 2
  8006.      --- necessary in order for :receive_message to work
  8007. 2
  8008.  (2) writers being able to read and send (the converse being a ludicrous 
  8009. 2
  8010.      situation), 
  8011. 2
  8012.  (3) persons on the mail_forward list of someone with reader access will also
  8013. 2
  8014.      have read access (convenient).
  8015. 38
  8016. 5
  8017. 4
  8018. 19
  8019. 2
  8020. Generic Mail Recipient
  8021. 2
  8022. ----------------------
  8023. 2
  8024. A "mail recipient" is, by definition, an object that can be sent mail.
  8025. 2
  8026. Mail recipients must either be players or descendants of $mail_recipient.
  8027. 2
  8028.  
  8029. 2
  8030. One source of confusion is that the terms "mail recipient", "mail folder", "mailing list", and "mail collection" really all refer to the same kind of object.  It so happens that $mail_recipient serve several distinct functions and we tend to use whatever term happens to best match the application under discussion, e.g., it's a "mailing list" if we're playing with its .mail_forward property but it's also a "mail folder" if we're examining the messages that have been saved in it.
  8031. 2
  8032.  
  8033. 2
  8034. Note that, by default, a freshly created recipient is accessibly only by you.  If you wish to make a publically accessible recipient, set .readers=1.  Furthermore, if you want to allow a message on your recipient to be removed by its sender without your intervention, set .rmm_own_msgs=1.  Finally, in order for other players to be able to refer to your recipient by name, the object must reside in $mail_agent.  $mail_agent will not accept the object unless it has an actual description and a name distinct from all other mail recipient names/aliases.
  8035. 2
  8036.  
  8037. 2
  8038. Topics:
  8039. 2
  8040.  
  8041. 2
  8042.   MR-access       -- controlling read, write and send access to a recipient
  8043. 2
  8044.   MR-naming       -- naming conventions and how to match on recipient names
  8045. 2
  8046.   MR-sequences    -- message sequence arguments to $mail_recipient verbs
  8047. 2
  8048.   MR-reading      -- reading messages/headers on recipients
  8049. 2
  8050.   MR-searching    -- searching message lists for patterns in certain fields
  8051. 2
  8052.   MR-writing      -- removing and renumbering messages
  8053. 2
  8054.   MR-subscribing  -- updating .mail_forward, .mail_notify 
  8055. 2
  8056.                        and the story of .current_message
  8057. 38
  8058. 5
  8059. 4
  8060. 24
  8061. 2
  8062. Receiving Mail
  8063. 2
  8064. --------------
  8065. 2
  8066. By definition a recipient "receives" a mail message when its :receive_message verb is called with that message as an argument.
  8067. 2
  8068.  
  8069. 2
  8070. :new_message_num()
  8071. 2
  8072. => number that will be assigned to the next incoming message.
  8073. 2
  8074. By default this returns the maximum of the message numbers appearing in 
  8075. 2
  8076. messages or .messages_going, incremented by 1.  If the recipient is a player
  8077. 2
  8078. then the value returned will be 1 higher if it conflicts with the player's 
  8079. 2
  8080. current message number for him/herself.
  8081. 2
  8082.  
  8083. 2
  8084. :receive_message(msg,sender)
  8085. 2
  8086. By default this first calls this:new_message_num to obtain a message number to assign to the incoming message and then appends {num,msg} to this.messages.  
  8087. 2
  8088. `sender', the original sender, is supplied in case one wants different 
  8089. 2
  8090. action depending on who is sending the message (e.g., mail-gagging).
  8091. 2
  8092. The return value should be an error or string if :receive_message is considered to have failed in some way.  Otherwise, a number should be returned --- this number is given to any :notify_mail routines that are called and is expected to either be 0 or the number assigned to the incoming message.
  8093. 2
  8094.  
  8095. 2
  8096. Note that :receive_message can do arbitrary things, including resending the same message to a new destination.  Hacking :receive_message to resend messages is different from using .mail_forward in the following respects
  8097. 2
  8098.   (1) the resent message is considered to be a distinct message having this 
  8099. 2
  8100.       object as its "author" --- i.e., the From: line will necessarily be 
  8101. 2
  8102.       different.
  8103. 2
  8104.   (2) since this "forwarding" is invisible to the mailsystem, 
  8105. 2
  8106.       there is no protection against loops and multiple copies.
  8107. 2
  8108.  
  8109. 38
  8110. 5
  8111. 4
  8112. 34
  8113. 2
  8114. Mail Transmission Format
  8115. 2
  8116. ------------------------
  8117. 2
  8118. There is a standard message format used for transmitting messages.  This is the format that $mail_editor:make_message produces, and that :receive_message verbs on players and $mail_recipients expect to see.  The (currently experimental) @refile and @copym commands also use this format to transfer messages.
  8119. 2
  8120.  
  8121. 2
  8122. This *transmission* format is distinct from the *storage* format, though, for convenience this same format is often used as well for storing messages in player collections and ordinary $mail_recipient children though, in general, there is no requirement that this be the case.
  8123. 2
  8124.  
  8125. 2
  8126. A transmitted message is a list in the following form
  8127. 2
  8128.  
  8129. 2
  8130.    date (number),
  8131. 2
  8132.      the time() value at the time the message was sent.
  8133. 2
  8134.    from (string),
  8135. 2
  8136.      the sending object (address list form)
  8137. 2
  8138.      if this is not a player, an additional header will indicate the 
  8139. 2
  8140.      current ownership of the object.
  8141. 2
  8142.    to  (string),
  8143. 2
  8144.      recipients (address list form) which can either be players 
  8145. 2
  8146.      or $mail_recipient descendents.
  8147. 2
  8148.    subject (string),
  8149. 2
  8150.      subject of the message, or " " if there is no subject,
  8151. 2
  8152.   @additional optional headers (list of strings),
  8153. 2
  8154.      each header has the form "<header-name>: text" where <header-name>: 
  8155. 2
  8156.      is padded out to a width of 10 columns for the convenience of 
  8157. 2
  8158.      :display_message.  Currently "Reply-to: <address list>" is the only 
  8159. 2
  8160.      additional header in use,
  8161. 2
  8162.    "",
  8163. 2
  8164.   @body of message (list of strings)
  8165. 2
  8166.  
  8167. 2
  8168. Note that the from, to and subject lines do *not* include a header name like "From:", "To:", or "Subject:".  The @'s indicate that the lists in question get spliced in (as usual), thus the entire message is a list whose first element is a number and the rest are strings.
  8169. 2
  8170.  
  8171. 2
  8172. The address lists that appear in the from and to lines is a string in the form a sequence of object ids, each enclosed in parentheses and preceded by optional text, e.g.,
  8173. 2
  8174.  
  8175. 2
  8176.   "*Core-DB-Issues (#8175), Rog (#4292), and Haakon (#2)"
  8177. 2
  8178.  
  8179. 2
  8180. The text is intended to give the current name of each object for the benefit of human readers, but is actually ignored by all header parsing routines.  The convention is that the text is either a player name or a * followed by a mailing list name.
  8181. 38
  8182. 5
  8183. 4
  8184. 52
  8185. 2
  8186. Resolving Mail Forwarding & Notification
  8187. 2
  8188. ----------------------------------------
  8189. 2
  8190. For each recipient of a given mail message, the following two verbs are called to determine where the message should actually go and who should be notified about it:
  8191. 2
  8192.  
  8193. 2
  8194. :mail_forward([from])
  8195. 2
  8196.     should return either
  8197. 2
  8198.      . a list of objects (either players or $mail_recipients)
  8199. 2
  8200.          to which mail for this recipient will be redirected.
  8201. 2
  8202.      . a string error message to be printed to the player sending the message.
  8203. 2
  8204.          If this recipient is one of the original destinations (i.e., not the
  8205. 2
  8206.          result of a previous forwarding), no mail is actually sent.
  8207. 2
  8208.  
  8209. 2
  8210.     If :mail_forward returns a nonempty list, the recipient itself will *not*
  8211. 2
  8212.     actually receive the mail message unless it is included in the list.
  8213. 2
  8214.     #-1 is allowed to be on the list; it is ignored but does make the list 
  8215. 2
  8216.     nonempty.  Thus, having :mail_forward() return {#-1} is the canonical way
  8217. 2
  8218.     to have arriving mail disappear without being kept or forwarded.
  8219. 2
  8220.  
  8221. 2
  8222. :mail_notify([from]) 
  8223. 2
  8224.     should return a list of objects that are to be told about any mail sent 
  8225. 2
  8226.     to this recipient (whether or not the recipient actually receives it).
  8227. 2
  8228.     Said objects must have a :notify_mail verb, but other from that, there 
  8229. 2
  8230.     is no restriction on what these can be.
  8231. 2
  8232.  
  8233. 2
  8234.     object:notify_mail is called with the arguments 
  8235. 2
  8236.     (sender,recipients,msgnumbers) where 
  8237. 2
  8238.       recipients  == list of recipients including object in .mail_notify
  8239. 2
  8240.       msgsnumbers == corresponding list of :receive_message return values
  8241. 2
  8242.                  (or 0 if :receive_message is not actually called, which
  8243. 2
  8244.                   will be the case if the recipient forwards without keeping)
  8245. 2
  8246.  
  8247. 2
  8248. When called as part of a mail send, the `from' argument is the immediate predecessor on the forwarding chain.  The default versions of these verbs return the values of .mail_forward and .mail_notify respectively (pronoun_subbing if the value is a string), unless this is a moderated mailing list and `from' is an unapproved sender (see `help MR-access') in which case the following verbs are called instead:
  8249. 2
  8250.  
  8251. 2
  8252. :moderator_forward(from) 
  8253. 2
  8254.     what :mail_forward should return for mail coming from unapproved senders
  8255. 2
  8256.     This returns .moderator_forward (pronoun_subbed if a string) by default.
  8257. 2
  8258.  
  8259. 2
  8260. :moderator_notify(from)
  8261. 2
  8262.     what :mail_notify should return for mail coming from unapproved senders
  8263. 2
  8264.     This returns .moderator_notify (pronoun_subbed if a string) by default.
  8265. 2
  8266.  
  8267. 2
  8268. Since the :mail_forward verbs only see the previous sender in the forwarding chain, if, e.g, B is moderated but A can send to B (i.e., B:mail_forward(A) returns an actual list), then any mail sent to A goes to B even if the original sender isn't normally allowed to send to B directly.
  8269. 2
  8270.  
  8271. 2
  8272. These verbs should all allow `from' to be omitted in which case they should return as if `from' were a generic approved sender (e.g., wizard).
  8273. 2
  8274.  
  8275. 2
  8276. It should rarely be necessary to actually modify any of :*_forward/*_notify verbs, since one has a fair amount of control over their behavior via the following properties
  8277. 2
  8278.  
  8279. 2
  8280.   .mail_forward
  8281. 2
  8282.   .mail_notify
  8283. 2
  8284.   .moderated          (see `help MR-access')
  8285. 2
  8286.   .moderator_forward
  8287. 2
  8288.   .moderator_notify
  8289. 38
  8290. 5
  8291. 4
  8292. 24
  8293. 2
  8294. Sending Mail
  8295. 2
  8296. ------------
  8297. 2
  8298. $mail_agent:send_message(from,recipients,headers,body)
  8299. 2
  8300.   from:        sender of the message 
  8301. 2
  8302.                (this must be you or something you own; otherwise => E_PERM)
  8303. 2
  8304.   recipients:  object or list of objects (must all be players or 
  8305. 2
  8306.                $mail_recipient descendants)
  8307. 2
  8308.   headers:     either a string (contents of the Subject: line) 
  8309. 2
  8310.                or a list {subject,replytos} replytos is a list 
  8311. 2
  8312.                of objects designated to receive replies.
  8313. 2
  8314.                Use {"",replytos} to have a Reply-to: without a Subject:
  8315. 2
  8316.  
  8317. 2
  8318. This is the canonical way to send a mail message from a program.
  8319. 2
  8320. This calls $mail_agent:make_message to format the arguments into an actual message (see `help mail-format') and then $mail_agent:raw_send to do the actual sending which goes as follows:
  8321. 2
  8322.  
  8323. 2
  8324.   (1) Call :mail_forward on all recipients add any new recipients thus obtained to final recipient list, keep calling mail:forward on the new recipients until we obtain no additional recipients.  If one of the initial recipients is invalid, is not a player or $mail_recipient, or has its mail_forward return a string error, then we print the error message and abort at this point with no mail being sent.  If one of the later recipients bombs similarly, error messages are printed, but in this case mail still goes out to the other recipients.
  8325. 2
  8326.  
  8327. 2
  8328.   (2) Call :mail_notify on all recipients encountered in stage (1) to get a list of objects to notify.
  8329. 2
  8330.  
  8331. 2
  8332.   (3) All final recipients receive the message (see `help receive-mail')
  8333. 2
  8334.   (4) All notifications are delivered (using :notify_mail())
  8335. 2
  8336.  
  8337. 2
  8338. We return {0, @failed_recipients} if we bombed out at step 1.
  8339. 2
  8340. Otherwise return {1, @actual_rcpts} indicating what mail was sent.
  8341. 38
  8342. 5
  8343. 4
  8344. 13
  8345. 2
  8346. Mail System
  8347. 2
  8348. -----------
  8349. 2
  8350. The following topics describe the guts of the LambdaCore mail system
  8351. 2
  8352.  
  8353. 2
  8354. sending-mail     -- how to send mail from a program; what happens.
  8355. 2
  8356. mail-forwarding  -- how to do mail forwarding/notification (the simple version)
  8357. 2
  8358. mail-resolution  -- how mail forwarding/notification works, in gory detail
  8359. 2
  8360. receiving-mail   -- what :receive_message should do
  8361. 2
  8362. mail-format      -- format of transmitted messages
  8363. 2
  8364. mail-command-parsing   (TODO) -- routines for parsing mail commands
  8365. 2
  8366.  
  8367. 2
  8368. $mail_recipient  -- generic non-player mail recipient
  8369. 2
  8370. $mail_agent      -- mail utility object
  8371. 38
  8372. 5
  8373. 4
  8374. 34
  8375. 2
  8376.  
  8377. 2
  8378. Database of Players
  8379. 2
  8380. -------------------
  8381. 2
  8382. This is an instance of the Generic Database ($generic_db) that
  8383. 2
  8384. holds the {name/alias,#objectid} pairs for every 
  8385. 2
  8386. name and alias of every player in the MOO.
  8387. 2
  8388.  
  8389. 2
  8390. Verbs supplied include
  8391. 2
  8392.  
  8393. 2
  8394.   :find(string)        => player or $ambiguous_match or $failed_match
  8395. 2
  8396.   :find_exact(string)  => player or $failed_match (does not do partial matches)
  8397. 2
  8398.   :find_all(string)    => list of all matching players
  8399. 2
  8400.  
  8401. 2
  8402.   :insert(string,player) 
  8403. 2
  8404.        records that string is now a name or alias of player
  8405. 2
  8406.   :delete(string) 
  8407. 2
  8408.        removes string from the db
  8409. 2
  8410.   :available(string)
  8411. 2
  8412.        returns 1 if string is available as a player name or alias,
  8413. 2
  8414.        an object if string is in use, or 0 if string is otherwise unavailable.
  8415. 2
  8416.   :load()
  8417. 2
  8418.        resets the db, inserting all current player names and aliases.
  8419. 2
  8420.  
  8421. 2
  8422. The internal representation and all of the above verbs (except :load() and
  8423. 2
  8424. :available()) are as described for $generic_db.
  8425. 2
  8426.  
  8427. 2
  8428. It should be noted that for any application that involves resolving a player name from a command line, you should be using $string_utils:match_player() rather than $player_db:find(), since the former will deal correctly with other ways of referring to players apart from their names and aliases (e.g., literal object numbers, "me", "$no_one"...).
  8429. 2
  8430.  
  8431. 2
  8432. :load() needs to be done periodically as it is possible for the player db 
  8433. 2
  8434. to get out of synch with reality.  In particular, there is currently no way
  8435. 2
  8436. to block someone writing his own player :recycle() verb that neglects to 
  8437. 2
  8438. remove his names from the player db.
  8439. 2
  8440.  
  8441. 2
  8442. While a :load() is in progress the .frozen property is set to 1 to indicate that any results of :find*() are not to be trusted.
  8443. 38
  8444. 5
  8445. 4
  8446. 2
  8447. 2
  8448. *index*
  8449. 2
  8450. Core Utility Help Topics
  8451. 38
  8452. 5
  8453. 4
  8454. 64
  8455. 2
  8456.  
  8457. 2
  8458. Which :match...() Verb Do I Call?
  8459. 2
  8460. ---------------------------------
  8461. 2
  8462. There are many situations where one wishes to obtain an object from a room or a player's .contents whose name/aliases matches a particular string.  There are four main verbs available for this and it is important to understand the distinctions between them and how they are supposed to be used.
  8463. 2
  8464.  
  8465. 2
  8466. (*)  LOC:match("X")
  8467. 2
  8468.      -- what you get looking for something that is inside LOC and named "X".
  8469. 2
  8470.         By default, this looks through LOC.contents to find a unique object 
  8471. 2
  8472.         having a name or alias that has "X" as a prefix.
  8473. 2
  8474.  
  8475. 2
  8476. Essentially, you can think of :match as a contents-matching verb, though, e.g., for rooms you also get matches on exits as well.
  8477. 2
  8478.  
  8479. 2
  8480. (*)  LOC:match_object("X", YOU)           [YOU defaults to player]
  8481. 2
  8482. (*)  YOU:my_match_object("X", LOC)        [LOC defaults to player.location]
  8483. 2
  8484.      -- what YOU get being located at LOC and looking for something named "X".
  8485. 2
  8486.         By default these both return $string_utils:match_object("X",LOC,YOU)
  8487. 2
  8488.  
  8489. 2
  8490. (*)  $string_utils:match_object("X", LOC, YOU) 
  8491. 2
  8492.    -- what you *would* get *if* YOU were a typical player, YOU were inside LOC,
  8493. 2
  8494.       YOU were looking for something named "X", *and* LOC were a typical place.
  8495. 2
  8496.  
  8497. 2
  8498. In other words, $string_utils:match_object describes the :match_object() algorithm for "typical places" and the :my_match_object for "typical players":
  8499. 2
  8500.  
  8501. 2
  8502.     (1)  check for "X" being one of "", "me", "here", "$something", or "#n"
  8503. 2
  8504.     (2)  try YOU:match("X") i.e., something in your inventory (maybe)
  8505. 2
  8506.     (3)  try LOC:match("X") i.e., some object in the room (maybe)
  8507. 2
  8508.  
  8509. 2
  8510. The distinction between these location:match_object and player:my_match_object has to do with whether the player or the location should determine what the matching algorithm is.  Which one you should use depends on the command that you are writing.  If you are writing a command with a virtual-reality flavor, then you should be respecting the room owner's idea of which objects you can "see" and thus the command should be calling the location's :match_object verb.  If you are writing a building/programming command where it is appropriate for the player to determine the matching algorithm  --- whether because the current location is irrelevant, not to be trusted, or both --- then the player's :my_match_object verb should be called.
  8511. 2
  8512.  
  8513. 2
  8514. Examples:
  8515. 2
  8516.  
  8517. 2
  8518.   `look diamond in box'
  8519. 2
  8520.       calls box:match("diamond").  This is a match on the contents of box.
  8521. 2
  8522.  
  8523. 2
  8524.   `take ball', 
  8525. 2
  8526.       calls player.location:match_object("ball")
  8527. 2
  8528.       to determine which "ball" to take.  Note that if the room is dark, 
  8529. 2
  8530.       we might not be able to find any "ball".
  8531. 2
  8532.  
  8533. 2
  8534.   `@program widget:foo', 
  8535. 2
  8536.       calls player:my_match_object("widget") to get the player's own idea
  8537. 2
  8538.       of what "widget" should be.  Note that if I were carrying something 
  8539. 2
  8540.       named "widget" and expecting to be programming a :foo() verb on it,
  8541. 2
  8542.       it would be potentially disastrous should the room where I am decide
  8543. 2
  8544.       for me to be programming something else (not even necessarily 
  8545. 2
  8546.       called "widget").
  8547. 2
  8548.  
  8549. 2
  8550. Object Matching Failures
  8551. 2
  8552. ------------------------
  8553. 2
  8554. As with other matching routines, one gets back 
  8555. 2
  8556.  
  8557. 2
  8558.   $failed_match in the case of no matching object
  8559. 2
  8560.   $ambiguous_match in the case of more than one matching object
  8561. 2
  8562.   $nothing in the case of a blank string argument
  8563. 2
  8564.  
  8565. 2
  8566. or an object-id.  In these first 3 cases, one usually wants to translate these nonresults to the player; this is what $command_utils:object_match_failed.  The standard idiom to mimic what the builtin parser does, say, with the direct object is
  8567. 2
  8568.  
  8569. 2
  8570.   dobj = foo:match_???(dobjstr);
  8571. 2
  8572.   if($command_utils:object_match_failed(dobj, dobjstr))
  8573. 2
  8574.     "...give up.  nothing to do.   error message has already printed...";
  8575. 2
  8576.   else
  8577. 2
  8578.     "...dobj is something useful.  Continue...";
  8579. 2
  8580.     ...
  8581. 2
  8582.   endif
  8583. 38
  8584. 5
  8585. 4
  8586. 15
  8587. 2
  8588. $no_one
  8589. 2
  8590. -------
  8591. 2
  8592. ..is a powerless player.  He owns no objects, not even himself; nor does he own any verbs.  He is, however, a programmer and thus may use eval().
  8593. 2
  8594. In fact his sole purpose is to evaluate questionable code.
  8595. 2
  8596. `questionable' could be in either or both of the following senses
  8597. 2
  8598.  
  8599. 2
  8600. (1) Its origin is sufficiently uncertain so that there is no obvious way of deciding whose permissions it should run under.
  8601. 2
  8602. (2) The code itself is potentially malicious, i.e., to the extent that one does not want to be evaluating it using one's own permissions.
  8603. 2
  8604.  
  8605. 2
  8606. set_task_perms($no_one);  is thus the canonical idiom in wizard code for rendering anything that follows mostly harmless.  For use by ordinary programmers, we have:
  8607. 2
  8608.  
  8609. 2
  8610.     $no_one:eval(string)
  8611. 2
  8612.  
  8613. 2
  8614. which attempts to evaluate an arbitrary string using $no_one's permissions.
  8615. 2
  8616. string is either an expression or ";" followed by one or more statements, of which the final semicolon may be omitted.  return values are what eval() would return (either {1,value} or {0,@error_messages}).
  8617. 38
  8618. 5
  8619. 4
  8620. 19
  8621. 2
  8622. Exits
  8623. 2
  8624. -----
  8625. 2
  8626. An exit can be renamed by either the owner of the exit or the owner of its source.
  8627. 2
  8628.  
  8629. 2
  8630. The standard verbs that are called in exit movement are:
  8631. 2
  8632.  
  8633. 2
  8634. :move(object)  - moves the object via this exit
  8635. 2
  8636. :invoke()      - equivalent to :move(player)
  8637. 2
  8638.  
  8639. 2
  8640. When an exit is invoked on a particular object (via exit:move(object)), the following occurs.
  8641. 2
  8642.  
  8643. 2
  8644. (1) The exit may be locked against the object, in which case we print the 
  8645. 2
  8646.    nogo messages and quit.
  8647. 2
  8648.  
  8649. 2
  8650. (2) (room=exit.dest):bless_for_entry(object) is called.  Assuming that exit is recognized by room as being a legitimate entrance (i.e., is in room.entrances), this will enable room:accept(object) to return true.
  8651. 2
  8652.  
  8653. 2
  8654. (3) object:moveto(room) is called and the various messages (see `help exit-messages') are :announced/:told.  Note that this, in accordance with the way the builtin move() (and hence the default :moveto()) works, we get a call to room:accept(object) which checks for the room itself being locked against the object, and otherwise returns true if the blessing in the previous step worked.  The move is performed, here:exitfunc(object) and room:enterfunc(object) are called.  In particular, room:enterfunc clears the blessing bestowed in (2) now that it is no longer needed.
  8655. 2
  8656.  
  8657. 2
  8658. In general, the move may fail, in which case we :announce the (o)nogo_msgs.
  8659. 38
  8660. 5
  8661. 4
  8662. 69
  8663. 2
  8664. The Generic Room ($room)
  8665. 2
  8666. ----------------
  8667. 2
  8668.  
  8669. 2
  8670. (1)  Announcements
  8671. 2
  8672.  
  8673. 2
  8674. :announce         (@text)         => broadcasts to all except player
  8675. 2
  8676. :announce_all     (@text)         => broadcasts to all
  8677. 2
  8678. :announce_all_but (objects,@text) => broadcasts to all except those in objects
  8679. 2
  8680.  
  8681. 2
  8682. say, emote
  8683. 2
  8684.  
  8685. 2
  8686.  
  8687. 2
  8688. (2)  Command recovery
  8689. 2
  8690.  
  8691. 2
  8692. :huh            (verb,args) - server hook: last chance to make sense of verb
  8693. 2
  8694. :here_huh       (verb,args) - room's last attempt to parse something
  8695. 2
  8696. :here_explain_syntax (this,verb,args) - attempts to explain usage of verb
  8697. 2
  8698.  
  8699. 2
  8700.  
  8701. 2
  8702. (3)  Residency
  8703. 2
  8704.  
  8705. 2
  8706. free_home  - true => @sethome allows anyone to set his .home to be here
  8707. 2
  8708. residents  - objects on this list may teleport in and/or set their homes here.
  8709. 2
  8710.  
  8711. 2
  8712. :accept_for_abode(player) 
  8713. 2
  8714.             => true iff player should be allowed to set .home to this room.
  8715. 2
  8716.  
  8717. 2
  8718. @resident*s
  8719. 2
  8720.  
  8721. 2
  8722.  
  8723. 2
  8724. (4)  Looking
  8725. 2
  8726.  
  8727. 2
  8728. dark  - true => contents are not visible
  8729. 2
  8730. ctype - 1..4 for four different styles of .contents lists
  8731. 2
  8732.  
  8733. 2
  8734. :match         (string)        => exit or object in room's .contents
  8735. 2
  8736. :tell_contents (objects,ctype) - format objects according to ctype, tell player
  8737. 2
  8738.  
  8739. 2
  8740. l*ook
  8741. 2
  8742.  
  8743. 2
  8744.  
  8745. 2
  8746. (5)  Topology and Movement via Exits
  8747. 2
  8748.  
  8749. 2
  8750. See `help $exit' for an explanation of how the generic $exit works.
  8751. 2
  8752.  
  8753. 2
  8754. free_entry     - true  => `teleporting' in is allowed
  8755. 2
  8756.                   false => only residents may teleport in
  8757. 2
  8758. exits          - list of invokable exits leading from this room
  8759. 2
  8760. entrances      - list of recognized exits leading to this room
  8761. 2
  8762. blessed_object - object currently entering via an exit
  8763. 2
  8764. blessed_task   - task_id for entering object
  8765. 2
  8766.  
  8767. 2
  8768. :match_exit      (string) => exit whose name matches string
  8769. 2
  8770. :bless_for_entry (object) - set up room to accept object arriving from entrance
  8771. 2
  8772. :add_exit        (exit)
  8773. 2
  8774. :add_entrance    (exit)
  8775. 2
  8776. :remove_exit     (exit)
  8777. 2
  8778. :remove_entrance (exit)
  8779. 2
  8780.  
  8781. 2
  8782. e/east/w/west/s/south/n/north/ne/northeast/nw/northwest/se/southeast/sw/southwest/u/up/d/down, go, @add-exit, @add-entrance, @remove-exit, @remove-entrance, @exits, @entrances 
  8783. 2
  8784.  
  8785. 2
  8786.  
  8787. 2
  8788. (6)  Ejection
  8789. 2
  8790.  
  8791. 2
  8792. victim_ejection_msg/oejection_msg/ejection_msg
  8793. 2
  8794. :*_msg()  messages
  8795. 2
  8796.  
  8797. 2
  8798. @eject
  8799. 2
  8800.  
  8801. 38
  8802. 5
  8803. 4
  8804. 2
  8805. 2
  8806. *forward*
  8807. 2
  8808. $generic_help
  8809. 38
  8810. 5
  8811. 4
  8812. 79
  8813. 2
  8814. Generic Database
  8815. 2
  8816. ----------------
  8817. 2
  8818. This holds a collection of {string key, datum} pairs, where datum can be anything.  At most one datum may be associated with any given string.  Data may be anything (lists, strings, numbers, objectids).  If you like, you can think of this as an array indexed by strings.
  8819. 2
  8820. Verbs supplied include
  8821. 2
  8822.  
  8823. 2
  8824.   :find(string)          => datum, $ambiguous_match or $failed_match
  8825. 2
  8826.   :find_key(string)      => full string key,  $ambiguous_match or $failed_match
  8827. 2
  8828.   :find_exact(string)    => datum or $failed_match (no partial matches)
  8829. 2
  8830.   :find_all(string)      => list of all data corresponding to matching strings
  8831. 2
  8832.   :find_all_keys(string) => list of all matching strings
  8833. 2
  8834.  
  8835. 2
  8836.   :insert(string,datum)  
  8837. 2
  8838.        if the string is already present in the db, 
  8839. 2
  8840.        changes the associated datum and returns {old_datum};
  8841. 2
  8842.        otherwise enters a new {string,datum} pair and return 0.
  8843. 2
  8844.   :delete(string)
  8845. 2
  8846.        if there is a datum associated with string, 
  8847. 2
  8848.        remove this association and return {datum}; otherwise return 0.
  8849. 2
  8850.   :delete2(string,datum)
  8851. 2
  8852.        if the given datum is associated with string, 
  8853. 2
  8854.        removes that association and return {datum}, 
  8855. 2
  8856.        if some other datum is associated with string, just return {other datum}
  8857. 2
  8858.        otherwise return 0.
  8859. 2
  8860.   :clearall([4|3])
  8861. 2
  8862.        removes all associations from the database.
  8863. 2
  8864.        optional argument changes the type of the database 
  8865. 2
  8866.        (4 is normal, 3 is a kludge for when the data are simply boolean flags
  8867. 2
  8868.         i.e., this is a set of strings rather than a string-indexed array;
  8869. 2
  8870.         more on this below)
  8871. 2
  8872.  
  8873. 2
  8874.   count [entries|chars] in this
  8875. 2
  8876.         provide some vague statistics about how big this thing is.
  8877. 2
  8878.  
  8879. 2
  8880. N.B.  As entries get made, properties belonging to $generic_db.owner will be created on the db object itself.  These properties will be created having flags as specified by .node_perms, which by default is "r", but can be changed to "" should you want to ensure that randoms don't have access to the raw information.
  8881. 2
  8882.  
  8883. 2
  8884. Implementation notes
  8885. 2
  8886.  - - - - - - - - - -
  8887. 2
  8888. The representation is as a `trie', a tree in which each internal node corresponds to a prefix shared by two or more strings in the db.
  8889. 2
  8890. Each internal node is kept in a property named " "+<prefix>, where <prefix> is a prefix shared by all strings in the subtree under this node.
  8891. 2
  8892. The property value is a 4 element list
  8893. 2
  8894.  
  8895. 2
  8896. this.(" "+<prefix>)[1] = <common>
  8897. 2
  8898.    maximal continuation shared by all strings beginning with prefix
  8899. 2
  8900.    i.e., all these names actually begin with <prefix>+<common>
  8901. 2
  8902.  
  8903. 2
  8904. this.(" "+<prefix>)[2] = <continuations>
  8905. 2
  8906.    string of all characters <c> that can follow <prefix>+<common> for which
  8907. 2
  8908.    there is more than one string in the db beginning with <prefix>+<common>+<c>
  8909. 2
  8910.  
  8911. 2
  8912. this.(" "+<prefix>)[3] = <exact_matches>
  8913. 2
  8914.    list of all strings in this subtree for which 
  8915. 2
  8916.    the character (or lack thereof) following the <prefix>+<common> substring 
  8917. 2
  8918.    suffices to determine the string.
  8919. 2
  8920.  
  8921. 2
  8922. this.(" "+<prefix>)[4] = <data>
  8923. 2
  8924.    list of data corresponding to the strings in [3].
  8925. 2
  8926.  
  8927. 2
  8928. Child nodes are       this.(" "+<prefix>+<common>+<c>) 
  8929. 2
  8930.        for all <c> in this.(" "+<prefix>)[2].
  8931. 2
  8932. The root node is this.(" ").
  8933. 2
  8934. If, e.g., there are 2 or more strings in the db beginning with a, 
  8935. 2
  8936. there will be a node this.(" a").  
  8937. 2
  8938. If all of these strings actually begin with "ani", then this.(" a")[1]=="ni".
  8939. 2
  8940. The db consisting of the 5 correspondences
  8941. 2
  8942.  
  8943. 2
  8944.   {"animal", #1}
  8945. 2
  8946.   {"anime",  #2}
  8947. 2
  8948.   {"anil",   #3}
  8949. 2
  8950.   {"anile",  #4}
  8951. 2
  8952.   {"banal",  #5}
  8953. 2
  8954.  
  8955. 2
  8956. would be represented
  8957. 2
  8958.  
  8959. 2
  8960. this.(" ")    =={"",  "a",  {"banal"},         {#5}}
  8961. 2
  8962. this.(" a")   =={"ni","lm", {},                {}}
  8963. 2
  8964. this.(" anim")=={"",  "",   {"animal","anime"},{#1,#2}}
  8965. 2
  8966. this.(" anil")=={"",  "",   {"anil","anile"},  {#3,#4}}
  8967. 2
  8968.  
  8969. 2
  8970. In some cases one may merely wish to hold a collection of strings without trying to associate a particular datum with each string.  One may then instead set up a db without the fourth field on each of the properties.  In this case the datum is taken to be the found string itself and that is what gets returned by :find*() in the event of a successful search.   :find and :find_key are then equivalent as are :find_all and :find_all_keys.  To setup the db this way, do a :clearall(3).  :clearall(4) reverts to the above described type of db with a separately kept datum.  Note that you can't change the type without emptying the db.  3 and 4 are currently the only db types allowed.
  8971. 38
  8972. 5
  8973. 4
  8974. 201
  8975. 2
  8976. The Generic Editor enables a player to edit a list of strings.  While one might contrive to use it directly, it is rather intended as a parent for some actual editor.  It supplies the following commands:
  8977. 2
  8978.  
  8979. 2
  8980. say         <text>                      w*hat       
  8981. 2
  8982. emote       <text>                      abort       
  8983. 2
  8984. lis*t       [<range>] [nonum]           q*uit,done,pause 
  8985. 2
  8986. ins*ert     [<ins>] ["<text>]           
  8987. 2
  8988. n*ext,p*rev [n] ["<text>]               
  8989. 2
  8990. del*ete     [<range>]                   
  8991. 2
  8992. f*ind       /<str>[/[c][<range>]]       
  8993. 2
  8994. s*ubst      /<str1>/<str2>[/[g][c][<range>]]
  8995. 2
  8996. m*ove,c*opy [<range>] to <ins>          
  8997. 2
  8998. join*l      [<range>]                   
  8999. 2
  9000. fill        [<range>] [@<col>]          
  9001. 2
  9002.  
  9003. 2
  9004. $editor_help.(cmdname) descrbes cmdname
  9005. 2
  9006. $editor_help.insert    descrbes insertion points (<ins>)
  9007. 2
  9008. $editor_help.ranges    descrbes range specifications (<range>)
  9009. 2
  9010.  
  9011. 2
  9012. You'll notice that nowhere does it say how to load in a given list of strings or how and where one may save said list away when one is done editing.  These commands are supplied by the child editor object.  The generic editor contains only the code for editing lines, though it defines additional functions for use by the children:
  9013. 2
  9014.  
  9015. 2
  9016.   :loaded(player)
  9017. 2
  9018.      returns the index (player in this.active) iff text has been loaded
  9019. 2
  9020.      from somewhere, otherwise returns 0.
  9021. 2
  9022.  
  9023. 2
  9024.      Note that, by default, there is a difference between 
  9025. 2
  9026.  
  9027. 2
  9028.         having nothing loaded                (:text(who)==0) and 
  9029. 2
  9030.         having loaded something with no text (:text(who)=={}).
  9031. 2
  9032.  
  9033. 2
  9034.      If you don't care about this distinction in a particular case,
  9035. 2
  9036.      just do (player in this.active) instead of this:loaded(player).  
  9037. 2
  9038.      If you don't want your editor to make this distinction at all, do
  9039. 2
  9040.  
  9041. 2
  9042.         @stateprop texts={} for <youreditor>
  9043. 2
  9044.  
  9045. 2
  9046.      which changes the initial value of :text() to {} 
  9047. 2
  9048.  
  9049. 2
  9050. In all functions below, 'who' is the index returned by :loaded(player) 
  9051. 2
  9052.  
  9053. 2
  9054. BTW, be careful about using 'player' in non-user (i.e., +x this-none-this) verbs --- much better to have the user verb get the index with :loaded() and then pass that around.  
  9055. 2
  9056.  
  9057. 2
  9058. Also be careful about suspend() and verbs that call suspend().  In particular, the player's index in the .active list can change during the suspend interval, so you must be sure to obtain the index (e.g., using :loaded()) again after the suspend() returns.
  9059. 2
  9060.  
  9061. 2
  9062. For your non-user verbs, we have
  9063. 2
  9064.  
  9065. 2
  9066.   :ok(who)
  9067. 2
  9068.      returns E_PERM if the caller is not an editor verb and E_RANGE
  9069. 2
  9070.      if 'who' does not point to a valid session.
  9071. 2
  9072.  
  9073. 2
  9074. which should take care of the more egregious security holes (but maybe not the less egregious ones).  For getting and loading text, we have
  9075. 2
  9076.  
  9077. 2
  9078.   :text(who)    
  9079. 2
  9080.      the current text string list or 0 if nothing loaded yet.
  9081. 2
  9082.   :load(who,text)
  9083. 2
  9084.      loads the given list of strings as the text to be edited.
  9085. 2
  9086.      this also resets the 'changed' flag and pushes the insertion 
  9087. 2
  9088.      point to the end.
  9089. 2
  9090.  
  9091. 2
  9092. and various flags and properties (all of the set_* routines return E_PERM when not called from an editor verb, E_RANGE if who is out of bounds, E_INVARG if something is wrong with the 2nd arg, or the new value, which may not necessarily be the same as the 2nd arg (e.g., set_insertion(..,37) on a 5 line text buffer returns 6).
  9093. 2
  9094.  
  9095. 2
  9096.   :changed(who)
  9097. 2
  9098.      has the text been altered since the last save/load?
  9099. 2
  9100.      (the child editor gets to define what "save" means).
  9101. 2
  9102.   :set_changed(who,value)
  9103. 2
  9104.      Any child editor command that is considered to save the text should do a 
  9105. 2
  9106.      :set_changed(who,0).  
  9107. 2
  9108.      Note that if the changed flag is 0, the session will be flushed when 
  9109. 2
  9110.      the player leaves the editor, so you may also want certain commands to
  9111. 2
  9112.      do set_changed(who,1)...
  9113. 2
  9114.  
  9115. 2
  9116.   :origin(who)
  9117. 2
  9118.      room where the player came from.  
  9119. 2
  9120.   :set_origin(who,room)
  9121. 2
  9122.      can be used to change the room the player will return to when finished
  9123. 2
  9124.      editing.  Since origin gets set even in cases where the player teleports
  9125. 2
  9126.      into the editor you probably won't usually need to do this.
  9127. 2
  9128.  
  9129. 2
  9130.   :insertion(who)
  9131. 2
  9132.      current insertion point.
  9133. 2
  9134.   :set_insertion(who,linenumber)
  9135. 2
  9136.      linenumber needs to be a positive integer and will get 
  9137. 2
  9138.  
  9139. 2
  9140.   :readable(who)
  9141. 2
  9142.      whether the current editing session has been made globally readable.
  9143. 2
  9144.   :set_readable(who,boolean)
  9145. 2
  9146.      change the readability of the current editing session.
  9147. 2
  9148.      This is used by the publish/perish verbs.
  9149. 2
  9150.  
  9151. 2
  9152. We also provide
  9153. 2
  9154.  
  9155. 2
  9156.   :invoke(...)
  9157. 2
  9158.       If the player has a previous unsaved (i.e., :changed()!=0)
  9159. 2
  9160.       session, we return to it, moving the player to the editor.  
  9161. 2
  9162.       If the player is already in the editor, this has no effect other
  9163. 2
  9164.       than to print a few nasty messages.  In any case a :changed()
  9165. 2
  9166.       session must be aborted or set_changed(,0) before anything else 
  9167. 2
  9168.       can be started
  9169. 2
  9170.  
  9171. 2
  9172.       Otherwise, we pass the arguments (which are assumed to be the
  9173. 2
  9174.       result of some munging of the command line) to :parse_invoke(),
  9175. 2
  9176.       move the player to the editor and load whatever parse_invoke()
  9177. 2
  9178.       specified.  The only interpretation the generic editor makes on
  9179. 2
  9180.       the arguments is that if the boolean value of the first is true,
  9181. 2
  9182.       this indicates that the player wanted to load something as
  9183. 2
  9184.       opposed to resume a previous session.  Usually a command calling
  9185. 2
  9186.       :invoke will have a true (i.e., nonzero number, nonempty list or
  9187. 2
  9188.       string) first arg iff the command line is nonempty, in which case 
  9189. 2
  9190.       'args' works fine for this purpose.
  9191. 2
  9192.  
  9193. 2
  9194.       If the command parses sucessfully (:parse_invoke() returns a list),
  9195. 2
  9196.       we move the player to the editor if necessary and then call 
  9197. 2
  9198.       :init_session() to set things up.
  9199. 2
  9200.  
  9201. 2
  9202. The child editor is assumed to provide
  9203. 2
  9204.  
  9205. 2
  9206.   :parse_invoke(...)
  9207. 2
  9208.      given :invoke()'s arguments, determines what the player wants to edit.
  9209. 2
  9210.      It either returns 0 and reports syntax errors to player,
  9211. 2
  9212.      or it returns some list that :init_session() will understand.
  9213. 2
  9214.  
  9215. 2
  9216.   :init_session(who,@spec)
  9217. 2
  9218.      where spec is something that was returned by :parse_invoke().
  9219. 2
  9220.      Loads the text and sets the stateprops (below) to indicate that 
  9221. 2
  9222.      we are working on whatever it is we're suppose to be working on.
  9223. 2
  9224.  
  9225. 2
  9226.   :working_on(who)   
  9227. 2
  9228.      returns a string X as in "You are working on X."
  9229. 2
  9230.      This is called by the 'w*hat' command, among other things.
  9231. 2
  9232.  
  9233. 2
  9234. Child editors may have their own properties giving state information for the various editing sessions.  The value of each such property will be a list giving a value for each player in the editor.  For each such property, you should, once the editor object has been created, initialize the property to {} and do one of
  9235. 2
  9236.  
  9237. 2
  9238.     @stateprop <propname>                 for <editor>
  9239. 2
  9240.     @stateprop <propname>=<default-value> for <editor>
  9241. 2
  9242.                (0 is the default <default-value>)
  9243. 2
  9244.  
  9245. 2
  9246. Henceforth, adding and deleting new editing sessions will amend the list held by the given property.  The value of the property for a given session can be obtained via this.<propname>[player in this.active] and can be changed with a corresponding listset() call.  The usual idiom for an editor command is
  9247. 2
  9248.  
  9249. 2
  9250.    if(!(who=this:loaded(player)))
  9251. 2
  9252.      player:tell(nothing_loaded_msg());
  9253. 2
  9254.    else
  9255. 2
  9256.       ... various references to  this.<propname>[who] ...
  9257. 2
  9258.    endif
  9259. 2
  9260.  
  9261. 2
  9262. To remove such a property from the list of such state properties:
  9263. 2
  9264.  
  9265. 2
  9266.     @rmstateprop <propname> from <editor>
  9267. 2
  9268.  
  9269. 2
  9270. Note that you can only do this with properties defined on the child editor itself.  
  9271. 2
  9272.  
  9273. 2
  9274. Sometimes you may wish to @stateprop a new property on an editor where active editing sessions exist.  @stateprop will fail if the property in question does not hold a list of the correct length (== length(editor.active); one value for each editing session).  You need to either give the @flush command to clear out all sessions and boot all players currently in the editor or somehow manually initialize the property to a list of appropriate values and pray that nobody enters/exits the editor between the property initialization and the @stateprop command --- this problem can be avoided by doing an eval() that does all of the initializations (beware of suspends()) and calls :set_stateprops directly.
  9275. 2
  9276.  
  9277. 2
  9278. Incidentally, the @flush command may be used at any time to clean out the editor or to remove all sessions older than a given date.
  9279. 2
  9280.  
  9281. 2
  9282. There are also numerous _msg properties that may be customized
  9283. 2
  9284.  
  9285. 2
  9286.     @depart          announced at the origin when :invoke() is called. 
  9287. 2
  9288.     @return          announced at the origin the player is returned there.
  9289. 2
  9290.     @nothing_loaded  printed when user attempts editing 
  9291. 2
  9292.                      before anything has been loaded.
  9293. 2
  9294.     @no_text         response to 'list' when :text()=={}
  9295. 2
  9296.     @no_change       printed by 'what' when :changed()==0
  9297. 2
  9298.     @change          printed by 'what' when :changed()==1
  9299. 2
  9300.     @no_littering    printed upon leaving the editor with :changed()==1.
  9301. 2
  9302.     @previous_session  printed by :invoke() when player tries to start a 
  9303. 2
  9304.                      new session without aborting or saving the old one
  9305. 2
  9306.  
  9307. 2
  9308. The general procedure for creating a child editor:
  9309. 2
  9310.  
  9311. 2
  9312. . @create $generic_editor named <editor>
  9313. 2
  9314.  
  9315. 2
  9316. . define additional <editor> verbs/properties
  9317. 2
  9318.     At the very least you need 'edit' and 'save' commands.
  9319. 2
  9320.     Usually you can get away with just having 'edit' call :invoke();
  9321. 2
  9322.     Presumably, you'll need at least a command to load text from somewhere
  9323. 2
  9324.     as well as a command to save it back out.
  9325. 2
  9326.  
  9327. 2
  9328. . define a verb (somewhere) to invoke the editor 
  9329. 2
  9330.     This could be just a one-liner that calls <editor>:invoke(args,verb).
  9331. 2
  9332.     Either that or
  9333. 2
  9334.       .  you have to set up an exit somewhere whose destination is <editor>
  9335. 2
  9336.       .  you have to advertise the object number so that people can 
  9337. 2
  9338.          teleport to it.
  9339. 2
  9340.   
  9341. 2
  9342. . @stateprop x for <editor>
  9343. 2
  9344.  
  9345. 2
  9346. . if you want the 'abort' command to boot the player from the editor do
  9347. 2
  9348.     <editor>.exit_on_abort = 1;
  9349. 2
  9350.  
  9351. 2
  9352. . set <editor>.commands to be the list of additional commands defined
  9353. 2
  9354.     by <editor>.  
  9355. 2
  9356.     Each element of the list is itself a list of the form {name,args}.
  9357. 2
  9358.   set <editor>.commands2 to be the list of commands that should appear
  9359. 2
  9360.     in the `look' listing, and should be a list of strings appearing 
  9361. 2
  9362.     as names in .commands on either <editor> or some editor ancestor.
  9363. 2
  9364.   look at $verb_editor or $note_editor for an example.
  9365. 2
  9366.  
  9367. 2
  9368. . If you want to have help text for new verbs you define, create a child of 
  9369. 2
  9370.     $generic_help and add properties to this object for each of the topics 
  9371. 2
  9372.     that you want to provide help text.
  9373. 2
  9374.     Finally, set <editor>.help = {this object} so that the help system
  9375. 2
  9376.     knows to consult this object.
  9377. 38
  9378. 5
  9379. 4
  9380. 76
  9381. 2
  9382. The Help System
  9383. 2
  9384. ---------------
  9385. 2
  9386. When a player types help, the following list of objects is consulted for .help properties:  the player itself, all ancestors of player up to and including $player, and, if the current location is a room, the current location together with all ancestors of the current location back to and including $room.  Each help property should have as value either an object or a list of objects (otherwise we just ignore it).  These objects are then strung together as a list of `help databases' to be searched in order for the requested topic.
  9387. 2
  9388.  
  9389. 2
  9390. A help database (in the sense of anything that is usable by $player:help()) is any object having the following three verbs:
  9391. 2
  9392.  
  9393. 2
  9394.   :find_topics([string])
  9395. 2
  9396.      where string is a supposed help topic, returns a list of strings,
  9397. 2
  9398.      i.e., actual help topics that this db knows about, or some boolean 
  9399. 2
  9400.      false value in the event that this db is clueless...
  9401. 2
  9402.      If no arguments are given, this should return a list of all topics
  9403. 2
  9404.      in the db
  9405. 2
  9406.  
  9407. 2
  9408.   :get_topic(string)
  9409. 2
  9410.      given one of the strings returned by :find_topics this either
  9411. 2
  9412.      returns a list of strings (text to be spewed to the player) or
  9413. 2
  9414.      returns 1 to indicate that it has already taken care of printing
  9415. 2
  9416.      information to the player.
  9417. 2
  9418.  
  9419. 2
  9420.   :dump_topic(string)
  9421. 2
  9422.      like get_topic, but instead returns the raw text of a help topic
  9423. 2
  9424.      as a (download/upload) script
  9425. 2
  9426.  
  9427. 2
  9428. In short if :find_topic reports that a particular db knows about a given topic
  9429. 2
  9430. it returns the full topic name, so that :get_topic may be called on it later.
  9431. 2
  9432. :dump_topic is used by maintainers (see $wiz:@gethelp) to edit help topics.
  9433. 2
  9434.  
  9435. 2
  9436. $generic_help and $help
  9437. 2
  9438. -----------------------
  9439. 2
  9440. The Generic Help Database, $generic_help, is the parent class of a particular kind of help database of which $help is an instance.  On help databases of this type, every help topic has a corresponding property, interpreted as follows:
  9441. 2
  9442.  
  9443. 2
  9444.   this.(topic) = string             
  9445. 2
  9446.       one-line help text.
  9447. 2
  9448.  
  9449. 2
  9450.   this.(topic) = {"*<verb>*",@args}
  9451. 2
  9452.       call this:<verb>(args,dblist) to get text where dblist is the list of 
  9453. 2
  9454.       help objects that would have been consulted had the topic not been found 
  9455. 2
  9456.       on this object.
  9457. 2
  9458.  
  9459. 2
  9460.   this.(topic) = other list of strings 
  9461. 2
  9462.       multi-line help text
  9463. 2
  9464.  
  9465. 2
  9466. For the {"*<verb>*",...} form, the current verbs available are
  9467. 2
  9468.  
  9469. 2
  9470.   {"*forward*", topic, @rest}   
  9471. 2
  9472.      - get help text for topic and then append the lines of `rest'.  
  9473. 2
  9474.        rest may, in turn, begin with a "*<verb>*"...
  9475. 2
  9476.  
  9477. 2
  9478.   {"*pass*", topic, @rest}   
  9479. 2
  9480.      - get help text for topic from the first help database after this one
  9481. 2
  9482.        that actually has help text for topic, and then append lines of `rest'.
  9483. 2
  9484.        As with "*forward*" rest may, in turn, begin with a "*<verb>*"...
  9485. 2
  9486.  
  9487. 2
  9488.   {"*subst*", @lines} 
  9489. 2
  9490.      - All occurences of %[exp] in lines are replaced with the value of exp
  9491. 2
  9492.          which is assumed to evaluate to a string.  
  9493. 2
  9494.        All lines beginning with %;exp are replaced with the value of exp 
  9495. 2
  9496.          which is assumed to evaluate to a list of strings.
  9497. 2
  9498.        Evaluation is done using $no_one's permissions so exp in either case
  9499. 2
  9500.        can only refer to public information.
  9501. 2
  9502.  
  9503. 2
  9504.   {"*index*", title}
  9505. 2
  9506.      - returns a list of all topics in this database, arranged in columns.
  9507. 2
  9508.        title is used as a heading for this index.
  9509. 2
  9510.  
  9511. 2
  9512. Individual help dbs are free to define additional verbs that may be used in this context.  $help itself defines the following additional such verbs:
  9513. 2
  9514.  
  9515. 2
  9516.   {"*index_list*"}
  9517. 2
  9518.      - returns a list of all index topics in all databases in the search list.
  9519. 2
  9520.        An index topic is one whose actual text is {"*index*", something}.
  9521. 2
  9522.        When creating a help db, you should be sure to make an index topic.
  9523. 2
  9524.  
  9525. 2
  9526.   {"*full_index*"}
  9527. 2
  9528.      - prints indices for all help databases in the search list.
  9529. 2
  9530.  
  9531. 2
  9532. It should be noted (once again) that help databases need not be children of $generic_help, so long as they have :find_topics/:get_topic/:dump_topic working as specified above.
  9533. 38
  9534. 5
  9535. 4
  9536. 62
  9537. 2
  9538. Generic Option Package
  9539. 2
  9540. ----------------------
  9541. 2
  9542. It occasionally happens that one has a command or set of commands for which one wishes to provide several options/flags that a player can set to customize the command's behavior for him/herself.  Making each option a separate property is a bit expensive, especially when the option in question is merely a boolean flag that gets set to false in most cases.  This package provides an alternative, as well as providing a uniform set of commands for setting these flags/options and checking that the values given are of appropriate types.
  9543. 2
  9544.  
  9545. 2
  9546. Instead of needing several properties, only one is required to store a list containing values for all of the options.  An "option package" (pkg, below) is then an object of this class, which provides routines for manipulating such lists.
  9547. 2
  9548.  
  9549. 2
  9550. The set of option names is divided into a set of "real" options, those whose names will actually appear in a given list, and "extras" which are either synonyms for or represent combinations of real options.
  9551. 2
  9552.  
  9553. 2
  9554.  pkg:add_name(name)      adds name to .names  (remove it from .extras if there)
  9555. 2
  9556.  pkg:add_name(name,1)    adds name to .extras (remove it from .names if there)
  9557. 2
  9558.     => 1 - ok, 0 - already added, E_INVARG - illegal name, E_PERM
  9559. 2
  9560.  
  9561. 2
  9562.  pkg:remove_name(name)   remove name from either .names or .extras
  9563. 2
  9564.     => 1 - ok, 0 - not present, E_PERM
  9565. 2
  9566.  
  9567. 2
  9568. For setting or retrieving values we have
  9569. 2
  9570.  
  9571. 2
  9572.  pkg:get(options,name) 
  9573. 2
  9574.     => value (or 0 if name isn't a real option)
  9575. 2
  9576.  pkg:set(options,name,value)
  9577. 2
  9578.     => revised options (or string error message if something goes wrong)
  9579. 2
  9580.  
  9581. 2
  9582. By default, a given option can only be a boolean flag, having one of the values 0 (absent from the list), or 1 (present in the list).  :set translates 0/""/{} to 0 and any other non-object value to 1.
  9583. 2
  9584.  
  9585. 2
  9586. One may however designate a wider range of possible values for an option "foo" by either installing one of
  9587. 2
  9588.  
  9589. 2
  9590.   pkg.type_foo
  9591. 2
  9592.     -- list of allowed types, 
  9593. 2
  9594.        e.g., {NUM,STR}   => must be a number or a string
  9595. 2
  9596.        e.g., {OBJ,{OBJ}} => must be an object or a list of objects
  9597. 2
  9598.     for anything fancier use:
  9599. 2
  9600.  
  9601. 2
  9602.   pkg:check_foo(value)
  9603. 2
  9604.     => string error message or {value munged as desired}
  9605. 2
  9606.  
  9607. 2
  9608. In general, the only restriction on option values is that 0 is the only false value; setting an option to "" or {} sets it to 0.  Every option defaults to 0, and no matter what you install as .type_foo or :check_foo(), 0 will always be a legal value for option "foo".
  9609. 2
  9610.  
  9611. 2
  9612. When presented with an option that is in .extras, :set will typecheck the value as described, however, then :actual(name, value) will be called to obtain a list of {name-of-real-option, value} pairs indicating which combination of real options should be set.
  9613. 2
  9614.  
  9615. 2
  9616. Other verbs
  9617. 2
  9618.   pkg:parse(args,...)
  9619. 2
  9620.     parses the command line arguments of a @whatever_option command
  9621. 2
  9622.     => {optionname, value}  if the player wants to set an option
  9623. 2
  9624.     => {optionname}         if the player wants to view an option
  9625. 2
  9626.     => string error message  otherwise
  9627. 2
  9628.  
  9629. 2
  9630.   one may install pkg:parse_foo to parse arguments for option "foo" 
  9631. 2
  9632.     !foo     => {"foo",0}  (:parse_foo not called)
  9633. 2
  9634.     foo=     => {"foo",0}  (:parse_foo not called)
  9635. 2
  9636.     -foo     => {"foo",0}  (:parse_foo not called)
  9637. 2
  9638.     +foo     => pkg:parse_foo("foo",1)
  9639. 2
  9640.     foo=word => pkg:parse_foo("foo","word")
  9641. 2
  9642.     foo word1 word2    => pkg:parse_foo("foo",{"word1","word2"})
  9643. 2
  9644.     foo is word1 word2 => pkg:parse_foo("foo",{"word1","word2"})
  9645. 2
  9646.  
  9647. 2
  9648.  pkg:show(options,name|list of names)
  9649. 2
  9650.     => list of strings describing the current value of the named option(s).
  9651. 2
  9652.        calls     pkg:show_foo(options,list of names) or
  9653. 2
  9654.        refers to pkg.show_foo
  9655. 2
  9656.        to describe option "foo"
  9657. 2
  9658.  
  9659. 2
  9660. (see sources for details...  at some point I'll finish writing this... --Rog)
  9661. 38
  9662. 5
  9663. 4
  9664. 24
  9665. 2
  9666. Message Sequences
  9667. 2
  9668. -----------------
  9669. 2
  9670. A "message sequence" is a handle by which one may refer to a particular subset of a mail recipient's (player or $mail_recipient-descendant) saved messages.  Routines like rcpt:display_seq_headers or rcpt:display_seq_full need to be supplied with message-sequence arguments to deterimine which headers or full-messages to display.
  9671. 2
  9672.  
  9673. 2
  9674. Message sequences can in turn be obtained from routines like rcpt:parse_message_seq, which takes a command-line description of a message sequence on that particular recipient and returns the corresponding message sequence handle.
  9675. 2
  9676.  
  9677. 2
  9678. The actual form of a message sequence (though you shouldn't actually need to make use of this) is that of a set of integers in the format used by $seq_utils (see `help $seq_utils').  It should however be noted that these integers are *not* themselves message numbers, but rather indices into the list of saved messages.  For example, if a particular recipient holds 5 messages numbered 1,3,5,7,9.  Then the message sequence handle representing messages 3,5,7 collectively, would be {2,5} which is $seq_utils-ese for the range 2..4, namely the second, third and fourth messages saved on that recipient.
  9679. 2
  9680.  
  9681. 2
  9682. The following verbs are available for obtaining indices to use in message sequences
  9683. 2
  9684.  
  9685. 2
  9686.   :length_all_msgs()    => total number of messages, or equivalently,
  9687. 2
  9688.                         => index of last message
  9689. 2
  9690.   :length_num_le(n)     => number of messages numbered <= n, or equivalently,
  9691. 2
  9692.                         => index of highest numbered message <= n
  9693. 2
  9694.   :exists_num_eq(n)     => 0 unless there exists a message numbered n in which
  9695. 2
  9696.                            case we return the index of that message.
  9697. 2
  9698.   :length_date_le(date) => number of messages dated <= date, or equivalently,
  9699. 2
  9700.                         => index of most recent message dated <= date
  9701. 2
  9702.  
  9703. 2
  9704.   :length_date_gt(date) => number of messages dated > date
  9705. 2
  9706.  
  9707. 2
  9708. Note that r:length_date_gt(date) == r:length_all_msgs()-r:length_date_le(date).
  9709. 2
  9710. The only reason :length_date_gt is provided as a separate routine is in order 
  9711. 2
  9712. to do quick checks for the existence of new mail (as @rn needs to do).
  9713. 38
  9714. 5
  9715. 4
  9716. 24
  9717. 2
  9718. Read verbs
  9719. 2
  9720. ----------
  9721. 2
  9722. The following verbs may be used to extract headers/messages from readable mail recipients/players;
  9723. 2
  9724.  
  9725. 2
  9726. :display_seq_headers (message sequence, current message number, last_read_date)
  9727. 2
  9728.   Does a @mail listing of the given message sequence.  If current message
  9729. 2
  9730.   number is given and the sequence includes it, we mark it with a `>'.
  9731. 2
  9732.   Likewise if the sequence includes any new messages (i.e., dated after 
  9733. 2
  9734.   last_read_date), these are also indicated as such.
  9735. 2
  9736.  
  9737. 2
  9738. display_seq_full (message sequence, preamble)
  9739. 2
  9740.   Does a @read listing of the given message sequence.  Each message is preceded
  9741. 2
  9742.   by preamble.
  9743. 2
  9744.   => {new current message number, new last_read_date}
  9745. 2
  9746.  
  9747. 2
  9748. :messages_in_seq (index)
  9749. 2
  9750.   => {n, msg}
  9751. 2
  9752. :messages_in_seq (message sequence)
  9753. 2
  9754.   => {{n_1,msg_1},{n_2,msg_2},...}
  9755. 2
  9756.   where the n_i are message numbers and the msg_i are messages in transmission
  9757. 2
  9758.   format (see `help mail-format')
  9759. 2
  9760.  
  9761. 2
  9762. :list_rmm ()
  9763. 2
  9764.   Does an `@unrmm list' listing of messages in .messages_going
  9765. 38
  9766. 5
  9767. 4
  9768. 17
  9769. 2
  9770. Write verbs
  9771. 2
  9772. -----------
  9773. 2
  9774. The following verbs can be used to manipulate writable mail recipients/players:
  9775. 2
  9776.  
  9777. 2
  9778. :rm_message_seq (message sequence)
  9779. 2
  9780.   Does an @rmmail.  Messages in message sequence are removed from this 
  9781. 2
  9782.   recipient's saved .messages and written to .messages_going.
  9783. 2
  9784.  
  9785. 2
  9786. :undo_rmm ()
  9787. 2
  9788.   Does an @unrmm.  Messages in .messages_going are copied back to .messages.
  9789. 2
  9790.  
  9791. 2
  9792. :expunge_rmm ()
  9793. 2
  9794.   Does an @unrmm expunge.  Blows away .messages_going.
  9795. 2
  9796.  
  9797. 2
  9798. :renumber ()
  9799. 2
  9800.   Does a @renumber.
  9801. 2
  9802.  
  9803. 38
  9804. 5
  9805. 4
  9806. 25
  9807. 2
  9808. Search verbs
  9809. 2
  9810. ------------
  9811. 2
  9812. The following verbs can be used on a readable mail-recipient/player to search for messages with fields matching a given pattern.
  9813. 2
  9814.  
  9815. 2
  9816. from_msg_seq (objectid or list [,mask])
  9817. 2
  9818.   => message sequence: messages from (one of) the given objectid(s)
  9819. 2
  9820.  
  9821. 2
  9822. %from_msg_seq (string or list [,mask])
  9823. 2
  9824.   => message sequence: messages with (one of) the given string(s)
  9825. 2
  9826.      in the From: line
  9827. 2
  9828.  
  9829. 2
  9830. to_msg_seq (objectid or list [,mask])
  9831. 2
  9832.   => message sequence: messages to (one of) the given objectid(s)
  9833. 2
  9834.  
  9835. 2
  9836. %to_msg_seq (string or list [,mask])
  9837. 2
  9838.   => message sequence: messages with (one of) the given string(s)
  9839. 2
  9840.      in the To: line
  9841. 2
  9842.  
  9843. 2
  9844. subject_msg_seq (string [,mask])
  9845. 2
  9846.   => message sequence: messages with given string occurring in Subject:
  9847. 2
  9848.  
  9849. 2
  9850. body_msg_seq (string [,mask])
  9851. 2
  9852.   => message sequence: messages with given string occurring in body of message
  9853. 2
  9854.  
  9855. 2
  9856. In all cases `mask' is a message sequence which one may supply to limit the range of the search.  One way of looking at it is that the message sequence to be returned is first intersected with mask.
  9857. 38
  9858. 5
  9859. 4
  9860. 43
  9861. 2
  9862. The housekeeper is an object that can help keep other objects where they belong.  New MOOs may want to add their own user interface for the housekeeper; here is some information that may be helpful.
  9863. 2
  9864.  
  9865. 2
  9866. To indicate what objects should be cleaned:
  9867. 2
  9868.  
  9869. 2
  9870.   :add_cleanup(object[, requestor[, where]])
  9871. 2
  9872.     Ask the housekeeper to clean 'object' for 'requestor' to 'where'.
  9873. 2
  9874.     Requestor defaults to 'player'.
  9875. 2
  9876.     Where defaults to object.location.
  9877. 2
  9878.  
  9879. 2
  9880.   :remove_cleanup(what[, requestor])
  9881. 2
  9882.     Remove 'what' from the cleanup list at 'requestor's request.
  9883. 2
  9884.     Will remove it only if 'requestor' made the original request and owns
  9885. 2
  9886.     the object or the destination.
  9887. 2
  9888.  
  9889. 2
  9890. To actually get the housekeeper to clean stuff up:
  9891. 2
  9892.  
  9893. 2
  9894.   :cleanup([insist])
  9895. 2
  9896.     Clean up player's objects.  Argument is 'up' or 'up!' for manually
  9897. 2
  9898.     requested cleanups.  'up!' means to clean things even if it's against
  9899. 2
  9900.     the housekeeper's better judgement.
  9901. 2
  9902.  
  9903. 2
  9904.   :replace(object[, insist])
  9905. 2
  9906.     Clean up the indicated object.  'insist' is as in :cleanup.
  9907. 2
  9908.  
  9909. 2
  9910.   :continuous()
  9911. 2
  9912.     Starts the housekeeper cleaning continuously, killing any previous
  9913. 2
  9914.     continuous task.  This should be called only when starting up a new MOO,
  9915. 2
  9916.     or if something has gone wrong, as normally it will just keep going
  9917. 2
  9918.     without any help.
  9919. 2
  9920.  
  9921. 2
  9922.   :litterbug()
  9923. 2
  9924.     Clean up all the places in housekeeper.public_places by getting rid of
  9925. 2
  9926.     all contents not in their .residents lists.  This is called by
  9927. 2
  9928.     :continuous, so it doesn't need to be called directly.
  9929. 2
  9930.  
  9931. 2
  9932. To find out what's being cleaned to where for whom:
  9933. 2
  9934.  
  9935. 2
  9936.   :cleanup_list([whom])
  9937. 2
  9938.     Show 'player' the personal cleanup list for 'whom', or the housekeeper's
  9939. 2
  9940.     complete list if no argument is given.
  9941. 2
  9942.  
  9943. 2
  9944.   :clean_status()
  9945. 2
  9946.     Show 'player' a brief summary of eir personal cleanup list.
  9947. 38
  9948. 5
  9949. 4
  9950. 28
  9951. 2
  9952. $recycler
  9953. 2
  9954. =========
  9955. 2
  9956.  
  9957. 2
  9958. Rather than having the server built-in recycle() and create() functions handle the creation and destruction of objects, a recycling center has been created to simulate these actions by  changing objects that would have been recycled into children of $garbage (The Generic Garbage Object) and making them owned by Hacker, and then when they're needed again, to avoid a raw create() command, those objects are given to whoever's asking for them.
  9959. 2
  9960.  
  9961. 2
  9962. Most Useful Verbs
  9963. 2
  9964. -----------------
  9965. 2
  9966.  
  9967. 2
  9968. $recycler:_recycle( object )
  9969. 2
  9970.   This will effectively recycle an object. (As a point of fact, it changes ownership of the object to Hacker and makes the object a child of $garbage.)  It handles .ownership_quota and .owned_objects properly.  Generally, use this instead of a recycle() in your verbs.
  9971. 2
  9972.  
  9973. 2
  9974. $recycler:_create( parent object [ , new owner object ] )
  9975. 2
  9976.   This effectively creates an object (with the specified parent, if possible, and with the specified owner, if possible; these are the same restrictions as on the server create() builtin).  This is what should generally be used instead of create() in your programming.
  9977. 2
  9978.  
  9979. 2
  9980. $recycler:valid ( object )
  9981. 2
  9982.   This is a variant of the server built-in valid() except that it handles the $garbage objects as well.  It returns a 1 if the object specified -is- valid and is -not- a $garbage object.
  9983. 2
  9984.  
  9985. 2
  9986. Other Notes
  9987. 2
  9988. -----------
  9989. 2
  9990.  
  9991. 2
  9992. request <object> from <recycler>
  9993. 2
  9994.   This is not an internal verb (it's !x).  It is, however, a command-line verb that can be used to request a specific object from the recycler.  It's also useful for the creation of objects like a Magic Number Repository.  When the object is removed from the recycler, the .announce_removal_msg is announced to the room if it's set (it's piped through $string_utils for pronoun substitution).
  9995. 2
  9996.  
  9997. 2
  9998. show-history <recycler>
  9999. 2
  10000.   This is a wizardly verb which allows wizards to check the `history list' of the recycler. The history maintains the latest ($recycler.nhist) entries.
  10001. 2
  10002.  
  10003. 2
  10004. $recycler.orphans
  10005. 2
  10006.   This maintains a list of objects for which the recreation process got mangled. It ought to be checked every once in a while to see what's up.
  10007. 2
  10008. 1
  10009. 4
  10010. 10
  10011. 2
  10012. $error
  10013. 2
  10014. ======
  10015. 2
  10016.  
  10017. 2
  10018. The Error Generator, $error, may be used to automatically generate errors. This is particularly useful if you are working in a !d verb but have occasion to -want- to crash with traceback. To raise a specific error, use $error:raise(error type) -- for example, $error:raise(E_PERM) will produce traceback resulting from a Permission Denied error.
  10019. 2
  10020.  
  10021. 2
  10022. Random notes about $error:
  10023. 2
  10024.  
  10025. 2
  10026. + The complete list of errors is stored in $error.names.
  10027. 2
  10028. + The seemingly useless :accept() verb on $error is so that $error:E_RECMOVE and $error:E_NACC will be guaranteed success (success meaning, of course, a termination by traceback).
  10029. 2
  10030. + There is, unfortunately, no way to raise the error E_NONE.
  10031. 2
  10032. 1
  10033. 4
  10034. 72
  10035. 2
  10036. Generic BigList Utilities
  10037. 2
  10038. ----------------------------
  10039. 2
  10040. $biglist is a collection of routines for maintaining huge persistent (sorted) lists in a format that is less likely to spam the server (which runs into a certain amount of trouble dealing with long ordinary lists --- btw we use `biglist' to refer to the huge data structure we're about to describe and `list' to refer to ordinary MOO lists {...}).  The biglist in question lives on a particular object, to which we will refer in the discussion below as the `home' object, and its various elements appear as leaves of a tree whose nodes are kept in properties of the home object.  It should be noted that the home object does not need to be (and in fact should *not* be) a descendant of $biglist one; $biglist merely provides utilities for manipulating the properties on the home object that are used in a particular biglist manipulation.  
  10041. 2
  10042.  
  10043. 2
  10044. All of the utilities below refer to `caller' to locate the home object.  Thus verbs to manipulate a given biglist must be located on or inherited by its home object itself.  The home object needs to define the following verbs
  10045. 2
  10046.  
  10047. 2
  10048.   :_make(@args)     => new property on home object with value args
  10049. 2
  10050.   :_kill(prop)      delete a given property that was created by :_make
  10051. 2
  10052.   :_get(prop)       => home.prop
  10053. 2
  10054.   :_put(prop,@args) set home.prop = args
  10055. 2
  10056.   :_ord(element)    given something that is of the form of a biglist element
  10057. 2
  10058.                     return the corresponding ordinal (for sorting purposes).
  10059. 2
  10060.                     If you never intend to use :find_ord, then this can be a 
  10061. 2
  10062.                     routine that always returns 0 or some other random value.
  10063. 2
  10064.  
  10065. 2
  10066. See $generic_biglist_home or $big_mail_recipient for examples.
  10067. 2
  10068.  
  10069. 2
  10070. Those of the following routines that take a biglist argument are expecting
  10071. 2
  10072. either {} (empty biglist) or some biglist returned by one of the other routines
  10073. 2
  10074.  
  10075. 2
  10076.   :length(biglist)          => length(biglist) (i.e., number of elements)
  10077. 2
  10078.   :find_nth(biglist,n)      => biglist[n]
  10079. 2
  10080.   :find_ord(biglist,k,comp) => n where n is
  10081. 2
  10082.      the largest such that home:(comp)(k,home:_ord(biglist[n])) is false, or
  10083. 2
  10084.      the smallest such that home:(comp)(k,home:_ord(biglist[n+1])) is true.
  10085. 2
  10086.      Always returns a value between 0 and length(biglist) inclusive.
  10087. 2
  10088.      This assumes biglist to be sorted in order of increasing :_ord values 
  10089. 2
  10090.      with respect to home:(comp)().
  10091. 2
  10092.      Standard situation is :_ord returns a number and comp is a < verb.
  10093. 2
  10094.  
  10095. 2
  10096.   :start(biglist,s,e)  => {biglist[s..?],@handle} or {}
  10097. 2
  10098.   :next(@handle)       => {biglist[?+1..??],@newhandle} or {}
  10099. 2
  10100.      These two are used for iterating over a range of elements of a biglist
  10101. 2
  10102.      The canonical incantation for doing
  10103. 2
  10104.         for elt in (biglist[first..last])
  10105. 2
  10106.           ...
  10107. 2
  10108.         endfor
  10109. 2
  10110.      is
  10111. 2
  10112.         handle = :start(biglist,first,last);
  10113. 2
  10114.         while(handle)
  10115. 2
  10116.           for elt in (handle[1])
  10117. 2
  10118.             ...
  10119. 2
  10120.           endfor
  10121. 2
  10122.           handle = :next(@listdelete(handle,1));
  10123. 2
  10124.         endwhile
  10125. 2
  10126.  
  10127. 2
  10128. The following all destructively modify their biglist argument(s) L (and M).
  10129. 2
  10130.  
  10131. 2
  10132.   :set_nth(L,n,value)  =>  L[n] = value
  10133. 2
  10134.      replaces the indicated element
  10135. 2
  10136.  
  10137. 2
  10138.   :insert_before(L,M,n) => {@L[1..n-1],@M,@L[n..length(L)]}
  10139. 2
  10140.   :insert_after (L,M,n) => {@L[1..n],  @M,@L[n+1..length(L)]}
  10141. 2
  10142.      takes two distinct biglists, inserts one into the other at the given point
  10143. 2
  10144.      returns the resulting consolidated biglist
  10145. 2
  10146.  
  10147. 2
  10148.   :extract_range(L,m,n) => {{@L[1..m-1],@L[n+1..]}, L[m..n]} 
  10149. 2
  10150.      breaks the given biglist into two distinct biglists.
  10151. 2
  10152.  
  10153. 2
  10154.   :delete_range(L,m,n[,leafkiller]) => {@L[1..m-1],@L[n+1..]}
  10155. 2
  10156.   :keep_range  (L,m,n[,leafkiller]) => L[m..n]
  10157. 2
  10158.      like extract_range only we destroy what we don't want.
  10159. 2
  10160.  
  10161. 2
  10162.   :insertlast(L,value)  => {@L,value}
  10163. 2
  10164.      inserts a new element at the end of biglist.  
  10165. 2
  10166.      If find_ord is to continue to work properly, it is assumed that the 
  10167. 2
  10168.      home:_ord(elt) is greater (comp-wise) than all of the :_ord values
  10169. 2
  10170.      of elements currently in the biglist.
  10171. 2
  10172.  
  10173. 2
  10174.   :kill(L[,leafkiller]) 
  10175. 2
  10176.      destroys all nodes used by biglist.  
  10177. 2
  10178.      Calls home:leafkiller on each element.
  10179. 38
  10180. 1
  10181. 5
  10182. 38
  10183. 5
  10184. 5
  10185. 38
  10186. 4
  10187. 4
  10188. 1
  10189. 2
  10190. Core Utility Help
  10191. 38
  10192. 5
  10193. 2
  10194. Help database for LambdaCore utility objects and generics.
  10195. 38
  10196. 5
  10197. 4
  10198. 2
  10199. 0
  10200. 82928
  10201. 0
  10202. 743668552
  10203. 2
  10204. 1
  10205. #24
  10206. Programmer Help
  10207.  
  10208. 16
  10209. 2
  10210. -1
  10211. -1
  10212. -1
  10213. 32
  10214. -1
  10215. 23
  10216. 2
  10217. errors
  10218. 2
  10219. 173
  10220. -1
  10221. prepositions
  10222. 2
  10223. 165
  10224. -1
  10225. 51
  10226. @check-property
  10227. @check-chparent
  10228. @egrep
  10229. regular-expressions
  10230. @show
  10231. @grep
  10232. prog-index
  10233. help
  10234. prepositions
  10235. ;
  10236. utilities
  10237. truth
  10238. tasks
  10239. statements
  10240. programming
  10241. precedence
  10242. language
  10243. functions
  10244. expressions
  10245. eval
  10246. errors
  10247. @verb
  10248. @setenv
  10249. @rmverb
  10250. @rmproperty
  10251. @prospectus
  10252. @property
  10253. @program
  10254. @list
  10255. @kill
  10256. @kids
  10257. @forked
  10258. @edit
  10259. @display
  10260. @dbsize
  10261. @copy
  10262. @chparent
  10263. @chmod
  10264. @args
  10265. .program
  10266. @clearproperty
  10267. @disown
  10268. @disinherit
  10269. @displayoptions
  10270. @display-options
  10271. @add-feature
  10272. @remove-feature
  10273. features
  10274. examine
  10275. mail
  10276. #
  10277. 56
  10278. 4
  10279. 2
  10280. 2
  10281. *forward*
  10282. 2
  10283. @check-chparent
  10284. 2
  10285. 5
  10286. 4
  10287. 10
  10288. 2
  10289. Syntax:  @check-property <object>.<propname>
  10290. 2
  10291.          @check-chparent <object> to <newparent>
  10292. 2
  10293.          
  10294. 2
  10295. You cannot add a new property to an object if an ancestor or a descendant already defines a property with the same name.  @check-property will give you the list of all descendants of <object> that that define .<propname>.  
  10296. 2
  10297.  
  10298. 2
  10299. Likewise you cannot chparent an object to a new parent if the new parent has a property that is also defined on the object or some descendant.  Use @check-chparent to find out all instances of conflicting properties that would interfere with @chparent in this manner.
  10300. 2
  10301.  
  10302. 2
  10303. Note that @check-property requires either that you own the object or that it be writeable, the same conditions that need to hold if you are to create new properties on the object.  Similarly, @check-chparent requires that you own the object and that the new parent is either fertile or likewise owned by you.
  10304. 2
  10305.  
  10306. 2
  10307. For objects with large numbers of descendants, these commands can be time-consuming.
  10308. 2
  10309. 5
  10310. 4
  10311. 2
  10312. 2
  10313. *forward*
  10314. 2
  10315. @grep
  10316. 2
  10317. 5
  10318. 4
  10319. 162
  10320. 2
  10321. Regular expression matching allows you to test whether a string fits into a specific syntactic shape.  You can also search a string for a substring that fits a pattern.  See also the built-in function match()/rmatch().
  10322. 2
  10323.  
  10324. 2
  10325. A regular expression describes a set of strings.  The simplest case is one that describes a particular string; for example, the string `foo' when regarded as a regular expression matches `foo' and nothing else.  Nontrivial regular expressions use certain special constructs so that they can match more than one string.  For example, the regular expression `foo%|bar' matches either the string `foo' or the string `bar'; the regular expression `c[ad]*r' matches any of the strings `cr', `car', `cdr', `caar', `cadddar' and all other such strings with any number of `a''s and `d''s.
  10326. 2
  10327.  
  10328. 2
  10329. Regular expressions have a syntax in which a few characters are special constructs and the rest are "ordinary".  An ordinary character is a simple regular expression that matches that character and nothing else.  The special characters are `$', `^', `.', `*', `+', `?', `[', `]' and `%'.  Any other character appearing in a regular expression is ordinary, unless a `%' precedes it.
  10330. 2
  10331.  
  10332. 2
  10333. For example, `f' is not a special character, so it is ordinary, and therefore `f' is a regular expression that matches the string `f' and no other string.  (It does *not*, for example, match the string `ff'.)  Likewise, `o' is a regular expression that matches only `o'.
  10334. 2
  10335.  
  10336. 2
  10337. Any two regular expressions A and B can be concatenated.  The result is a regular expression which matches a string if A matches some amount of the beginning of that string and B matches the rest of the string.
  10338. 2
  10339.  
  10340. 2
  10341. As a simple example, we can concatenate the regular expressions `f' and `o' to get the regular expression `fo', which matches only the string `fo'.  Still trivial.
  10342. 2
  10343.  
  10344. 2
  10345. The following are the characters and character sequences that have special meaning within regular expressions.  Any character not mentioned here is not special; it stands for exactly itself for the purposes of searching and matching.
  10346. 2
  10347.  
  10348. 2
  10349. `.'  is a special character that matches any single character.  Using
  10350. 2
  10351.      concatenation, we can make regular expressions like `a.b', which matches
  10352. 2
  10353.      any three-character string that begins with `a' and ends with `b'.
  10354. 2
  10355.  
  10356. 2
  10357. `*'  is not a construct by itself; it is a suffix that means that the preceding
  10358. 2
  10359.      regular expression is to be repeated as many times as possible.  In `fo*',
  10360. 2
  10361.      the `*' applies to the `o', so `fo*' matches `f' followed by any number of
  10362. 2
  10363.      `o''s.
  10364. 2
  10365.  
  10366. 2
  10367.      The case of zero `o''s is allowed: `fo*' does match `f'.
  10368. 2
  10369.  
  10370. 2
  10371.      `*' always applies to the *smallest* possible preceding expression.  Thus,
  10372. 2
  10373.      `fo*' has a repeating `o', not a repeating `fo'.
  10374. 2
  10375.  
  10376. 2
  10377.      The matcher processes a `*' construct by matching, immediately, as many
  10378. 2
  10379.      repetitions as can be found.  Then it continues with the rest of the
  10380. 2
  10381.      pattern.  If that fails, it backtracks, discarding some of the matches of
  10382. 2
  10383.      the `*''d construct in case that makes it possible to match the rest of
  10384. 2
  10385.      the pattern.  For example, matching `c[ad]*ar' against the string
  10386. 2
  10387.      `caddaar', the `[ad]*' first matches `addaa', but this does not allow the
  10388. 2
  10389.      next `a' in the pattern to match.  So the last of the matches of `[ad]' is
  10390. 2
  10391.      undone and the following `a' is tried again.  Now it succeeds.
  10392. 2
  10393.  
  10394. 2
  10395. `+'  is like `*' except that at least one match for the preceding pattern is
  10396. 2
  10397.      required for `+'.  Thus, `c[ad]+r' does not match `cr' but does match
  10398. 2
  10399.      anything else that `c[ad]*r' would match.
  10400. 2
  10401.  
  10402. 2
  10403. `?'  is like `*' except that it allows either zero or one match for the
  10404. 2
  10405.      preceding pattern.  Thus, `c[ad]?r' matches `cr' or `car' or `cdr', and
  10406. 2
  10407.      nothing else.
  10408. 2
  10409.  
  10410. 2
  10411. `[ ... ]'
  10412. 2
  10413.      `[' begins a "character set", which is terminated by a `]'.  In the
  10414. 2
  10415.      simplest case, the characters between the two brackets form the set.
  10416. 2
  10417.      Thus, `[ad]' matches either `a' or `d', and `[ad]*' matches any string of
  10418. 2
  10419.      `a''s and `d''s (including the empty string), from which it follows that
  10420. 2
  10421.      `c[ad]*r' matches `car', etc.
  10422. 2
  10423.  
  10424. 2
  10425.      Character ranges can also be included in a character set, by writing two
  10426. 2
  10427.      characters with a `-' between them.  Thus, `[a-z]' matches any lower-case
  10428. 2
  10429.      letter.  Ranges may be intermixed freely with individual characters, as in
  10430. 2
  10431.      `[a-z$%.]', which matches any lower case letter or `$', `%' or period.
  10432. 2
  10433.  
  10434. 2
  10435.      Note that the usual special characters are not special any more inside a
  10436. 2
  10437.      character set.  A completely different set of special characters exists
  10438. 2
  10439.      inside character sets: `]', `-' and `^'.
  10440. 2
  10441.  
  10442. 2
  10443.      To include a `]' in a character set, you must make it the first character.
  10444. 2
  10445.      For example, `[]a]' matches `]' or `a'.  To include a `-', you must use it
  10446. 2
  10447.      in a context where it cannot possibly indicate a range: that is, as the
  10448. 2
  10449.      first character, or immediately after a range.
  10450. 2
  10451.  
  10452. 2
  10453. `[^ ... ]'
  10454. 2
  10455.      `[^' begins a "complement character set", which matches any character
  10456. 2
  10457.      except the ones specified.  Thus, `[^a-z0-9A-Z]' matches all characters
  10458. 2
  10459.      *except* letters and digits.
  10460. 2
  10461.  
  10462. 2
  10463.      `^' is not special in a character set unless it is the first character.
  10464. 2
  10465.      The character following the `^' is treated as if it were first (it may be
  10466. 2
  10467.      a `-' or a `]').
  10468. 2
  10469.  
  10470. 2
  10471. `^'  is a special character that matches the empty string -- but only if at the
  10472. 2
  10473.      beginning of the string being matched.  Otherwise it fails to match
  10474. 2
  10475.      anything.  Thus, `^foo' matches a `foo' which occurs at the beginning of
  10476. 2
  10477.      the string.
  10478. 2
  10479.  
  10480. 2
  10481. `$'  is similar to `^' but matches only at the *end* of the string.  Thus,
  10482. 2
  10483.      `xx*$' matches a string of one or more `x''s at the end of the string.
  10484. 2
  10485.  
  10486. 2
  10487. `%'  has two functions: it quotes the above special characters (including `%'),
  10488. 2
  10489.      and it introduces additional special constructs.
  10490. 2
  10491.  
  10492. 2
  10493.      Because `%' quotes special characters, `%$' is a regular expression that
  10494. 2
  10495.      matches only `$', and `%[' is a regular expression that matches only `[',
  10496. 2
  10497.      and so on.
  10498. 2
  10499.  
  10500. 2
  10501.      For the most part, `%' followed by any character matches only that
  10502. 2
  10503.      character.  However, there are several exceptions: characters that, when
  10504. 2
  10505.      preceded by `%', are special constructs.  Such characters are always
  10506. 2
  10507.      ordinary when encountered on their own.
  10508. 2
  10509.  
  10510. 2
  10511.      No new special characters will ever be defined.  All extensions to the
  10512. 2
  10513.      regular expression syntax are made by defining new two-character
  10514. 2
  10515.      constructs that begin with `%'.
  10516. 2
  10517.  
  10518. 2
  10519. `%|' specifies an alternative.  Two regular expressions A and B with `%|' in
  10520. 2
  10521.      between form an expression that matches anything that either A or B will
  10522. 2
  10523.      match.
  10524. 2
  10525.  
  10526. 2
  10527.      Thus, `foo%|bar' matches either `foo' or `bar' but no other string.
  10528. 2
  10529.  
  10530. 2
  10531.      `%|' applies to the largest possible surrounding expressions.  Only a
  10532. 2
  10533.      surrounding `%( ... %)' grouping can limit the grouping power of `%|'.
  10534. 2
  10535.  
  10536. 2
  10537.      Full backtracking capability exists for when multiple `%|''s are used.
  10538. 2
  10539.  
  10540. 2
  10541. `%( ... %)'
  10542. 2
  10543.      is a grouping construct that serves three purposes:
  10544. 2
  10545.  
  10546. 2
  10547.        1. To enclose a set of `%|' alternatives for other operations.  Thus,
  10548. 2
  10549.           `%(foo%|bar%)x' matches either `foox' or `barx'.
  10550. 2
  10551.  
  10552. 2
  10553.        2. To enclose a complicated expression for a following `*', `+', or `?'
  10554. 2
  10555.           to operate on.  Thus, `ba%(na%)*' matches `bananana', etc., with any
  10556. 2
  10557.           number of `na''s, including none.
  10558. 2
  10559.  
  10560. 2
  10561.        3. To mark a matched substring for future reference.
  10562. 2
  10563.  
  10564. 2
  10565.      This last application is not a consequence of the idea of a parenthetical
  10566. 2
  10567.      grouping; it is a separate feature that happens to be assigned as a second
  10568. 2
  10569.      meaning to the same `%( ... %)' construct because there is no conflict in
  10570. 2
  10571.      practice between the two meanings.  Here is an explanation of this
  10572. 2
  10573.      feature:
  10574. 2
  10575.  
  10576. 2
  10577. `%DIGIT'
  10578. 2
  10579.      After the end of a `%( ... %)' construct, the matcher remembers the
  10580. 2
  10581.      beginning and end of the text matched by that construct.  Then, later on
  10582. 2
  10583.      in the regular expression, you can use `%' followed by DIGIT to mean
  10584. 2
  10585.      "match the same text matched by the DIGIT'th `%( ... %)' construct in the
  10586. 2
  10587.      pattern."  The `%( ... %)' constructs are numbered in the order that their
  10588. 2
  10589.      `%(''s appear in the pattern.
  10590. 2
  10591.  
  10592. 2
  10593.      The strings matching the first nine `%( ... %)' constructs appearing in a
  10594. 2
  10595.      regular expression are assigned numbers 1 through 9 in order of their
  10596. 2
  10597.      beginnings.  `%1' through `%9' may be used to refer to the text matched by
  10598. 2
  10599.      the corresponding `%( ... %)' construct.
  10600. 2
  10601.  
  10602. 2
  10603.      For example, `%(.*%)%1' matches any string that is composed of two
  10604. 2
  10605.      identical halves.  The `%(.*%)' matches the first half, which may be
  10606. 2
  10607.      anything, but the `%1' that follows must match the same exact text.
  10608. 2
  10609.  
  10610. 2
  10611. `%b' matches the empty string, but only if it is at the beginning or end of a
  10612. 2
  10613.      word.  Thus, `%bfoo%b' matches any occurrence of `foo' as a separate word.
  10614. 2
  10615.      `%bball%(s%|%)%b' matches `ball' or `balls' as a separate word.
  10616. 2
  10617.  
  10618. 2
  10619.      For the purposes of this construct and the five that follow, a word is
  10620. 2
  10621.      defined to be a sequence of letters and/or digits.
  10622. 2
  10623.  
  10624. 2
  10625. `%B' matches the empty string, provided it is *not* at the beginning or end of
  10626. 2
  10627.      a word.
  10628. 2
  10629.  
  10630. 2
  10631. `%<' matches the empty string, but only if it is at the beginning of a word.
  10632. 2
  10633.  
  10634. 2
  10635. `%>' matches the empty string, but only if it is at the end of a word.
  10636. 2
  10637.  
  10638. 2
  10639. `%w' matches any word-constituent character (i.e., any letter or digit).
  10640. 2
  10641.  
  10642. 2
  10643. `%W' matches any character that is not a word constituent.
  10644. 2
  10645. 5
  10646. 4
  10647. 7
  10648. 2
  10649. Syntax:  @show <object>
  10650. 2
  10651.          @show <object>.<prop-name>
  10652. 2
  10653.          @show <object>:<verb-name>
  10654. 2
  10655.  
  10656. 2
  10657. Displays quite detailed information about an object, property or verb, including its name, owner, permission bits, etc.  The information displayed for an object can be quite long.
  10658. 2
  10659.  
  10660. 2
  10661. See also @display, which displays different information and is controlled differently.
  10662. 2
  10663. 5
  10664. 4
  10665. 9
  10666. 2
  10667. Syntax:  @grep <string> in <object>
  10668. 2
  10669.          @grep <string> in {<objectlist>}
  10670. 2
  10671.  
  10672. 2
  10673.          @egrep <regexp> in <object>
  10674. 2
  10675.          @egrep <regexp> in {<objectlist>}
  10676. 2
  10677.  
  10678. 2
  10679. These are named for the corresponding unix utilities.
  10680. 2
  10681. @grep searches the given object(s) for verbs whose verbcode contains the given string as a substring of one of its lines.  
  10682. 2
  10683. @egrep searches the given object(s) for verbs whose verbcode contains a substring matching the given regular expression (see `help regular-expressions').
  10684. 2
  10685. 5
  10686. 4
  10687. 2
  10688. 2
  10689. *index*
  10690. 2
  10691. Programmer Help Topics
  10692. 2
  10693. 5
  10694. 4
  10695. 15
  10696. 2
  10697. *pass*
  10698. 2
  10699. help
  10700. 2
  10701.  
  10702. 2
  10703. For programmers, the help system provides the following additional forms:
  10704. 2
  10705.  
  10706. 2
  10707.   help object:verbname   -- prints any documentation strings that are present
  10708. 2
  10709.                             at the beginning of the program for that verb.
  10710. 2
  10711.   help $<whatever>_utils -- prints general information about one of the 
  10712. 2
  10713.                             $..._utils objects (e.g., $string_utils, 
  10714. 2
  10715.                             $list_utils, etc...), which are all libraries 
  10716. 2
  10717.                             of generally used verbs.
  10718. 2
  10719.   help builtin()         -- prints documentation from the programmers manual
  10720. 2
  10721.                             about the named primitive, for example length()
  10722. 2
  10723.  
  10724. 2
  10725. For information about how the help system itself works and about how to associate local help databases with specific rooms or player classes, see `help $help'.
  10726. 2
  10727. 5
  10728. 4
  10729. 3
  10730. 2
  10731. *prepositions*
  10732. 2
  10733. The complete list of prepositions recognized by the command-line parser:
  10734. 2
  10735.  
  10736. 2
  10737. 5
  10738. 4
  10739. 2
  10740. 2
  10741. *forward*
  10742. 2
  10743. eval
  10744. 38
  10745. 1
  10746. 4
  10747. 17
  10748. 2
  10749. The core database has a number of objects serving as libraries of useful verbs.
  10750. 2
  10751. More detailed information can be obtained for (some of) these, via `help $whatever_utils'
  10752. 2
  10753.  
  10754. 2
  10755. $building_utils -- 
  10756. 2
  10757. $code_utils     -- parsing and manipulating verb code
  10758. 2
  10759. $command_utils  -- reporting matching errors to the player
  10760. 2
  10761. $gender_utils   -- managing gendered objects
  10762. 2
  10763. $list_utils     -- list manipulation
  10764. 2
  10765. $set_utils      -- set manipulation
  10766. 2
  10767. $lock_utils     -- key expression manipulation
  10768. 2
  10769. $match_utils    -- 
  10770. 2
  10771. $object_utils   -- object information 
  10772. 2
  10773.                   (inheritance/location hierarchy, verb/property lists)
  10774. 2
  10775. $perm_utils     -- permissions
  10776. 2
  10777. $string_utils   -- string manipulation
  10778. 2
  10779. $time_utils     -- time (numeric and verbal) manipulation
  10780. 2
  10781. $trig_utils     -- trigonometric and other numerical utilities
  10782. 2
  10783. 5
  10784. 4
  10785. 5
  10786. 2
  10787. Several kinds of statements, expressions, and functions in the MOO programming language use a notion that some MOO values are 'true' and others 'false'.
  10788. 2
  10789.  
  10790. 2
  10791. The only values that are considered true are non-zero numbers, non-empty strings, and non-empty lists.
  10792. 2
  10793.  
  10794. 2
  10795. All other values (i.e., 0, "", {}, objects, and errors) are considered false.
  10796. 38
  10797. 1
  10798. 4
  10799. 17
  10800. 2
  10801. A task is an execution of a MOO program.  There are five ways for tasks to be created in LambdaMOO:
  10802. 2
  10803.    + Every time a player types a command, a task is created to execute that command; we call these 'command tasks'.
  10804. 2
  10805.    + Whenever a player connects or disconnects from the MOO, the server starts a task to do whatever processing is necessary, such as printing out 'Munchkin has connected' to all of the players in the same room; these are called 'server tasks'.
  10806. 2
  10807.    + The FORK statement in the programming language creates a task whose execution is delayed for at least some given number of seconds; these are 'forked tasks'.
  10808. 2
  10809.    + The suspend() function suspends the execution of the current task.  A snapshot is taken of whole state of the execution, and the execution will be resumed later.  These are called `suspended tasks'.
  10810. 2
  10811.    + The read() function also suspends the execution of the current task, in this case waiting for the player to type a line of input.  When the line is received, the task resumes with the read() function returning the input line as result.  These are called `reading tasks'.
  10812. 2
  10813.  
  10814. 2
  10815. The last three kinds of tasks above are collectively known as `queued tasks' or `waiting tasks', since they may not run immediately.
  10816. 2
  10817.  
  10818. 2
  10819. To prevent a maliciously- or incorrectly-written MOO program from running forever and monopolizing the server, limits are placed on the running time of every task.  One limit is that no task is allowed to run longer than 15 seconds; this limit is, in practice, never reached.  The reason is that there is a second limit on the number of operations a task may execute.
  10820. 2
  10821.  
  10822. 2
  10823. The server counts down 'ticks' as any task executes.  Roughly speaking, it counts one tick for every expression evaluation (other than variables and literals), one for every `if', `fork' or `return' statement, and one for every iteration of a loop.  If the count gets all the way down to zero, the task is immediately and unceremoniously aborted.  All tasks begin or resume with an store of 30,000 ticks; this is enough for almost all normal uses.
  10824. 2
  10825.  
  10826. 2
  10827. Because queued tasks may exist for long periods of time before they begin execution, there are commands to list the ones that you own and to kill them before they execute.  These commands are covered in the following help topics:
  10828. 2
  10829.  
  10830. 2
  10831. @forked -- listing the forked tasks that you own
  10832. 2
  10833. @kill -- killing a particular forked task
  10834. 38
  10835. 1
  10836. 4
  10837. 36
  10838. 2
  10839. The following kinds of statements exist in the MOO programming language:
  10840. 2
  10841.  
  10842. 2
  10843.         ;
  10844. 2
  10845. The null statement does nothing.
  10846. 2
  10847.  
  10848. 2
  10849.         expression ;
  10850. 2
  10851. The expression statement evaluates the expression and then discards the value.
  10852. 2
  10853.  
  10854. 2
  10855.         IF ( expression ) statements ENDIF
  10856. 2
  10857.         IF ( expression ) statements ELSE statements ENDIF
  10858. 2
  10859.         IF ( expression )
  10860. 2
  10861.           statements
  10862. 2
  10863.         ELSEIF ( expression )
  10864. 2
  10865.           statements
  10866. 2
  10867.         ...
  10868. 2
  10869.         ELSE
  10870. 2
  10871.           statements
  10872. 2
  10873.         ENDIF
  10874. 2
  10875. The conditional statement evaluates each expression in turn and executes the statements associated with the first one to return a true value; the ELSE statements are executed if none of the expressions returns a true value.  There can be any number of ELSEIF clauses and the ELSE part is optional.  See 'help truth' for the definition of 'true value'.
  10876. 2
  10877.  
  10878. 2
  10879.         FOR name IN ( expression ) statements ENDFOR
  10880. 2
  10881. The list iteration statement first evaluates the expression, which must return a list.  It then executes the statements once for each element of that list, each time with the named variable having the value of the corresponding list element.
  10882. 2
  10883.  
  10884. 2
  10885.         FOR name IN [ expression .. expression ] statements ENDFOR
  10886. 2
  10887. The numeric iteration statement first evaluates the two expressions, both of which must return numbers; call those numbers N1 and N2, respectively.  The statements are then executed once for each integer I such that N1 <= I <= N2, in increasing order; each time, the named variable has the corresponding value of I.
  10888. 2
  10889.  
  10890. 2
  10891.         WHILE ( expression ) statements ENDWHILE
  10892. 2
  10893. The indefinite iteration statement repeatedly evaluates the expression and, each time it returns a true value, executes the statements.  The loop stops the first time that the expression returns a false value.  The definitions of 'true' and 'false' values is in 'help truth'.
  10894. 2
  10895.  
  10896. 2
  10897.         RETURN ;
  10898. 2
  10899.         RETURN expression ;
  10900. 2
  10901. The return statement evalautes the expression, if any, and returns the resulting value (or 0 if there is no expression) to the verb that called the current one.  Execution of the current verb is immediately terminated.
  10902. 2
  10903.  
  10904. 2
  10905.         FORK ( expression ) statements ENDFORK
  10906. 2
  10907.         FORK name ( expression ) statements ENDFORK
  10908. 2
  10909. The fork statement first executes the expression, which must return a number; call that number N.  It then creates a new MOO task that will, after at least N seconds, execute the statements.  When the new task begins, all variables will have the values they had at the time the FORK statement was executed.  The task executing the FORK statement immediately continues execution.  If a variable name is given after the FORK keyword, then it is assigned the 'queue ID' of the newly-created task.  The value of this variable is visible both to the task executing the fork statement and to the statements in the newly-created task.  See 'help tasks' for more information about forked tasks.
  10910. 38
  10911. 1
  10912. 4
  10913. 26
  10914. 2
  10915. MOO contains a rich programming language for the creation of interesting rooms, exits, and other objects.  Help is available on the following topics concerning programming in MOO:
  10916. 2
  10917.  
  10918. 2
  10919. language -- a brief reference for the syntax and semantics of the MOO language
  10920. 2
  10921. tasks -- a brief description of MOO tasks and their resource limits
  10922. 2
  10923.  
  10924. 2
  10925. @property -- adding a property to an object
  10926. 2
  10927. @rmproperty -- removing a property from an object
  10928. 2
  10929.  
  10930. 2
  10931. @verb   -- adding a verb to an object
  10932. 2
  10933. @rmverb -- removing a verb from an object
  10934. 2
  10935. @args   -- changing the syntax of a verb
  10936. 2
  10937. @copy   -- copying a verb from one object to another
  10938. 2
  10939.  
  10940. 2
  10941. .program/@program -- entering the program for a verb
  10942. 2
  10943. @list -- printing a listing of the program for a verb
  10944. 2
  10945. @edit -- editing verb code
  10946. 2
  10947.  
  10948. 2
  10949. @show     -- looking at all the details of an object, a property, or a verb
  10950. 2
  10951. @parents  -- listing the ancestors of an object
  10952. 2
  10953. @kids     -- listing the children of an object
  10954. 2
  10955. @contents -- listing the contents of an object
  10956. 2
  10957. @chmod    -- changing the permissions on an object, a property, or a verb
  10958. 2
  10959. @chparent -- changing the parent of an object
  10960. 2
  10961. @rename   -- changing the name of a verb or object
  10962. 2
  10963.  
  10964. 2
  10965. eval -- executing MOO statements and expressions without writing a verb
  10966. 38
  10967. 1
  10968. 4
  10969. 17
  10970. 2
  10971. The table below gives the relative precedence of all of the MOO operators; operators on higher lines in the table have higher precedence and those on the same line have identical precedence:
  10972. 2
  10973.  
  10974. 2
  10975.         !       - (without a left operand)
  10976. 2
  10977.         *       /       %
  10978. 2
  10979.         +-
  10980. 2
  10981.         ==      !=      <       <=      >       >=      in
  10982. 2
  10983.         &&      ||
  10984. 2
  10985.         ... ? ... | ... (the conditional expression)
  10986. 2
  10987.         =
  10988. 2
  10989.  
  10990. 2
  10991. Thus, the horrendous expression
  10992. 2
  10993.  
  10994. 2
  10995.         x = a < b && c > d + e * f ? w in y | - q - r
  10996. 2
  10997.  
  10998. 2
  10999. would be grouped as follows:
  11000. 2
  11001.  
  11002. 2
  11003.         x = (((a < b) && (c > (d + (e * f)))) ? (w in y) | ((- q) - r))
  11004. 38
  11005. 1
  11006. 4
  11007. 5
  11008. 2
  11009. The MOO programming language is described in excruciating detail in the LambdaMOO Programmer's Manual, available for FTP from parcftp.xerox.com in the file pub/MOO/ProgrammersManual.txt.  The online help consists of a few quick reference guides here in the help system under the following topics:
  11010. 2
  11011.  
  11012. 2
  11013. statements -- the syntax and semantics of the various kinds of MOO statements
  11014. 2
  11015. expressions -- the same for the various kinds of MOO expressions
  11016. 2
  11017. functions -- a list of the primitive functions available to MOO programs
  11018. 38
  11019. 1
  11020. 4
  11021. 93
  11022. 2
  11023. There are many, many built-in functions available to MOO programmers.  The following list gives a brief summary of the arguments and purpose of each function; for more information, see the LambdaMOO Programmer's Manual.  
  11024. 2
  11025.  
  11026. 2
  11027. pass(arg, ...)            -- calling a verb defined on this object's parent
  11028. 2
  11029. eval(string)              -- parsing and executing strings as MOO code
  11030. 2
  11031. notify(player, string)    -- sending text to a player's terminal
  11032. 2
  11033. read()                    -- reading a line of input from the player (*)
  11034. 2
  11035. output_delimiters(player) -- return {prefix,suffix} set by PREFIX/SUFFIX cmds
  11036. 2
  11037.  
  11038. 2
  11039. typeof(value)      -- determining the data type of a value
  11040. 2
  11041.  tostr(value, ...) -- converting any set of values into a string
  11042. 2
  11043.  tonum(value)      -- converting any non-list value into a number
  11044. 2
  11045.  toobj(value)      -- converting any non-list value into an object
  11046. 2
  11047. length(value)      -- returns the length of a string or list
  11048. 2
  11049.  
  11050. 2
  11051. listappend(list, value [, index]) -- adding an element at the end of a list
  11052. 2
  11053. listinsert(list, value [, index]) -- adding an element at the head of a list
  11054. 2
  11055.    listset(list, value, index)    -- updating a list at some index
  11056. 2
  11057. listdelete(list, index)           -- removing an element from a list
  11058. 2
  11059.     setadd(list, element) -- adding an element to a set represented as a list
  11060. 2
  11061.  setremove(list, element) -- removing an element from such a set
  11062. 2
  11063.  
  11064. 2
  11065. min(n1, n2, ...) -- minimum of n1,n2,...
  11066. 2
  11067. max(n1, n2, ...) -- maximum of n1,n2,...
  11068. 2
  11069. abs(n)           -- absolute value of n
  11070. 2
  11071. sqrt(n)          -- square root of n, rounded down
  11072. 2
  11073. random(n)        -- random integer between 1 and n inclusive
  11074. 2
  11075.  time()          -- current time in seconds since midnight GMT, 1 Jan 70
  11076. 2
  11077. ctime([time])    -- time (or current time) converted to a human-readable string
  11078. 2
  11079.  index(str1, str2 [, case-matters]) -- index of first str2 in str1
  11080. 2
  11081. rindex(str1, str2 [, case-matters]) -- index of last  str2 in str1
  11082. 2
  11083. strcmp(str1, str2) -- case-sensitive string comparison
  11084. 2
  11085. strsub(subject, what, with [, case-matters]) -- substitution in a string
  11086. 2
  11087. crypt(string [, salt]) -- one-way string encryption
  11088. 2
  11089.  match(str1, str2 [, case-matters]) -- match first regular expr str2 in str1
  11090. 2
  11091. rmatch(str1, str2 [, case-matters]) -- match last regular expr str2 in str1
  11092. 2
  11093. substitute(template, subs) -- perform substitutions on template
  11094. 2
  11095.  
  11096. 2
  11097.    valid(object)             -- testing whether an object exists
  11098. 2
  11099.   create(parent [, owner(*)])-- creating a new MOO object
  11100. 2
  11101.  recycle(object)             -- destroying a MOO object
  11102. 2
  11103.     move(object, where)      -- altering the object-containment hierarchy
  11104. 2
  11105. chparent(object, new-parent) -- altering the object-inheritance hierarchy
  11106. 2
  11107.   parent(object)             -- object's parent   in the inheritance hierarchy
  11108. 2
  11109. children(object)             -- object's children in the inheritance hierarchy
  11110. 2
  11111. max_object()       -- the highest-numbered object in the MOO
  11112. 2
  11113. renumber(obj)      -- changes an object's number to lowest available one (*)
  11114. 2
  11115. reset_max_object() -- resets max_object() to the largest valid object (*)
  11116. 2
  11117.  
  11118. 2
  11119.      properties(object) -- a list of the properties defined on an object
  11120. 2
  11121.    add_property(object, prop-name, value, info) -- add a new property
  11122. 2
  11123. delete_property(object, prop-name)              -- remove a property
  11124. 2
  11125.     property_info(object, prop-name)       -- {owner, perms} info on a property
  11126. 2
  11127. set_property_info(object, prop-name, info) -- setting same
  11128. 2
  11129. is_clear_property(object, prop-name) -- find out if a property is "clear"
  11130. 2
  11131.    clear_property(object, prop-name) -- make a property "clear"
  11132. 2
  11133.  
  11134. 2
  11135.       verbs(object) -- a list of the verbs defined on an object
  11136. 2
  11137.    add_verb(object, info, args)  -- add a verb to an object
  11138. 2
  11139. delete_verb(object, verb-name)   -- remove a verb from an object
  11140. 2
  11141.     verb_info(object, verb-name) -- {owner, perms, names} info for a verb defn.
  11142. 2
  11143.     verb_args(object, verb-name) -- {dobj, prep, iobj} argument info for a verb
  11144. 2
  11145.     verb_code(object, verb-name [, fully-paren [, indent]]) -- program listing
  11146. 2
  11147. set_verb_info(object, verb-name, {owner, perms, names})
  11148. 2
  11149. set_verb_args(object, verb-name, {dobj, prep, iobj})   
  11150. 2
  11151. set_verb_code(object, verb-name, {line, line, ...})
  11152. 2
  11153.  
  11154. 2
  11155.         is_player(object) -- testing whether or not object is a player
  11156. 2
  11157.           players()       -- a list of all players, active or not
  11158. 2
  11159. connected_players()       -- a list of all currently-connected players
  11160. 2
  11161.      idle_seconds(player) -- seconds since given player typed anything
  11162. 2
  11163. connected_seconds(player) -- seconds given player has been logged in
  11164. 2
  11165.     boot_player(player)        -- disconnect player from the MOO immediately(*)
  11166. 2
  11167. set_player_flag(player, value) -- set/clear player bit; boot player if clear(*)
  11168. 2
  11169. connection_name(player)   -- a server-assigned name for player's connection
  11170. 2
  11171. open_network_connection(@args) -- open a connection to another network site
  11172. 2
  11173.  
  11174. 2
  11175. caller_perms()         -- the player whose permissions your caller was using
  11176. 2
  11177. set_task_perms(player) -- changing permissions of the running task (*)
  11178. 2
  11179. callers()      -- list of {obj, verb, owner, vloc, player}: this task's stack
  11180. 2
  11181. suspend(secs)  -- suspending the current task for a number of seconds
  11182. 2
  11183. seconds_left() -- number of seconds left in the current task
  11184. 2
  11185. ticks_left()   -- number of ticks   left in the current task
  11186. 2
  11187. task_id()      -- a random number representing the currently-running task
  11188. 2
  11189. queued_tasks() -- list of {id,start,0,20000,owner,obj,verb,line,this}
  11190. 2
  11191. kill_task(id)  -- delete one of your tasks from the queue
  11192. 2
  11193.  
  11194. 2
  11195. server_log(string) -- add a comment to the server log file
  11196. 2
  11197. server_version() -- a string of three numbers "major.minor.release"
  11198. 2
  11199. memory_usage()   -- {{blocksize, nused, nfree}, ...}, the server's memory stats
  11200. 2
  11201. shutdown(msg)    -- print msg and kill the server (*)
  11202. 2
  11203. dump_database()  -- what it says (*)
  11204. 2
  11205.  
  11206. 2
  11207. (*) => as you might have expected, these usually require wizard permissions.
  11208. 38
  11209. 1
  11210. 4
  11211. 69
  11212. 2
  11213. The following kinds of expressions exist in the MOO programming language:
  11214. 2
  11215.  
  11216. 2
  11217.         number
  11218. 2
  11219.         # number
  11220. 2
  11221.         # - number
  11222. 2
  11223.         "character string"
  11224. 2
  11225.         error-name
  11226. 2
  11227. Literal expressions return the obvious values: numbers, object numbers, strings, and errors.
  11228. 2
  11229.  
  11230. 2
  11231.         { expression , expression , ... , expression }
  11232. 2
  11233. The list-construction expression evaluates the each of the expressions in turn and returns a list whose elements are the results of those expressions.  Any of the expressions may be prefixed with an at-sign ('@'); in this case, that expression must return a list and, rather than that list becoming an element of the final list, its elements are spliced into the final list.
  11234. 2
  11235.  
  11236. 2
  11237.         name
  11238. 2
  11239. Variable expressions return the current value of the named variable.  Variable names must start with a letter or underscore ('_') and contain only letters, digits, and underscores.  The following variables are predefined:
  11240. 2
  11241.             OBJ, STR, LIST, ERR, NUM
  11242. 2
  11243.             player, caller, this, verb, args
  11244. 2
  11245.             argstr, dobj, dobjstr, prepstr, iobj, iobjstr
  11246. 2
  11247. Their initial values are described in detail in the LambdaMOO Programmer's Manual.
  11248. 2
  11249.  
  11250. 2
  11251.         expression . name
  11252. 2
  11253.         expression . ( expression )
  11254. 2
  11255.         $ name
  11256. 2
  11257. Property-reading expressions return the current value of a named property on the object that is the value of the first subexpression.  In the second form, the second subexpression must return a string, the name of the property to be read.  The third form is an abbreviation for '#0.name'.
  11258. 2
  11259.  
  11260. 2
  11261.         expression : name ( arguments )
  11262. 2
  11263.         expression : ( expression ) ( arguments )
  11264. 2
  11265. Verb-call expressions invoke a named verb on the object that is the value of the first subexpression, passing the given arguments.  In the second form, the second subexpression must return a string, the name of the verb to invoke.  The syntax and semantics of arguments is exactly as in the list-construction expression but no initial or final curly-braces ('{' or '}') are used.
  11266. 2
  11267.  
  11268. 2
  11269.         function ( arguments )
  11270. 2
  11271. The function-call expression invokes one of the MOO primitive functions, as listed in 'help functions', passing the given arguments.
  11272. 2
  11273.  
  11274. 2
  11275.         expression [ expression ]
  11276. 2
  11277. The indexing expression first evaluates the two subexpressions; call their values S and N, respectively.  S must be a string or a list and N must be a number between 1 and the length of S, inclusive.  The Nth element of S is returned.  The elements of a string are themselves one-character strings.
  11278. 2
  11279.  
  11280. 2
  11281.         expression [ expression .. expression ]
  11282. 2
  11283. The subsequence expression first evaluates the three subexpressions; call their values S, N1, and N2, respecitively.  S must be a string or a list and N1 and N2 must be numbers.  If N1 <= N2, then both must be between 1 and the length of S, inclusive; the subsequence of S beginning at index N1 and continuing through index N2 is returned.  If N1 > N2, the empty sequence of the same type as S is returned, either "" or {}.
  11284. 2
  11285.  
  11286. 2
  11287.         name = expression
  11288. 2
  11289.         expression . name = expression
  11290. 2
  11291.         expression . ( expression ) = expression
  11292. 2
  11293.         $ name = expression
  11294. 2
  11295. Assignment expressions give new values to variables and object properties.  For the second and third forms, the expressions on the left-hand side of the '=' are evaluated first.  Then the right-hand side expression is evaluated and result is stored in the indicated variable or object property.
  11296. 2
  11297.  
  11298. 2
  11299.         expression + expression
  11300. 2
  11301.         expression - expression
  11302. 2
  11303.         expression * expression
  11304. 2
  11305.         expression / expression
  11306. 2
  11307.         expression % expression
  11308. 2
  11309.         - expression
  11310. 2
  11311. The arithmetic expressions evaluate the subexpressions, all of which must return numbers, and then perform addition, subtraction, multiplication, division, remaindering, or negation, respectively.  For addition, the subexpressions may both return strings as well; in this case, the result is the concatenation of the two strings.
  11312. 2
  11313.  
  11314. 2
  11315.         expression == expression
  11316. 2
  11317.         expression != expression
  11318. 2
  11319.         expression < expression
  11320. 2
  11321.         expression <= expression
  11322. 2
  11323.         expression > expression
  11324. 2
  11325.         expression >= expression
  11326. 2
  11327. The comparison expressions evaluate the subexpressions and then test whether or not the first result is equal to, unequal to, less than, less than or equal to, greater than, or greater than or equal to the second result, respectively.  If the indicated relation holds then they return 1 and otherwise they return 0.  Comparisons of strings are performed case-insensitively, those of lists are performed on an element-by-element basis, objects are compared by their object numbers, and errors by an ordering given in the LambdaMOO Programmer's Manual.
  11328. 2
  11329.  
  11330. 2
  11331.         expression ? expression | expression
  11332. 2
  11333.         expression && expression
  11334. 2
  11335.         expression || expression
  11336. 2
  11337.         ! expression
  11338. 2
  11339. The logical expressions each return results based upon the truth value of their first subexpression; call the value of this expression X.  The first of these returns the value of the second subexpression if X is a true value and that of the third expression if X is a false value; the unused subexpression is not evaluated.  The definitions of 'true value' and 'false value' are given in 'help truth'.  The expression 'E1 && E2' is an abbreviation for 'E1 ? E2 | E1' except that E1 is only evaluated once.  The expression 'E1 || E2' is an abbreviation for 'E1 ? E1 | E2' except that E1 is only evaluated once.  The expression '! E' is an abbreviation for 'E ? 0 | 1'.
  11340. 2
  11341.  
  11342. 2
  11343.         expression IN expression
  11344. 2
  11345. The list-membership expression first evaluates both subexpressions; call their values E and L, respectively.  L must be a list.  If E is an element of L, then the index of the first occurence of E in L is returned.  If E is not an element of L, then 0 is returned.
  11346. 2
  11347.  
  11348. 2
  11349. The method for disambiguating the meaning of a complex MOO expression in the absence of sufficient parentheses is described in 'help precedence'.
  11350. 38
  11351. 1
  11352. 4
  11353. 37
  11354. 2
  11355. Syntax:  eval <MOO-code>
  11356. 2
  11357.          ; <MOO-code>
  11358. 2
  11359.          eval-d <MOO-code>
  11360. 2
  11361.  
  11362. 2
  11363. Evaluates the given piece of MOO code and prints the resulting value.  If the MOO code begins with one of the MOO language keywords ('if', 'for', 'while', 'fork', or 'return') or with the character ';', then the entire piece of code is treated as the program for a verb, with ';' appended to the end.  Otherwise, 'return' is appended to the front and ';' is appended to the end and that string is treated as the code for a verb.  In either case, the resulting verb is invoked and whatever value it returns is printed.
  11364. 2
  11365.  
  11366. 2
  11367. For programmers, this is such a mind-bogglingly useful thing to do that there is a simple abbreviation for this command; any command beginning with a semicolon (';') is treated as a use of 'eval'.
  11368. 2
  11369.  
  11370. 2
  11371. Eval treats specially a duplicated semicolon at the beginning.  It enables you to make multi-statement programs within eval (but does not by default print the return value).
  11372. 2
  11373.  
  11374. 2
  11375. Eval-d (no ";" abbreviation for this) evaluates the following text exactly as eval, except that the "d" debug flag (see programmer's manual for explanation) is turned off.  Thus errors will cause an error return value rather than a traceback.
  11376. 2
  11377.  
  11378. 2
  11379. If you set the player property .eval_time to 1, then eval will print out how many ticks and seconds the program required.
  11380. 2
  11381.  
  11382. 2
  11383. Examples:
  11384. 2
  11385.    eval 3 + 4
  11386. 2
  11387.    =>  7
  11388. 2
  11389.    ;3+4
  11390. 2
  11391.    =>  7
  11392. 2
  11393.    ;for x in (player.aliases) player:tell(x); endfor
  11394. 2
  11395.    Haakon
  11396. 2
  11397.    Wizard
  11398. 2
  11399.    ArchWizard
  11400. 2
  11401.    =>  0
  11402. 2
  11403.    ;;l = {}; for i in [1..10] l = {@l, i}; endfor return l
  11404. 2
  11405.    =>  {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
  11406. 2
  11407.    eval-d 8 + "foo"
  11408. 2
  11409.    => E_TYPE  (Type mismatch)
  11410. 2
  11411.  
  11412. 2
  11413. You may customize your evaluation environment.  The player property .eval_env may contain statements to be executed prior to any evaluated program.  Two caveats:  This will throw off the tick count.  You can account for additional ticks inserted by your environment with the .eval_ticks property; just set it to the number of ticks you'd like subtracted from the total.  Additionally, if you make a syntax error in your program, the line reported will be wrong (it will count those initial statements), and if you make an error in the eval_env itself, you can be in deep trouble.  Despite these drawbacks, the eval_env property can be quite useful.  The following is a sample:
  11414. 2
  11415.  
  11416. 2
  11417. Eval_env:    "me=player;here=player.location;"
  11418. 2
  11419. eval_ticks:  3
  11420. 2
  11421.  
  11422. 2
  11423. See also @setenv.
  11424. 2
  11425.  
  11426. 2
  11427. You can also define textual substitutions in a separate property, called eval_subs.  These are discouraged, however, for anything that can be done with variable assignments, because the overhead of replacing the strings in the evaluated program is significant.  However, some things, such as substituting characters which can't be typed easily on one keyboard (e.g. "[]" is difficult to type on some IBM keyboards), can only be done by textual substitutions.  Note that the eval substitutions are also interpreted by the verb editor when "eval_subs" is selected in your .edit_options property (see `help editors').  This adds to their overhead, but again, makes it possible for people to program who otherwise can't type the full character set.  Remember:  Don't use eval_subs unless you really have to!
  11428. 38
  11429. 1
  11430. 4
  11431. 3
  11432. 2
  11433. *errors*
  11434. 2
  11435. The complete list of error codes:
  11436. 2
  11437.  
  11438. 2
  11439. 5
  11440. 4
  11441. 17
  11442. 2
  11443. Syntax:  @verb <object>:<verb-name(s)>
  11444. 2
  11445.          @verb <object>:<verb-name(s)> <dobj> [<prep> [<iobj>]]
  11446. 2
  11447.  
  11448. 2
  11449. Adds a new verb with the given name(s) to the named object.  If there are multiple names, they should be separated by spaces and all enclosed in quotes:
  11450. 2
  11451.  
  11452. 2
  11453.         @verb foo:"bar baz mum*ble"
  11454. 2
  11455.  
  11456. 2
  11457. The direct and indirect object specifiers (<dobj> and <iobj>) must be either 'none', 'this', or 'any'; their meaning is discussed in the LambdaMOO Programmer's Manual.  The preposition specifier (<prep>) must be either 'none', 'any', or one of the prepositional phrases listed in `help prepositions' (a prepositional phrase with more than one word must be enclosed in quotes ("")).  All three specifiers default to 'none'.
  11458. 2
  11459.  
  11460. 2
  11461. It is also possible to specify the new verb's permissions and owner as part of the same command (rather than having to issue separate @chmod/@chown commands)
  11462. 2
  11463.  
  11464. 2
  11465.      @verb <object>:<verb-name(s)> <dobj> <prep> <iobj> <permissions>
  11466. 2
  11467.      @verb <object>:<verb-name(s)> <dobj> <prep> <iobj> <permissions> <owner>
  11468. 2
  11469.  
  11470. 2
  11471. <permissions> are as with @chmod, i.e., must be some subset of "rwxd".  They default to "rd" (specifying "w" for a verb is highly inadvisable).  The owner defaults to the player typing the command; only wizards can create verbs with owners other than themselves.
  11472. 2
  11473.  
  11474. 2
  11475. You may also use "tnt" in place of "this none this" for the dobj prep iobj arguments.  "this none this" is used to indicate non-command verbs, since the parser can't possibly interpret a command as "this none this".  For these verbs, the permissions default to "rxd"; the "x" bit is set so that they can be called from other programs.  (If they couldn't be used as commands, and they couldn't be called from programs, they wouldn't be good for anything!)
  11476. 38
  11477. 1
  11478. 4
  11479. 5
  11480. 2
  11481. Syntax:  @setenv <environment string>
  11482. 2
  11483.  
  11484. 2
  11485. Defines the environment for eval (property player.eval_env).  See "help eval"
  11486. 2
  11487. for more information.  This is mostly useful when one's .eval_env is broken
  11488. 2
  11489. and prevents one from using eval to reset it.
  11490. 38
  11491. 1
  11492. 4
  11493. 7
  11494. 2
  11495. Syntax:  @rmverb <object>:<verb-name>
  11496. 2
  11497.          @rmverb <object>:<verb-name>  <dobj> <prep> <iobj>
  11498. 2
  11499.  
  11500. 2
  11501. Removes the named verb from the named object.
  11502. 2
  11503. If there is more than one verb matching the given verb-name, this removes the most recently defined one.
  11504. 2
  11505.  
  11506. 2
  11507. With the 2nd form of the command the verb removed is the most recent one matching both the given verb-name *and* the given dobj/prep/iobj specifiers.
  11508. 2
  11509. 5
  11510. 4
  11511. 3
  11512. 2
  11513. Syntax:  @rmproperty <object>.<prop-name>
  11514. 2
  11515.  
  11516. 2
  11517. Removes the named property from the named object.  '@rmproperty' may be abbreviated as '@rmprop'.
  11518. 2
  11519. 5
  11520. 4
  11521. 29
  11522. 2
  11523. Usage:  @prospectus player [from number] [to number]
  11524. 2
  11525.  
  11526. 2
  11527. Like @audit, but displays more information.  The optional from and to arguments are for restricting the display to specific object numbers, if you happen to know the player only owns objects in the included range.
  11528. 2
  11529.  
  11530. 2
  11531. Example:
  11532. 2
  11533.    Objects owned by Frand (from #0 to #54949):
  11534. 2
  11535.      P[ 23]    #47 Frand                          [Hyperspace Hovel]
  11536. 2
  11537.      T        #152 Frand's trio of shoes          [Frand]
  11538. 2
  11539.    KfT[ 10]   #391 Frand's notifier class         [Nowhere]
  11540. 2
  11541.      T[  8]   #393 Frand's chessboard             [The Dining Room]
  11542. 2
  11543.    KfT[ 11]   #775 Frand's generic game board     [Nowhere]
  11544. 2
  11545.      T[  6]   #893 Ghost game                     [The Dining Room]
  11546. 2
  11547.      T[ 16]   #894 Frand's mind bender            [The Dining Room]
  11548. 2
  11549.      C        #997 polka-dot hole                 [Hyperspace Hovel]
  11550. 2
  11551.      R[  1]  #1002 Hyperspace Hovel              
  11552. 2
  11553.      E      #11958 out                            Monster Cage->*Dr. Empirico's Lab
  11554. 2
  11555.       ...
  11556. 2
  11557.  
  11558. 2
  11559. The K in the first column indicates that the object has children owned by other players.  A lowercase k indicates the object has children but owned only by the player.  The second column indicates whether the object is publicly readable or publicly parentable.  An r indicates readability.  A lowercase f indicates the object is both readable and allows children (is fertile).  An uppercase F indicates the object is not readable, yet allows children to be created.  (This is usually an error.)  If the object is readable by the issuer of the @prospectus command (that is, publicly readable or owned by the issuer), then the number in brackets indicates the number of verbs which have been defined on this object (not including any verbs from any parents).
  11560. 2
  11561.  
  11562. 2
  11563. The third column indicates what type of object this is.
  11564. 2
  11565.         T       Thing
  11566. 2
  11567.         E       Exit
  11568. 2
  11569.         R       Room
  11570. 2
  11571.         C       Container
  11572. 2
  11573.         N       Note
  11574. 2
  11575.         P       Player
  11576. 2
  11577.         p       Parent object appropriate for players ("Player class")
  11578. 2
  11579.         blank   Other
  11580. 2
  11581. 5
  11582. 4
  11583. 13
  11584. 2
  11585. Syntax:  @property <object>.<prop-name>
  11586. 2
  11587.          @property <object>.<prop-name> <initial-value>
  11588. 2
  11589.  
  11590. 2
  11591. Adds a new property named <prop-name> to the named object.  The initial value is given by the second argument, if present; it defaults to 0.  
  11592. 2
  11593.  
  11594. 2
  11595. Normally, a property is created with permissions 'rc' and owned by whoever types the command.  However, you may also specify these explicitly
  11596. 2
  11597.  
  11598. 2
  11599.          @property <object>.<prop-name> <initial-value> <permissions>
  11600. 2
  11601.          @property <object>.<prop-name> <initial-value> <permissions> <owner>
  11602. 2
  11603.  
  11604. 2
  11605. Only wizards can create properties with owners other than themselves.
  11606. 2
  11607.  
  11608. 2
  11609. '@property' can be abbreviated as '@prop'.
  11610. 38
  11611. 1
  11612. 4
  11613. 17
  11614. 2
  11615. Syntax:  @program <object>:<verb-name>
  11616. 2
  11617.          @program <object>:<verb-name> <dobj> <preposition> <iobj>
  11618. 2
  11619.  
  11620. 2
  11621. Changes the MOO program associated with the named verb on the named object.
  11622. 2
  11623. If you provide <dobj> <preposition> and <iobj> as in the second form of this command, then it is the first verb with matching direct object, preposition and indirect object specifiers that is the one getting the new program.  This is useful if you have several verbs matching the same name.
  11624. 2
  11625.  
  11626. 2
  11627. Typing the @program command always puts the server into a line-reading mode, in which each line you type is saved away without any action unless said line is one of the following:
  11628. 2
  11629.  
  11630. 2
  11631.   .
  11632. 2
  11633.   @abort
  11634. 2
  11635.   .<text>
  11636. 2
  11637.  
  11638. 2
  11639. A period on a line by itself ends the line-reading mode and continues with the command, in this case, the saved lines are considered as a program, checked for syntax errors and, if no errors are found, installed as the new program for the specified verb.  
  11640. 2
  11641.  
  11642. 2
  11643. @abort causes the command to terminate immediately with no change to any verb's program.  .<text> enters <text> literally as one of the lines to be saved, which is used for when, e.g., you want to enter the line `.' or the line `@abort'.
  11644. 2
  11645.  
  11646. 2
  11647. Note that this command *always* enters the line-reading mode, even if the indicated verb is not found.  In this case, lines of text are still read but they are ignored.  After any @program command, you always need to type a period or `@abort' to get back into the normal command-reading mode.
  11648. 2
  11649. 5
  11650. 4
  11651. 18
  11652. 2
  11653. Syntax:  @list <object>:<verb>
  11654. 2
  11655.          @list <object>:<verb> [with|without parentheses|numbers]
  11656. 2
  11657.          @list <object>:<verb> <dobj> <prep> <iobj>
  11658. 2
  11659.  
  11660. 2
  11661. Prints out the code for the MOO program associated with the named verb on the named object.  
  11662. 2
  11663.  
  11664. 2
  11665. Normally, the code is shown with each line numbered and with only those parentheses that are necessary to show the meaning of the program.  You can e.g., specify `without numbers' to have the numbers omitted or `with parentheses' to include all parentheses or even `with parentheses without numbers' to do both.
  11666. 2
  11667.  
  11668. 2
  11669. The 3rd form of the verb lists the verb matching the given dobj/prep/iobj specification if such exists.  
  11670. 2
  11671.  
  11672. 2
  11673. Example:
  11674. 2
  11675.   Type `@list $room:@move' to see the code for the `@move' command, or even `@list $prog:@list' to see the code implementing @list itself...
  11676. 2
  11677.  
  11678. 2
  11679. The 2nd and 3rd forms can be combined, e.g.,
  11680. 2
  11681.  
  11682. 2
  11683.   @list frobule:burfle this in front of any without numbers
  11684. 2
  11685.  
  11686. 2
  11687. which would be useful if `frobule' had more than one `burfle' verb and we wanted to see the one having `this' `in front of' `any' as its respective dobj/prep/iobj specifiers.
  11688. 38
  11689. 1
  11690. 4
  11691. 24
  11692. 2
  11693. Syntax:  @kill task_id
  11694. 2
  11695.          @kill [object]:[verb]
  11696. 2
  11697.          @kill soon [number-of-seconds]
  11698. 2
  11699.          @kill all
  11700. 2
  11701.          @kill %trailing_id
  11702. 2
  11703.  
  11704. 2
  11705.  
  11706. 2
  11707. Immediately kills one or more forked tasks.  The '@forked' command is useful for finding out what tasks you have pending; see 'help @forked' for details.  Only the owner of a task may kill it.
  11708. 2
  11709.  
  11710. 2
  11711. @kill task_id kills only the task with that id.
  11712. 2
  11713.  
  11714. 2
  11715. @kill object:verb kills all tasks which were scheduled by the object running the verb named.  Both object and verb are optional:  @kill object: kills all tasks scheduled by that object, and @kill :verb kills all tasks which were scheduled by any object running that verb.  This can be useful if you have several similar objects which are running tasks from similarly named verbs.  (Perversely, @kill : kills all tasks...  Any object running any task.)
  11716. 2
  11717.  
  11718. 2
  11719. @kill soon kills all tasks scheduled within the next minute.  @kill soon number kills all tasks scheduled within that number of seconds, e.g. @kill soon 300 would kill all tasks scheduled within the next five minutes.  This can be useful if you have a runaway task you want to quickly remove, but don't want to kill you later tasks.
  11720. 2
  11721.  
  11722. 2
  11723. @kill all kills all tasks.  Like @kill soon, but more dramatic.
  11724. 2
  11725.  
  11726. 2
  11727. @kill %trailing_id expects you to specify the last few digits of a task id.  It then kills all tasks that end with those digits.
  11728. 2
  11729.  
  11730. 2
  11731. Example:
  11732. 2
  11733.   @forked
  11734. 2
  11735.   1359083655  Sep 16 21:45:00 1991  yduJ          #5803:heartbeat (10) [#68]
  11736. 2
  11737.   @kill %655
  11738. 2
  11739.   Killed:   task 1359083655, verb #5803:heartbeat, line 10, this==#68
  11740. 38
  11741. 1
  11742. 4
  11743. 8
  11744. 2
  11745. Syntax:  @kids object
  11746. 2
  11747.  
  11748. 2
  11749. A quick way to find out the children of an object.  Prints out the names and object numbers of the found children.  Note: this is not a list of all descendents, just direct children.
  11750. 2
  11751.  
  11752. 2
  11753. Example:
  11754. 2
  11755.   @kids #3107
  11756. 2
  11757.   Generic Body of Chlorinated Water(#3107) has 3 kids.
  11758. 2
  11759.   The Pool(#1428)   The Hot Tub(#388)   Deep Blue Underground Pool(#17340)
  11760. 2
  11761. 5
  11762. 4
  11763. 22
  11764. 2
  11765. Syntax:  @forked
  11766. 2
  11767.  
  11768. 2
  11769. Gives a list of all of the forked tasks you own, along with detailed information about each one.  The information includes the following:
  11770. 2
  11771.  
  11772. 2
  11773. Queue ID:
  11774. 2
  11775.    A numeric identifier for the task, for use in killing it (see 'help @kill').
  11776. 2
  11777.  
  11778. 2
  11779. Start Time:
  11780. 2
  11781.    The time after which the task will begin execution.
  11782. 2
  11783.  
  11784. 2
  11785. Owner:
  11786. 2
  11787.    The player whose permissions under which the task is running.
  11788. 2
  11789.    Unless you are a wizard, @forked will show only your tasks.
  11790. 2
  11791.  
  11792. 2
  11793. Verb:
  11794. 2
  11795.    The object and verb-name of the code that forked the task.
  11796. 2
  11797.  
  11798. 2
  11799. Line:
  11800. 2
  11801.    The line number of the first statement that the task will execute when it starts.  Note that the code for the verb in question may have changed since the task was forked; the forked task will use the version that was being executed when it was forked.
  11802. 2
  11803.  
  11804. 2
  11805. This:
  11806. 2
  11807.    The value of `this' for the forked task, in the case that it is different from (i.e., is a descendant of) the object on which the verb code lives.
  11808. 38
  11809. 1
  11810. 4
  11811. 3
  11812. 2
  11813. Syntax:  @edit <object>:<verb-name> [<dobj> [<prep> [<iobj>]]]
  11814. 2
  11815.  
  11816. 2
  11817. Enters the MOO Verb Editor for the named verb on the named object.  See 'help editors' for more detail.
  11818. 2
  11819. 5
  11820. 4
  11821. 42
  11822. 2
  11823. Syntax: @display <object>.[property]
  11824. 2
  11825.                          ,[inherited_property]
  11826. 2
  11827.                          :[verb]
  11828. 2
  11829.                          ;[inherited_verb]
  11830. 2
  11831.  
  11832. 2
  11833. @display is a fancy version of @show.  As @show, it can select individual verbs or properties to display.  In addition, it can display all the verbs or properties defined on an object, or all the verbs or properties defined on any of the object's ancestors.  Don't specify a property or verbname after the punctuation mark to get the "all" feature.  Its display is more compact than that of @show (it uses a one-line format, and truncates values that don't fit in the value field).
  11834. 2
  11835.  
  11836. 2
  11837. You may mix properties and verbs on the command line, but the parser may become confused.  (E.g. @display object,: displays all properties including inherited ones plus all locally defined verbs on the object.)
  11838. 2
  11839.  
  11840. 2
  11841. Examples:
  11842. 2
  11843. Individual property:
  11844. 2
  11845.   @display poolsweep.count
  11846. 2
  11847.   .count                   yduJ (#68)            r c    8
  11848. 2
  11849.  
  11850. 2
  11851. Individual verb:
  11852. 2
  11853.   @display poolsweep:tell
  11854. 2
  11855.   #3560:tell                     yduJ (#68)           rxd    this none this
  11856. 2
  11857.  
  11858. 2
  11859. All properties, including one truncated value:
  11860. 2
  11861.   @display poolsweep.
  11862. 2
  11863.   poolsweep (#3560) [ readable ]
  11864. 2
  11865.     Owned by yduJ (#68).
  11866. 2
  11867.     Child of generic thing (#5).
  11868. 2
  11869.     Location The Pool (#1428).
  11870. 2
  11871.   .gagged                  yduJ (#68)            r c    0
  11872. 2
  11873.   .count                   yduJ (#68)            r c    8
  11874. 2
  11875.   .messages                yduJ (#68)            r c    {"The poolsweep stir..
  11876. 2
  11877.   .index                   yduJ (#68)            r c    2
  11878. 2
  11879.   .quantum                 yduJ (#68)            r c    20
  11880. 2
  11881.  
  11882. 2
  11883. Inherited verbs, edited for brevity, showing verbs from various parents, with owners, permissions, and argument lists.
  11884. 2
  11885.   @d poolsweep;
  11886. 2
  11887.   poolsweep (#3560) [ readable ]
  11888. 2
  11889.    #3560:tell                     yduJ (#68)           rxd    this none this
  11890. 2
  11891.    #3560:description              yduJ (#68)           rxd    this none this
  11892. 2
  11893.       #5:"g*et t*ake"             Haakon (#2)          rxd    this none none
  11894. 2
  11895.       #5:"d*rop th*row"           Haakon (#2)          rxd    this none none
  11896. 2
  11897.       #5:moveto                   Haakon (#2)          rxd    this none this
  11898. 2
  11899.       #1:description              Haakon (#2)          rxd    this none this
  11900. 2
  11901.       #1:look_self                Haakon (#2)          rxd    this none this
  11902. 2
  11903.  
  11904. 2
  11905. Some aspects of @display can be customized (see `help @display-options').
  11906. 2
  11907. 5
  11908. 4
  11909. 3
  11910. 2
  11911. Syntax:  @dbsize
  11912. 2
  11913.  
  11914. 2
  11915. @dbsize goes through the entire database, counting the valid and invalid objects, giving a summary at the end.  This information can be useful, but because this command is cpu intensive, it should be used sparingly.
  11916. 2
  11917. 5
  11918. 4
  11919. 11
  11920. 2
  11921. Syntax:  @copy <object>:<verb> to [<newobject>][:<newverb>]
  11922. 2
  11923.  
  11924. 2
  11925. Copies the code of the named verb to the new object and verbname.  Permissions, and arguments of the new verb are set to match those of the old verb in the event that the new verb does not already exist.  One of <newobject> or :<newverb> must be supplied.  If no new verbname is given, the old name is retained.  Likewise, <newobject> defaults to <object> if not given.
  11926. 2
  11927.  
  11928. 2
  11929. Examples:
  11930. 2
  11931.   @copy me:verbname to myobject
  11932. 2
  11933.   @copy me:test_verb to myobject:real_verb
  11934. 2
  11935.  
  11936. 2
  11937. In general, @copy'ing verbs is a bad idea.  In the vast majority of cases, the desired effect can be accomplished with parenting (i.e., having <object> be an ancestor of <newobject>), which has the advantage that if a verb is updated or fixed, this immediately becomes available to child objects that inherit this verb.  In such a case, copies that were made using @copy have to be tracked down and fixed by hand.
  11938. 2
  11939.  
  11940. 2
  11941. This facility is provided for those rare occasions where one has no choice but to actually copy the verb.
  11942. 2
  11943. 5
  11944. 4
  11945. 7
  11946. 2
  11947. Syntax:  @chparent <object> to <new parent>
  11948. 2
  11949.  
  11950. 2
  11951. Changes the parent of the named object to be the named parent.  The object acquires all the verb and property definitions of its parent.  Newly acquired properties are initilialized with `clear' values so that they inherit whatever values are currently assigned to the parent's corresponding properties (see `help @clearproperty').
  11952. 2
  11953.  
  11954. 2
  11955. If the player does not own <new parent>, it must have been set `fertile'.  <object> must be owned by the player.  Neither <object> nor any descendant can define any property which already exist on <new parent>.  Use @check-chparent (see `help @check-chparent') to list such property conflicts.
  11956. 2
  11957.  
  11958. 2
  11959. It is also sometimes the case that you will own some object and want to @chparent some child of that object that you do not own.  Use @disinherit (see `help @disinherit') in such situations.
  11960. 2
  11961. 5
  11962. 4
  11963. 25
  11964. 2
  11965. Syntax:  @chmod <object> <object-permissions>
  11966. 2
  11967.          @chmod <object>.<prop-name> <property-permissions>
  11968. 2
  11969.          @chmod <object>:<verb-name> <verb-permissions>
  11970. 2
  11971.  
  11972. 2
  11973. Changes the permissions of an object, property or verb, to those given.  The following table shows what permission bits are allowed for each form of the command:
  11974. 2
  11975.         <object-permissions>        r, w, f
  11976. 2
  11977.         <property-permissions>      r, w, c
  11978. 2
  11979.         <verb-permissions>          r, w, x, d
  11980. 2
  11981.  
  11982. 2
  11983. See the LambdaMOO Programmer's Manual for their meanings.
  11984. 2
  11985.  
  11986. 2
  11987. To clear all of the permissions for an object, verb, or property, use "" as the second argument.
  11988. 2
  11989.  
  11990. 2
  11991. @chmod also accepts +, !, and - as modifiers for a single permission to add or subtract that permission from the current set.  (! and - are the same.)
  11992. 2
  11993.  
  11994. 2
  11995. Examples:
  11996. 2
  11997.  
  11998. 2
  11999. Set a verb to be Readable and Callable:
  12000. 2
  12001.   @chmod chair:sit rx
  12002. 2
  12003.  
  12004. 2
  12005. Set a verb to be not Callable, without changing its other permissions:
  12006. 2
  12007.   @chmod cookies:eat !x
  12008. 2
  12009.  
  12010. 2
  12011. Set an object to be Writeable in addition to any current bits:
  12012. 2
  12013.   @chmod table +w
  12014. 2
  12015. 5
  12016. 4
  12017. 5
  12018. 2
  12019. Syntax:  @args <object>:<verb-name> <dobj>
  12020. 2
  12021.          @args <object>:<verb-name> <dobj> <prep>
  12022. 2
  12023.          @args <object>:<verb-name> <dobj> <prep> <iobj>
  12024. 2
  12025.  
  12026. 2
  12027. Changes the direct object, preposition, and/or indirect object specifiers for the named verb on the named object.  Any specifiers not provided on the command line are not changed.  The direct and indirect object specifiers (<dobj> and <iobj>) must be either 'none', 'this', or 'any'.  The preposition specifier (<prep>) must be either 'none', 'any', or one of the prepositional phrases listed in `help prepositions'.
  12028. 38
  12029. 1
  12030. 4
  12031. 13
  12032. 2
  12033. Syntax:  .program <object>:<verb-name>
  12034. 2
  12035.               :
  12036. 2
  12037.               :
  12038. 2
  12039.               <lines of MOO code>
  12040. 2
  12041.               :
  12042. 2
  12043.               :
  12044. 2
  12045.          .
  12046. 2
  12047.  
  12048. 2
  12049. Provides or changes the MOO program associated with the named verb on the named object.
  12050. 2
  12051.  
  12052. 2
  12053. This command is mostly obsolete.  Use @program instead.  The only reason this command still exists is that it is a server builtin command that will continue to work in the (unlikely) event that @program gets trashed ...
  12054. 2
  12055.  
  12056. 2
  12057. This command works differently from most other MOO commands, in that it actually changes how the server will interpret later lines that you type to it.  After typing the '.program' line, you are in 'programming mode'.  All lines that you type in this mode are simply saved away in the server until you type a line containing only a single period ('.').  At that point, those lines are interpreted as a MOO program and are checked for syntax errors.  If none are found, a message to that effect is printed and the code you typed is installed as the program for the verb in question.  In any case, after typing the '.' line, you are returned to the normal input-handling mode.
  12058. 38
  12059. 1
  12060. 4
  12061. 32
  12062. 2
  12063. Syntax:   @clearproperty <object>.<prop-name>
  12064. 2
  12065.  
  12066. 2
  12067. This clears <object>'s <prop-name> property.  That is the property value becomes `clear' and all further references to this property will use the value of the same property on the parent object.  Note that you can only clear inherited properties.  Nor is this the same as removing a property; the property continues to exist.
  12068. 2
  12069.  
  12070. 2
  12071. `@clearproperty' can be abbreviated as `@clearp'.
  12072. 2
  12073.  
  12074. 2
  12075. Example:
  12076. 2
  12077.  
  12078. 2
  12079.   @create #1 named foo
  12080. 2
  12081.   You now have foo with object number #42 and parent Root Class (#1).
  12082. 2
  12083.     [foo, as a child of #1 has a .description property which starts out clear]
  12084. 2
  12085.   ;#1.description
  12086. 2
  12087.   => ""
  12088. 2
  12089.   ;#1.description = "You see nothing special"
  12090. 2
  12091.   => "You see nothing special"
  12092. 2
  12093.   ;#42.description  
  12094. 2
  12095.   => "You see nothing special"
  12096. 2
  12097.   ;#42.description = "Something special"
  12098. 2
  12099.   => "Something special"
  12100. 2
  12101.    [foo.description is now no longer clear; it has a value of its own]
  12102. 2
  12103.   ;#1.description = "Boring"
  12104. 2
  12105.   => "Boring"
  12106. 2
  12107.   ;#42.description  
  12108. 2
  12109.   => "Something special"
  12110. 2
  12111.    
  12112. 2
  12113.   @clearp foo.description
  12114. 2
  12115.   Property #42.description cleared; value is now "Boring".
  12116. 2
  12117.    [foo.description is now clear again]
  12118. 2
  12119.   ;#1.description = ""
  12120. 2
  12121.   => ""
  12122. 2
  12123.   ;#42.description
  12124. 2
  12125.   => ""
  12126. 2
  12127. 5
  12128. 4
  12129. 2
  12130. 2
  12131. *forward*
  12132. 2
  12133. @disinherit
  12134. 2
  12135. 5
  12136. 4
  12137. 11
  12138. 2
  12139. Syntax:   @disinherit <object> 
  12140. 2
  12141.           @disinherit <object> [from <parent>]
  12142. 2
  12143.  
  12144. 2
  12145. Synonym:  @disown
  12146. 2
  12147.  
  12148. 2
  12149. This command is used to remove an unwanted child from an object you own.  If you owned said child, you could use @chparent; this command is to cover the other case, namely where you don't own the child.  
  12150. 2
  12151.  
  12152. 2
  12153. Both forms of this command chparent <object> to its grandparent, provided you own the parent.  The second form matches the string you supply for <object> against the list of children of the given <parent>.
  12154. 2
  12155.  
  12156. 2
  12157. Turning off the fertile bit (.f) for a particular object prevents others from creating children of it or chparenting to it (see `help @chmod').
  12158. 2
  12159. Note also that, though the name might seem to indicate otherwise, this command does not change the ownership of any object.
  12160. 2
  12161. 5
  12162. 4
  12163. 2
  12164. 2
  12165. *forward*
  12166. 2
  12167. @display-options
  12168. 2
  12169. 5
  12170. 4
  12171. 24
  12172. 2
  12173. Syntax:  @display-option
  12174. 2
  12175.          @display-option <option>
  12176. 2
  12177.  
  12178. 2
  12179. Synonym:  @displayoption
  12180. 2
  12181.  
  12182. 2
  12183. The display options customize the behavior of the @display command to your particular taste.  The first form of this command displays all of your display options.  The second form displays just that one option, one of the flags listed below.
  12184. 2
  12185.  
  12186. 2
  12187. The remaining forms of this command are for setting your display options:
  12188. 2
  12189.  
  12190. 2
  12191.          @display-option +<flag>
  12192. 2
  12193.          @display-option -<flag>
  12194. 2
  12195.          @display-option !<flag>           (equivalent to -<flag>)
  12196. 2
  12197.  
  12198. 2
  12199. These respectively set and reset the specified flag
  12200. 2
  12201.  
  12202. 2
  12203. -blank_tnt     Show the verb args on all verbs.
  12204. 2
  12205. +blank_tnt     Don't show the verb args on `this none this' verbs.
  12206. 2
  12207. -shortprep     Use full prepositions  (e.g., "on top of/on/onto/upon")
  12208. 2
  12209. +shortprep     Use short prepositions (e.g., "on")
  12210. 2
  12211. -thisonly      Specifying . (:) to retrieve all properties (verbs) will go
  12212. 2
  12213.                up the ancestor chain until it finds a readable object with
  12214. 2
  12215.                properties (verbs) defined on it.
  12216. 2
  12217. +thisonly      Specifying . (:) to retrieve all properties (verbs) will only
  12218. 2
  12219.                display properties (verbs) defined on the object itself.
  12220. 2
  12221. 5
  12222. 4
  12223. 24
  12224. 2
  12225. *pass*
  12226. 2
  12227. @add-feature
  12228. 2
  12229.  
  12230. 2
  12231. Note to programmers: @add-feature and @remove-feature are front-ends for player:add_feature and :remove_feature.
  12232. 2
  12233.  
  12234. 2
  12235. :add_feature returns
  12236. 2
  12237.  
  12238. 2
  12239.  * E_PERM unless caller == this || $perm_utils:controls(caller_perms())
  12240. 2
  12241.  
  12242. 2
  12243.  * E_INVARG if feature is not an object or is invalid
  12244. 2
  12245.  
  12246. 2
  12247.  * E_PERM if the object is not feature_ok
  12248. 2
  12249.  
  12250. 2
  12251.  * a true value otherwise
  12252. 2
  12253.  
  12254. 2
  12255. and calls feature:feature_add, if the verb exists.
  12256. 2
  12257.  
  12258. 2
  12259. :remove_feature returns
  12260. 2
  12261.  
  12262. 2
  12263.  * E_PERM unless caller == this || $perm_utils:controls(caller_perms()) || caller_perms() == feature.owner
  12264. 2
  12265.  
  12266. 2
  12267.  * a true value otherwise
  12268. 2
  12269.  
  12270. 2
  12271. and calls feature:feature_remove, if the verb exists.
  12272. 2
  12273. 5
  12274. 4
  12275. 2
  12276. 2
  12277. *forward*
  12278. 2
  12279. @add-feature
  12280. 2
  12281. 5
  12282. 4
  12283. 6
  12284. 2
  12285. *pass*
  12286. 2
  12287. features
  12288. 2
  12289.  
  12290. 2
  12291. Note to programmers: In order to be available for general use as a feature, an object must have a verb or property named "feature_ok" which returns a true value.
  12292. 2
  12293.  
  12294. 2
  12295. When a feature is added to a player's features list, feature:feature_add is called, if it exists, with the player in question as its argument.  Likewise, when a feature is removed, feature:feature_remove is called.
  12296. 2
  12297. 5
  12298. 4
  12299. 4
  12300. 2
  12301. *pass*
  12302. 2
  12303. examine
  12304. 2
  12305.  
  12306. 2
  12307. [Note to programmers: the 'obvious' verbs are those that can be invoked as commands and are not specified by the :hidden_verbs verb.  The default definition of "hidden" is "not readable".  You can override this definition with a :hidden_verbs verb that gets the default list with pass(@args) and then alters that list.]
  12308. 2
  12309. 5
  12310. 4
  12311. 5
  12312. 2
  12313. *pass*
  12314. 2
  12315. mail
  12316. 2
  12317.  - - - - -
  12318. 2
  12319. See `help mail-system' for a description of the programming interface to the mail system.
  12320. 2
  12321. In particular, see `help $mail_recipient' for information on creating new mail collections.
  12322. 2
  12323. 5
  12324. 4
  12325. 7
  12326. 2
  12327. #<string>[.<property>|.parent] [exit|player|inventory] [for <code>] returns information about the object (we'll call it <thing>) named by string.  String is matched in the current room unless one of exit|player|inventory is given.
  12328. 2
  12329. If neither .<property>|.parent nor <code> is specified, just return <thing>.
  12330. 2
  12331. If .<property> is named, return <thing>.<property>.  .parent returns parent(<thing>).
  12332. 2
  12333. If <code> is given, it is evaluated, with the value returned by the first part being substituted for %# in <code>.
  12334. 2
  12335. For example, the command
  12336. 2
  12337.   #JoeFeedback.parent player for tonum(%#)
  12338. 2
  12339. will return 26026 (unless Joe has chparented since writing this).
  12340. 2
  12341. 5
  12342. 5
  12343. 2
  12344. 5
  12345. 5
  12346. 2
  12347. 4
  12348. 4
  12349. 1
  12350. 2
  12351. Programmer Help
  12352. 2
  12353. 5
  12354. 2
  12355. This provides help on the programmer commands available on $prog and related topics.
  12356. 2
  12357. 5
  12358. 4
  12359. 2
  12360. 0
  12361. 69496
  12362. 0
  12363. 743625440
  12364. 2
  12365. 1
  12366. #25
  12367. Wizard Help
  12368.  
  12369. 16
  12370. 38
  12371. -1
  12372. -1
  12373. -1
  12374. 32
  12375. -1
  12376. 24
  12377. 0
  12378. 34
  12379. @guests
  12380. @log
  12381. @egrep
  12382. @unnewt
  12383. @denewt
  12384. @newt
  12385. @grep
  12386. $site_db
  12387. graylist
  12388. blacklist
  12389. @recycle
  12390. wiz-index
  12391. @dump-database
  12392. @players
  12393. @net-who
  12394. @@who
  12395. make-core-database
  12396. @quota
  12397. @detoad
  12398. @untoad
  12399. @toad
  12400. @grepcore
  12401. @who-calls
  12402. @abort-shutdown
  12403. @shutdown
  12404. @programmer
  12405. @shout
  12406. @chown
  12407. @grant
  12408. redlist
  12409. @blacklist
  12410. @graylist
  12411. @redlist
  12412. @make-guest
  12413. 39
  12414. 4
  12415. 7
  12416. 2
  12417. Syntax:  @guests [<n>]
  12418. 2
  12419.  
  12420. 2
  12421. Prints out the log of guest player connections, indicating connect/disconnect times and where they came from.  If a numeric argument n is given, then only the last n entries in the log are consulted (useful for when the full log is rather long) --- note that connections and disconnections are separate entries so the actual printed listing will be about half this length.
  12422. 2
  12423.  
  12424. 2
  12425. Alternate:  @guests now
  12426. 2
  12427.  
  12428. 2
  12429. Prints out in @who format all connected guests.  In place of the location field is the current connect site.
  12430. 38
  12431. 5
  12432. 4
  12433. 11
  12434. 2
  12435. Syntax:  @log <message>
  12436. 2
  12437.          @log
  12438. 2
  12439.  
  12440. 2
  12441. The first form enters <message> as a one-line comment in the server log.
  12442. 2
  12443. The second form prompts for a sequence of lines to be collectively entered as an extended comment.  This uses $command_utils:read_lines so all of those conventions apply, i.e., a period on a line by itself ends the text, `@abort' aborts the command, etc...).  Example:  If Wizard (#2) types
  12444. 2
  12445.  
  12446. 2
  12447.     @log I did $dump_interval=3600
  12448. 2
  12449.  
  12450. 2
  12451. the following line appears in the server log
  12452. 2
  12453.  
  12454. 2
  12455.     Aug 19 22:36:52:  COMMENT:  from Wizard (#2):  I did $dump_interval=3600
  12456. 38
  12457. 5
  12458. 4
  12459. 2
  12460. 2
  12461. *forward*
  12462. 2
  12463. @grep
  12464. 38
  12465. 5
  12466. 4
  12467. 2
  12468. 2
  12469. *forward*
  12470. 2
  12471. @denewt
  12472. 38
  12473. 5
  12474. 4
  12475. 10
  12476. 2
  12477. Syntax:    @denewt <player> [commentary]
  12478. 2
  12479.  
  12480. 2
  12481. Synonyms:  @unnewt
  12482. 2
  12483.            @get-better
  12484. 2
  12485.  
  12486. 2
  12487. @denewt reverses the effects of @newt, moving a player's :denewt_confunc back to :confunc, but checking first that :confunc is the same as $wiz_utils:newt_confunc (if not, we save :confunc as :newt_confunc and complain).
  12488. 2
  12489.  
  12490. 2
  12491. Mail is sent to $newt_log including any commentary you provide.  E.g.,
  12492. 2
  12493.  
  12494. 2
  12495.   @denewt Twit  He promises not to do it again.
  12496. 38
  12497. 5
  12498. 4
  12499. 25
  12500. 2
  12501. *subst*
  12502. 2
  12503. Syntax:  @newt <player> [commentary]
  12504. 2
  12505.  
  12506. 2
  12507. The @newt command temporarily prevents logins on a given player.
  12508. 2
  12509. It works by installing a confunc ($wiz_utils:newt_confunc) on player that does an immediate ;boot_player(), saving any existing :confunc the user may have as :denewt_confunc.  Use @denewt to reverse this.
  12510. 2
  12511.  
  12512. 2
  12513. You must give either the player's full name or its object number.
  12514. 2
  12515. Also, this command does not let you @newt yourself.
  12516. 2
  12517.  
  12518. 2
  12519. Mail will be sent to $newt_log, listing the player's .all_connect_places and including any commentary you provide.  E.g.,
  12520. 2
  12521.  
  12522. 2
  12523.   @newt Twit  did real annoying things.
  12524. 2
  12525.  
  12526. 2
  12527. As with @toad and @programmer, there are messages that one may set
  12528. 2
  12529.  
  12530. 2
  12531. @newt  [%[$wiz.newt_msg]]
  12532. 2
  12533.   Printed to everyone in the room in which the victim is being @newted.
  12534. 2
  12535.   If you're worried about accidentally newting yourself in the process of
  12536. 2
  12537.   setting this message, you can't (see above).
  12538. 2
  12539.  
  12540. 2
  12541. @newt_victim  [%[$wiz.newt_victim_msg]]
  12542. 2
  12543.   Printed to the victim.  
  12544. 2
  12545.   This is followed by $login:newt_registration_string().
  12546. 2
  12547.  
  12548. 2
  12549. See `help @toad' if you need something more drastic.
  12550. 38
  12551. 5
  12552. 4
  12553. 13
  12554. 2
  12555. *pass*
  12556. 2
  12557. @grep
  12558. 2
  12559.  
  12560. 2
  12561. For wizards, the following forms are also available for doing full-db searches
  12562. 2
  12563.  
  12564. 2
  12565.          @grep <pattern>
  12566. 2
  12567.          @grep <pattern>
  12568. 2
  12569.          @egrep <pattern> from [#]<n>
  12570. 2
  12571.          @egrep <pattern> from [#]<n>
  12572. 2
  12573.  
  12574. 2
  12575. the first two search all objects in the database while the last two search the range [#<n>..max_object()]
  12576. 2
  12577.  
  12578. 2
  12579. See also:  @grepcore, @who-calls.
  12580. 38
  12581. 5
  12582. 4
  12583. 21
  12584. 2
  12585. Database of places
  12586. 2
  12587. ------------------
  12588. 2
  12589. i.e., places people have connected from.
  12590. 2
  12591.  
  12592. 2
  12593.   :add(sitename,player)
  12594. 2
  12595.       records the fact that player connected from sitename.
  12596. 2
  12597.   :load()
  12598. 2
  12599.       clears the db and reloads all of the player connection info.
  12600. 2
  12601.  
  12602. 2
  12603.   .domain
  12604. 2
  12605.       default domain for unqualified sitenames given to :add.
  12606. 2
  12607.       
  12608. 2
  12609. For each domain we keep a list of players and subdomains. 
  12610. 2
  12611. For example, :add("doc.ic.ac.uk",#666) enters #666 on the lists for "doc.ic.ac.uk", and, if we have to create an entry for "doc.ic.ac.uk", we enter "doc" on the list for "ic.ac.uk", "ic" on the list for "ac.uk", etc....  In this case, :find("ic") will return the "ic.ac.uk" list if there is no other domain in $site_db starting with "ic".  Note that the "ic.ac.uk" list may contain both objects, i.e., namely players that have connected from the site "ic.ac.uk", and strings, i.e., subdomains of "ic.ac.uk" like "doc".
  12612. 2
  12613.  
  12614. 2
  12615.   :find_exact(string)    => player/subdomain list or $failed_match
  12616. 2
  12617.   :find_all_keys(string) => list of all domains that begin with string
  12618. 2
  12619.   :find_key     (string) => unique domain that begins with string, 
  12620. 2
  12621.                             $ambiguous_match or $failed_match
  12622. 2
  12623.  
  12624. 2
  12625. The other $generic_db functions (:find, :find_all) are also available, though admittedly less useful.
  12626. 38
  12627. 5
  12628. 4
  12629. 2
  12630. 2
  12631. *forward*
  12632. 2
  12633. blacklist
  12634. 38
  12635. 5
  12636. 4
  12637. 26
  12638. 2
  12639.  
  12640. 2
  12641. The Site Blacklist
  12642. 2
  12643. ------------------
  12644. 2
  12645. $login maintains three lists of hosts/domains to support player registration schemes and blocking of connections from highly untrusted hosts:
  12646. 2
  12647.  
  12648. 2
  12649.   .redlist   -- all connections from these sites are disabled 
  12650. 2
  12651.   .blacklist -- player creation and guest logins are disabled
  12652. 2
  12653.   .graylist  -- advisory list of potential trouble spots (putting a site on the
  12654. 2
  12655.                 .graylist merely annotates it in @net-who listings).
  12656. 2
  12657.  
  12658. 2
  12659. The lists are kept in a special format so it is highly recommended that you 
  12660. 2
  12661. either use $wiz:@*list/@un*list or the following verbs to query/update the 
  12662. 2
  12663. respective lists rather than bash them directly:
  12664. 2
  12665.  
  12666. 2
  12667.   $login:*listed     (host)              is host is on .*list?
  12668. 2
  12669.   $login:*list_add   (domain or subnet)  add domain or subnet to .*list
  12670. 2
  12671.   $login:*list_remove(domain or subnet)  remove domain or subnet from .*list
  12672. 2
  12673.  
  12674. 2
  12675. where `*' is one of `black', `red', or `gray'.
  12676. 2
  12677.  
  12678. 2
  12679. One may either specify a domain name (e.g., "baz.edu") or a numeric IP address (e.g., "36.0.23.17").  Domain names match all hosts underneath that domain, so, e.g., puting "baz.edu" on a list effectively adds "x.bax.edu" for all x as well.  
  12680. 2
  12681. Likewise, an incomplete numeric address, e.g., "128.42" will match that entire subnet, in this case all hosts whose IP numbers have the form "128.42.m.n" for arbitrary integers m and n.
  12682. 2
  12683.  
  12684. 2
  12685. One may also give a domain name containing a wildcard ("*"), e.g., "fritz*.baz.edu", in which case all hostnames matching in the sense of $string_utils:match_string() are considred to be on the list.  Wildcard matching should be avoided since it is more time-consuming.
  12686. 2
  12687.  
  12688. 2
  12689. It should be noted that, since there is no direct access to the domain name service from within the MOO, it is possible for a host to be blacklisted or redlisted via its domain name, and yet have someone be able to connect from that host (and, in the case of a blacklisted host, create a character) --- this can happen if the name service is down and connection_name() on that player thus has given the numeric IP address rather than the domain name.  Similarly, if you list a host by IP number alone, it will still be possible to get in via the site's domain name.  Thus to be completely assured of shutting out a site, you need to list it both by domain name and IP number.
  12690. 38
  12691. 5
  12692. 4
  12693. 6
  12694. 2
  12695. *pass*
  12696. 2
  12697. @recycle
  12698. 2
  12699.  
  12700. 2
  12701. Of course, wizards are allowed to @recycle anything at all.
  12702. 2
  12703.  
  12704. 2
  12705. There is, however, a block (in $player:recycle) against recycling actual players, i.e., descendants of $player that have the player flag set.  This is mainly to prevent stupid mistakes.  If, for some reason, you want to recycle a player, you need to @toad it first.
  12706. 38
  12707. 5
  12708. 4
  12709. 2
  12710. 2
  12711. *index*
  12712. 2
  12713. Wizard Help Topics
  12714. 38
  12715. 5
  12716. 4
  12717. 3
  12718. 2
  12719. Syntax:  @dump-database
  12720. 2
  12721.  
  12722. 2
  12723. Invokes the builtin dump_database(), which requests that the server checkpoint the database at its next opportunity.  It is not normally necessary to call this function; the server automatically checkpoints the database at regular intervals; see the chapter on server assumptions about the database for details.
  12724. 38
  12725. 5
  12726. 4
  12727. 3
  12728. 2
  12729. Syntax:  @players [with objects]
  12730. 2
  12731.  
  12732. 2
  12733. Hmmm... what *does* this do, anyway?
  12734. 38
  12735. 5
  12736. 4
  12737. 9
  12738. 2
  12739. Syntax:  @net-who [<player>...]
  12740. 2
  12741.          @net-who from [<domain>]
  12742. 2
  12743.  
  12744. 2
  12745. Synonym: @@who
  12746. 2
  12747.  
  12748. 2
  12749. @net-who without any arguments prints all connected users and hosts.  If one or more <player> arguments are given, the specified users are printed along with their current or most recent connected hosts.  If any of these hosts are mentioned on $login.blacklist or $login.graylist (see `help blacklist'), 
  12750. 2
  12751. an annotation appears.
  12752. 2
  12753.  
  12754. 2
  12755. With a `from...' argument, this command consults $site_db and prints all players who have ever connected from the given domain.
  12756. 38
  12757. 5
  12758. 4
  12759. 2
  12760. 2
  12761. *forward*
  12762. 2
  12763. @net-who
  12764. 38
  12765. 5
  12766. 4
  12767. 3
  12768. 2
  12769. Syntax:  make-core-database
  12770. 2
  12771.  
  12772. 2
  12773. ...makes a core database (surprise).  Film at 11...
  12774. 38
  12775. 5
  12776. 4
  12777. 7
  12778. 2
  12779. *pass*
  12780. 2
  12781. @quota
  12782. 2
  12783.  
  12784. 2
  12785.  - - - - - - - - - - - - - - - - - - - - - - - - - -
  12786. 2
  12787. Syntax:  @quota <player> is <number> [<reason>]
  12788. 2
  12789.  
  12790. 2
  12791. This second and more interesting form of the verb changes a player's quota to the given number.  Mail will be sent to $quota_log; the message will include the <reason> if such is given.
  12792. 38
  12793. 5
  12794. 4
  12795. 2
  12796. 2
  12797. *forward*
  12798. 2
  12799. @untoad
  12800. 38
  12801. 5
  12802. 4
  12803. 13
  12804. 2
  12805. Syntax:  @untoad <object> [as <name>,<alias>,<alias>...]
  12806. 2
  12807.  
  12808. 2
  12809. Synonym: @detoad
  12810. 2
  12811.  
  12812. 2
  12813. Turns the object into a player.  
  12814. 2
  12815. If the name/alias... specification is given, the object is also renamed.
  12816. 2
  12817. In order for this to work, the object must be a nonplayer descendant of $player and the new object name (or the original name if none is given in the command line) must be available for use as a player name.  As with ordinary player @renaming, any aliases which are unavailable for use as player names are eliminated.
  12818. 2
  12819.  
  12820. 2
  12821. If the object is a descendant of $guest, then it becomes a new guest character.
  12822. 2
  12823. Otherwise the object is chowned to itself.  In the latter case, it is advisable to check that the .password property has something nontrivial in it.
  12824. 2
  12825.  
  12826. 2
  12827. If the object is a descendant of $prog, then its .programmer flag is set.
  12828. 2
  12829. Note that the .wizard flag is not set under any circumstances.
  12830. 38
  12831. 5
  12832. 4
  12833. 26
  12834. 2
  12835. *subst*
  12836. 2
  12837. Syntax:  @toad   <player>  [graylist|blacklist|redlist]
  12838. 2
  12839.          @toad!  <player>
  12840. 2
  12841.          @toad!! <player>
  12842. 2
  12843.  
  12844. 2
  12845. Resets the player flag of <player> (thus causing <player> to be booted), resets the .programmer and .wizard flags, chowns the player object to $hacker, and removes all of its names and aliases from $player_db.
  12846. 2
  12847.  
  12848. 2
  12849. You must give either the player's full name or its object number.
  12850. 2
  12851. Also, this command does not let you @toad yourself.
  12852. 2
  12853.  
  12854. 2
  12855. In some cases you may wish to add the player's last connected site to the site graylist, blacklist or redlist --- see `help blacklist' --- in order to invoke various kinds of blocking on that site (e.g., if player creation is enabled, you may want to enter the player on the blacklist to keep him from immediately creating a new character).  Specifying one of the listnames `graylist', `blacklist' or `redlist' will do this.
  12856. 2
  12857.  
  12858. 2
  12859. @toad!  <player>  is synonymous with  @toad <player> blacklist
  12860. 2
  12861. @toad!! <player>  is synonymous with  @toad <player> redlist
  12862. 2
  12863.  
  12864. 2
  12865. There are messages that one may set to customize toading.  After all, a toading is (supposed to be) a rare event and you will doubtless want to put on a good show.  Thus we have
  12866. 2
  12867.  
  12868. 2
  12869. @toad  [%[$wiz.toad_msg]]
  12870. 2
  12871.   Printed to everyone in the room in which the victim is being @toaded.
  12872. 2
  12873.   If you're worried about accidentally toading yourself in the process of
  12874. 2
  12875.   setting this message, see above.
  12876. 2
  12877.  
  12878. 2
  12879. @toad_victim  [%[$wiz.toad_victim_msg]]
  12880. 2
  12881.   Printed to the victim.
  12882. 2
  12883.  
  12884. 2
  12885. These are pronoun_subbed with victim == dobj.
  12886. 38
  12887. 5
  12888. 4
  12889. 6
  12890. 2
  12891. Syntax:  @grepcore <pattern>
  12892. 2
  12893.          @who-calls <verbname>
  12894. 2
  12895.  
  12896. 2
  12897. @grepcore pattern is @grep pattern in {all core objects}.  Core objects are computed for you by #0:core_objects().
  12898. 2
  12899.  
  12900. 2
  12901. @who-calls greps for the verbname + "(", hoping to catch it as a verb call.  Currently @who-calls does not allow you to restrict the search as @grep does.  (Volunteers?)
  12902. 38
  12903. 5
  12904. 4
  12905. 2
  12906. 2
  12907. *forward*
  12908. 2
  12909. @grepcore
  12910. 38
  12911. 5
  12912. 4
  12913. 3
  12914. 2
  12915. Syntax:  @abort-sh*utdown [<text>]
  12916. 2
  12917.  
  12918. 2
  12919. This aborts any shutdown currently in progress (i.e., set in motion by @shutdown).  All players are notified that no shutdown will actually occur; <text>, if given will be included in this notification.
  12920. 38
  12921. 5
  12922. 4
  12923. 5
  12924. 2
  12925. Syntax:  @shutdown [in <m>] [<text>]
  12926. 2
  12927.  
  12928. 2
  12929. This is the friendly way to do a server shutdown; it arranges for the actual shutdown to take place `m' minutes hence (default two).  Shutdown is preceded by a sequence of warnings to all connected players.  Warnings are likewise given to all players who connect during this time.  <text>, if given is included in these warning messages, perhaps as an explanation for why the server is being shut down.
  12930. 2
  12931.  
  12932. 2
  12933. Shutdown may be aborted at any time by using @abort-shutdown.
  12934. 38
  12935. 5
  12936. 4
  12937. 16
  12938. 2
  12939. *subst*
  12940. 2
  12941. Syntax:  @programmer <player>
  12942. 2
  12943.  
  12944. 2
  12945. Sets the programmer flag on the indicated player and sends mail to $new_prog_log.  
  12946. 2
  12947.  
  12948. 2
  12949. If the player is not already a descendant of $prog, we @chparent him/her to $prog.  In this case, if $prog has a larger .ownership_quota than its ancestors, then we raise the player's quota by the difference between $prog.ownership_quota and the .ownership_quota of the common ancestor of player and $prog, be this $player or some intermediate class.
  12950. 2
  12951.  
  12952. 2
  12953. There are messages that one may set to customize how the granting of a programmer bit looks to the victim and to any onlookers.  After all, this is a seminal event in a MOOer's life...  Thus we have
  12954. 2
  12955.  
  12956. 2
  12957. @programmer  [%[$wiz.programmer_msg]]
  12958. 2
  12959.   Printed to everyone in the room with the victim being @programmer'ed.
  12960. 2
  12961.  
  12962. 2
  12963. @programmer_victim  [%[$wiz.programmer_victim_msg]]
  12964. 2
  12965.   Printed to the victim.
  12966. 2
  12967.  
  12968. 2
  12969. These are pronoun subbed with victim == dobj.
  12970. 38
  12971. 5
  12972. 4
  12973. 3
  12974. 2
  12975. Syntax:  @shout <text>
  12976. 2
  12977.  
  12978. 2
  12979. Broadcasts the given text to all connected players.
  12980. 38
  12981. 5
  12982. 4
  12983. 13
  12984. 2
  12985. Syntax:  @chown <object>            [to] <owner>
  12986. 2
  12987.          @chown <object>.<propname> [to] <owner>
  12988. 2
  12989.          @chown <object>:<verbname> [to] <owner>
  12990. 2
  12991.  
  12992. 2
  12993. Changes the ownership of the indicated object, property or verb.
  12994. 2
  12995.  
  12996. 2
  12997. Verb ownership changes are fairly straightforward, being merely a matter of changing the verb_info() on a single verb.
  12998. 2
  12999.  
  13000. 2
  13001. Changing an object ownership includes changing the ownership on all +c properties on that object.  Note that @chown will not change the ownership of any other properties, nor will it change verb ownerships.  Use @grant if you need to do a more complete ownership change.  The quota of the former owner is increased by one, as is the quota of the new owner decreased by one.
  13002. 2
  13003.  
  13004. 2
  13005. Changing a property ownership is truly hairy.  If the property is +c one shouldnot be doing this, unless it is to correct a past injustice which caused the property to be owned by the wrong player.  In the case of -c properties, the property ownership is changed on all descendent objects (currently, if +c instances of a -c property are found in the traversal of all of the descendants, these are not changed, being deemed sufficiently weird that they should be handled on a case-by-case basis...).
  13006. 2
  13007.  
  13008. 2
  13009. If there's any justice, a future version of the server will prevent occurrences of (1) +c properties being owned by someone other than the object owner (2) -c properties with different owners on descendant objects (3) -c properties that are +c on some descendants.
  13010. 38
  13011. 5
  13012. 4
  13013. 3
  13014. 2
  13015. Syntax:  @grant <object> to <player>
  13016. 2
  13017.  
  13018. 2
  13019. Ownership of the object changes as in @chown, i.e., .owner and all c properties change hands while the previous owner's and the new owner's quotas are adjusted.  In addition all verbs and !c properties owned by the previous owner change ownership as well.  Finally, for !c properties, instances on descendant objects change ownership as when @chowning the properties individually.
  13020. 38
  13021. 5
  13022. 4
  13023. 2
  13024. 2
  13025. *forward*
  13026. 2
  13027. blacklist
  13028. 38
  13029. 5
  13030. 4
  13031. 14
  13032. 2
  13033. Syntax:  @redlist   [<domain or subnet> [commentary]]
  13034. 2
  13035.          @blacklist [<domain or subnet> [commentary]]
  13036. 2
  13037.          @graylist  [<domain or subnet> [commentary]]
  13038. 2
  13039.  
  13040. 2
  13041. Syntax:  @unredlist   [<domain or subnet> [commentary]]
  13042. 2
  13043.          @unblacklist [<domain or subnet> [commentary]]
  13044. 2
  13045.          @ungraylist  [<domain or subnet> [commentary]]
  13046. 2
  13047.  
  13048. 2
  13049. With no argument, the current contents of the <color>list are printed.
  13050. 2
  13051. Otherwise, the specified domain or subnet is added to or removed from the list and mail will be sent to $site_log.  
  13052. 2
  13053.  
  13054. 2
  13055. If the given domain or subnet has subdomains/subsubnets that are already on the list, you will be prompted as to whether you want to remove them.  Note that adding an entry for a particular domain or subnet effectively adds all subdomains/subsubnets, so unless there's some reason for keeping an explicit entry for a particular subdomain, chances are you will indeed want to remove them.  One reason to keep an explicit entry for a subdomain would be if you intended to unlist the full domain later but wanted to be sure you didn't unlist the subdomain in the process.
  13056. 2
  13057.  
  13058. 2
  13059. See `help blacklist' for a description of the functions of these <color>lists.
  13060. 38
  13061. 5
  13062. 4
  13063. 2
  13064. 2
  13065. *forward*
  13066. 2
  13067. @blacklist
  13068. 38
  13069. 5
  13070. 4
  13071. 2
  13072. 2
  13073. *forward*
  13074. 2
  13075. @blacklist
  13076. 38
  13077. 5
  13078. 4
  13079. 7
  13080. 2
  13081. Syntax:  @make-guest <adjective>
  13082. 2
  13083.  
  13084. 2
  13085. This creates a new guest character.  For example,
  13086. 2
  13087.   @make-guest Loud
  13088. 2
  13089. creates a child of $guest, owned by $hacker, named Loud_Guest and with aliases Loud and Loud_Guest.
  13090. 2
  13091.  
  13092. 2
  13093. See also `help @make-player'.
  13094. 38
  13095. 5
  13096. 5
  13097. 38
  13098. 5
  13099. 5
  13100. 38
  13101. 4
  13102. 4
  13103. 1
  13104. 2
  13105. Wizard Help
  13106. 38
  13107. 5
  13108. 4
  13109. 1
  13110. 2
  13111. This describes the various commands available on $wiz.
  13112. 38
  13113. 5
  13114. 4
  13115. 2
  13116. 0
  13117. 19990
  13118. 0
  13119. 743584563
  13120. 2
  13121. 1
  13122. #26
  13123. Wizard Utilities
  13124.  
  13125. 16
  13126. 2
  13127. -1
  13128. -1
  13129. -1
  13130. 1
  13131. -1
  13132. 15
  13133. 28
  13134. set_programmer
  13135. 2
  13136. 173
  13137. -1
  13138. set_player
  13139. 2
  13140. 173
  13141. -1
  13142. set_owner
  13143. 2
  13144. 173
  13145. -1
  13146. set_property_owner
  13147. 2
  13148. 165
  13149. -1
  13150. unset_player
  13151. 2
  13152. 173
  13153. -1
  13154. set_property_flags
  13155. 2
  13156. 165
  13157. -1
  13158. _set_property_flags
  13159. 2
  13160. 173
  13161. -1
  13162. random_password
  13163. 2
  13164. 173
  13165. -1
  13166. queued_tasks
  13167. 2
  13168. 165
  13169. -1
  13170. player_cmd_perms
  13171. 2
  13172. 173
  13173. -1
  13174. isnewt
  13175. 2
  13176. 165
  13177. -1
  13178. newt_confunc
  13179. 2
  13180. 169
  13181. -1
  13182. initialize_owned
  13183. 2
  13184. 173
  13185. -1
  13186. verify_owned_objects
  13187. 2
  13188. 173
  13189. -1
  13190. connected_wizards
  13191. 38
  13192. 165
  13193. -1
  13194. all_wizards
  13195. 38
  13196. 165
  13197. -1
  13198. rename_all_instances
  13199. 2
  13200. 165
  13201. -1
  13202. missed_help
  13203. 2
  13204. 173
  13205. -1
  13206. show_missing_help
  13207. 2
  13208. 173
  13209. -1
  13210. init_for_core
  13211. 2
  13212. 173
  13213. -1
  13214. show_netwho_listing
  13215. 2
  13216. 173
  13217. -1
  13218. show_netwho_from_listing
  13219. 2
  13220. 173
  13221. -1
  13222. check_player_request check_reregistration
  13223. 2
  13224. 173
  13225. -1
  13226. make_player
  13227. 2
  13228. 173
  13229. -1
  13230. send_new_player_mail
  13231. 2
  13232. 173
  13233. -1
  13234. do_make_player
  13235. 2
  13236. 93
  13237. -2
  13238. do_register
  13239. 2
  13240. 173
  13241. -1
  13242. do_new_password
  13243. 2
  13244. 93
  13245. -2
  13246. 4
  13247. default_programmer_quota
  13248. default_player_quota
  13249. missed_help_strings
  13250. missed_help_counters
  13251. 8
  13252. 0
  13253. 20
  13254. 2
  13255. 5
  13256. 0
  13257. 7
  13258. 2
  13259. 5
  13260. 4
  13261. 0
  13262. 2
  13263. 1
  13264. 4
  13265. 0
  13266. 2
  13267. 1
  13268. 5
  13269. 2
  13270. 4
  13271. 4
  13272. 1
  13273. 2
  13274. Wizard Utilities
  13275. 2
  13276. 5
  13277. 4
  13278. 36
  13279. 2
  13280. Wizard Utilities
  13281. 2
  13282. ----------------
  13283. 2
  13284. The following functions are substitutes for various server builtins.
  13285. 2
  13286. Anytime one feel tempted to use one of the expressions on the right,
  13287. 2
  13288. use the corresponding one on the left instead.  This will take care
  13289. 2
  13290. of various things that the server (for whatever reason) does not handle.
  13291. 2
  13292.  
  13293. 2
  13294. :set_programmer(object)             object.programmer = 1;
  13295. 2
  13296.     chparent object to $prog
  13297. 2
  13298.     send mail to $prog_log
  13299. 2
  13300.  
  13301. 2
  13302. :set_player(object[,nochown])       set_player_flag(object,1);
  13303. 2
  13304.     set player flag, 
  13305. 2
  13306.     add name/aliases to $player_db,
  13307. 2
  13308.     and maybe do a self chown.
  13309. 2
  13310.  
  13311. 2
  13312. :unset_player(object[,newowner])    set_player_flag(object,0);
  13313. 2
  13314.     unset player flag,
  13315. 2
  13316.     remove name/aliases from $player_db
  13317. 2
  13318.     chown to newowner if given
  13319. 2
  13320.  
  13321. 2
  13322. :set_owner(object, newowner)        object.owner = newowner;
  13323. 2
  13324.     change ownership on object
  13325. 2
  13326.     change ownership on all +c properties
  13327. 2
  13328.     juggle .ownership_quotas
  13329. 2
  13330.  
  13331. 2
  13332. :set_property_owner(object, property, newowner)
  13333. 2
  13334.     change owner on a given property
  13335. 2
  13336.     if this is a -c property, we change the owner on all descendants
  13337. 2
  13338.     for which this is also a -c property.
  13339. 2
  13340.     Polite protest if property is +c and newowner != object.owner.
  13341. 2
  13342.  
  13343. 2
  13344. :set_property_flags(object, property, flags)
  13345. 2
  13346.     change the permissions on a given property and propagate these to 
  13347. 2
  13348.     *all descendants*.  property ownership is changed on descendants 
  13349. 2
  13350.     where necessary.
  13351. 2
  13352. 5
  13353. 4
  13354. 2
  13355. 0
  13356. 35148
  13357. 0
  13358. 743584257
  13359. 2
  13360. 1
  13361. #27
  13362. Site DB
  13363.  
  13364. 0
  13365. 38
  13366. -1
  13367. -1
  13368. -1
  13369. 39
  13370. -1
  13371. 18
  13372. 6
  13373. find* _only _every*
  13374. 38
  13375. 173
  13376. -1
  13377. add
  13378. 38
  13379. 173
  13380. -1
  13381. load
  13382. 2
  13383. 173
  13384. -1
  13385. domain_literal
  13386. 38
  13387. 173
  13388. -1
  13389. init_for_core
  13390. 38
  13391. 173
  13392. -1
  13393. cleanup
  13394. 38
  13395. 41
  13396. -1
  13397. 20
  13398. domain
  13399.  n
  13400.  s
  13401.  e
  13402.  1
  13403.  H
  13404.  B
  13405.  M
  13406.  bo
  13407.  _
  13408.  Bi
  13409.  J
  13410.  Bob
  13411.  @
  13412.  Jo
  13413.  Bill_Enright@B
  13414.  X
  13415.  u
  13416.  JOhn_louch@S
  13417.  L
  13418. 27
  13419. 2
  13420. Xerox.COM
  13421. 38
  13422. 1
  13423. 4
  13424. 4
  13425. 2
  13426. e
  13427. 2
  13428.  
  13429. 4
  13430. 2
  13431. 2
  13432. net
  13433. 2
  13434. nebula.Xerox.COM
  13435. 4
  13436. 2
  13437. 4
  13438. 1
  13439. 2
  13440. rahul
  13441. 4
  13442. 1
  13443. 1
  13444. 71
  13445. 38
  13446. 0
  13447. 4
  13448. 4
  13449. 2
  13450.  
  13451. 2
  13452.  
  13453. 4
  13454. 4
  13455. 2
  13456. shelby@Spot.Orion
  13457. 2
  13458. s_Macintosh.E.T._Phone_Home
  13459. 2
  13460. sdsu.edu
  13461. 2
  13462. steer.sdsu.edu
  13463. 4
  13464. 4
  13465. 4
  13466. 1
  13467. 1
  13468. 346
  13469. 4
  13470. 2
  13471. 1
  13472. 2
  13473. 1
  13474. 228
  13475. 4
  13476. 1
  13477. 2
  13478. steer
  13479. 4
  13480. 1
  13481. 1
  13482. 71
  13483. 38
  13484. 0
  13485. 4
  13486. 4
  13487. 2
  13488.  
  13489. 2
  13490.  
  13491. 4
  13492. 3
  13493. 2
  13494. E.T._Phone_Home
  13495. 2
  13496. euclid.humboldt.edu
  13497. 2
  13498. edu
  13499. 4
  13500. 3
  13501. 4
  13502. 7
  13503. 2
  13504. s_Macintosh
  13505. 2
  13506. Bill_Enright@Black_Buffalo_Woman
  13507. 2
  13508. John_Louch@LiverSpot
  13509. 2
  13510. Bob_Monsen@
  13511. 2
  13512. Bob_Monsen@Hawksbill_Station
  13513. 2
  13514. @Hawksbill_Station
  13515. 2
  13516. uest@LiverSpot
  13517. 4
  13518. 1
  13519. 1
  13520. 71
  13521. 4
  13522. 2
  13523. 2
  13524. sdsu
  13525. 2
  13526. humboldt
  13527. 38
  13528. 0
  13529. 4
  13530. 4
  13531. 2
  13532. 37.150.
  13533. 2
  13534.  
  13535. 4
  13536. 2
  13537. 2
  13538. 137.150.2.105
  13539. 2
  13540. 137.150.152.44
  13541. 4
  13542. 2
  13543. 4
  13544. 1
  13545. 1
  13546. 71
  13547. 4
  13548. 1
  13549. 1
  13550. 71
  13551. 38
  13552. 0
  13553. 4
  13554. 4
  13555. 2
  13556.  
  13557. 2
  13558.  
  13559. 4
  13560. 2
  13561. 2
  13562. Home'.Xerox.COM
  13563. 2
  13564. humboldt.edu
  13565. 4
  13566. 2
  13567. 4
  13568. 4
  13569. 1
  13570. 2
  13571. 1
  13572. 77
  13573. 1
  13574. 154
  13575. 1
  13576. 79
  13577. 4
  13578. 1
  13579. 2
  13580. euclid
  13581. 38
  13582. 0
  13583. 4
  13584. 4
  13585. 2
  13586.  
  13587. 2
  13588. oi
  13589. 4
  13590. 0
  13591. 4
  13592. 0
  13593. 38
  13594. 0
  13595. 4
  13596. 4
  13597. 2
  13598.  
  13599. 2
  13600.  
  13601. 4
  13602. 2
  13603. 2
  13604. Mark_Pesce@Sense/Net.Orion
  13605. 2
  13606. minuet.Xerox.COM
  13607. 4
  13608. 2
  13609. 4
  13610. 1
  13611. 1
  13612. 154
  13613. 4
  13614. 1
  13615. 1
  13616. 71
  13617. 38
  13618. 0
  13619. 4
  13620. 4
  13621. 2
  13622.  
  13623. 2
  13624. b
  13625. 4
  13626. 1
  13627. 2
  13628. bolero.rahul.net
  13629. 4
  13630. 1
  13631. 4
  13632. 1
  13633. 1
  13634. 71
  13635. 38
  13636. 0
  13637. 4
  13638. 4
  13639. 2
  13640.  
  13641. 2
  13642.  
  13643. 4
  13644. 2
  13645. 2
  13646. _Phone_Home
  13647. 2
  13648. _Coffee.Orion
  13649. 4
  13650. 2
  13651. 4
  13652. 1
  13653. 2
  13654. T
  13655. 4
  13656. 1
  13657. 2
  13658. bill_enright@Mr
  13659. 38
  13660. 0
  13661. 4
  13662. 4
  13663. 2
  13664. ll_enright@
  13665. 2
  13666. B
  13667. 4
  13668. 2
  13669. 2
  13670. bill_enright@Red_Cloud.Orion
  13671. 2
  13672. bill_enright@Mr._Coffee.Orion
  13673. 4
  13674. 2
  13675. 4
  13676. 1
  13677. 1
  13678. 77
  13679. 4
  13680. 1
  13681. 1
  13682. 77
  13683. 38
  13684. 0
  13685. 4
  13686. 4
  13687. 2
  13688.  
  13689. 2
  13690. o
  13691. 4
  13692. 1
  13693. 2
  13694. Jeff_Morris@Mighty_Mouse.Orion
  13695. 4
  13696. 1
  13697. 4
  13698. 1
  13699. 1
  13700. 79
  13701. 38
  13702. 0
  13703. 4
  13704. 4
  13705. 2
  13706. _Monsen@
  13707. 2
  13708.  
  13709. 4
  13710. 5
  13711. 2
  13712. bob_monsen@Dalmation.Orion
  13713. 2
  13714. Bob_Monsen@Hawksbill_Station.E.T._Phone_Home
  13715. 2
  13716. Bob_Monsen@.E.T._Phone_Home
  13717. 2
  13718. Bob_Monsen@Kant.Orion
  13719. 2
  13720. Bob_Monsen@Sartre.Orion
  13721. 4
  13722. 5
  13723. 4
  13724. 1
  13725. 1
  13726. 2
  13727. 4
  13728. 3
  13729. 1
  13730. 2
  13731. 1
  13732. 154
  13733. 1
  13734. 228
  13735. 4
  13736. 1
  13737. 1
  13738. 2
  13739. 4
  13740. 1
  13741. 1
  13742. 2
  13743. 4
  13744. 6
  13745. 1
  13746. 2
  13747. 1
  13748. 147
  13749. 1
  13750. 228
  13751. 1
  13752. 154
  13753. 1
  13754. 337
  13755. 1
  13756. 346
  13757. 38
  13758. 0
  13759. 4
  13760. 4
  13761. 2
  13762.  
  13763. 2
  13764.  
  13765. 4
  13766. 3
  13767. 2
  13768. @Hawksbill_Station.E.T._Phone_Home
  13769. 2
  13770. @Mighty_Mouse.Orion
  13771. 2
  13772. @Kant.Orion
  13773. 4
  13774. 3
  13775. 4
  13776. 1
  13777. 1
  13778. 2
  13779. 4
  13780. 1
  13781. 1
  13782. 79
  13783. 4
  13784. 2
  13785. 1
  13786. 2
  13787. 1
  13788. 154
  13789. 38
  13790. 0
  13791. 4
  13792. 4
  13793. 2
  13794. hn_Louch@
  13795. 2
  13796. S
  13797. 4
  13798. 4
  13799. 2
  13800. John_Louch@murdock.Orion
  13801. 2
  13802. John_Louch@Red_Cloud.Orion
  13803. 2
  13804. John_Louch@LiverSpot.E.T._Phone_Home
  13805. 2
  13806. John_Louch@Dalmation.Orion
  13807. 4
  13808. 4
  13809. 4
  13810. 1
  13811. 1
  13812. 147
  13813. 4
  13814. 1
  13815. 1
  13816. 147
  13817. 4
  13818. 1
  13819. 1
  13820. 147
  13821. 4
  13822. 1
  13823. 1
  13824. 147
  13825. 38
  13826. 0
  13827. 4
  13828. 4
  13829. 2
  13830. lack_Buffalo_Woman.
  13831. 2
  13832.  
  13833. 4
  13834. 2
  13835. 2
  13836. Bill_Enright@Black_Buffalo_Woman.Orion
  13837. 2
  13838. Bill_Enright@Black_Buffalo_Woman.E.T._Phone_Home
  13839. 4
  13840. 2
  13841. 4
  13842. 1
  13843. 1
  13844. 77
  13845. 4
  13846. 1
  13847. 1
  13848. 77
  13849. 38
  13850. 0
  13851. 4
  13852. 4
  13853. 2
  13854.  
  13855. 2
  13856.  
  13857. 4
  13858. 2
  13859. 2
  13860. XTC”.Orion
  13861. 2
  13862. Xerox.COM
  13863. 4
  13864. 2
  13865. 4
  13866. 1
  13867. 1
  13868. 337
  13869. 4
  13870. 7
  13871. 2
  13872. golden
  13873. 2
  13874. nebula
  13875. 2
  13876. poplar
  13877. 2
  13878. minuet
  13879. 2
  13880. airplane
  13881. 2
  13882. 'Orion'
  13883. 2
  13884. Home'
  13885. 38
  13886. 0
  13887. 4
  13888. 4
  13889. 2
  13890. est@
  13891. 2
  13892.  
  13893. 4
  13894. 2
  13895. 2
  13896. uest@Red_Cloud.Orion
  13897. 2
  13898. uest@LiverSpot.E.T._Phone_Home
  13899. 4
  13900. 2
  13901. 4
  13902. 1
  13903. 1
  13904. 147
  13905. 4
  13906. 1
  13907. 1
  13908. 346
  13909. 38
  13910. 0
  13911. 4
  13912. 4
  13913. 2
  13914.  
  13915. 2
  13916.  
  13917. 4
  13918. 2
  13919. 2
  13920. JOhn_louch@Sartre.Orion
  13921. 2
  13922. John_Louch@Spot.Orion
  13923. 4
  13924. 2
  13925. 4
  13926. 1
  13927. 1
  13928. 147
  13929. 4
  13930. 1
  13931. 1
  13932. 147
  13933. 38
  13934. 0
  13935. 4
  13936. 4
  13937. 2
  13938. ocal
  13939. 2
  13940.  
  13941. 4
  13942. 2
  13943. 2
  13944. LocalZone
  13945. 2
  13946. LocalUser@LocalMachine.LocalZone
  13947. 4
  13948. 2
  13949. 4
  13950. 1
  13951. 2
  13952. LocalUser@LocalMachine
  13953. 4
  13954. 2
  13955. 1
  13956. 2
  13957. 1
  13958. 154
  13959. 38
  13960. 0
  13961. 2
  13962.  
  13963. 38
  13964. 5
  13965. 5
  13966. 38
  13967. 1
  13968. 4
  13969. 4
  13970. 2
  13971.  
  13972. 2
  13973. nse1HBM_J@XuL
  13974. 4
  13975. 9
  13976. 2
  13977. foobar@apple.com
  13978. 2
  13979. T._Phone_Home
  13980. 2
  13981. Orion
  13982. 2
  13983. 'Orion'.Xerox.COM
  13984. 2
  13985. airplane.Xerox.COM
  13986. 2
  13987. poplar.Xerox.COM
  13988. 2
  13989. rahul.net
  13990. 2
  13991. COM
  13992. 2
  13993. golden.Xerox.COM
  13994. 4
  13995. 9
  13996. 4
  13997. 2
  13998. 1
  13999. 2
  14000. 1
  14001. 154
  14002. 4
  14003. 1
  14004. 2
  14005. E
  14006. 4
  14007. 18
  14008. 2
  14009. Bob_Monsen@Sartre
  14010. 2
  14011. John_Louch@Dalmation
  14012. 2
  14013. Mark_Pesce@Sense/Net
  14014. 2
  14015. _Coffee
  14016. 2
  14017. Bob_Monsen@Kant
  14018. 2
  14019. John_Louch@Spot
  14020. 2
  14021. John_Louch@Red_Cloud
  14022. 2
  14023. bill_enright@Red_Cloud
  14024. 2
  14025. @Kant
  14026. 2
  14027. @Mighty_Mouse
  14028. 2
  14029. Jeff_Morris@Mighty_Mouse
  14030. 2
  14031. Bill_Enright@Black_Buffalo_Woman
  14032. 2
  14033. XTC”
  14034. 2
  14035. bob_monsen@Dalmation
  14036. 2
  14037. John_Louch@murdock
  14038. 2
  14039. uest@Red_Cloud
  14040. 2
  14041. JOhn_louch@Sartre
  14042. 2
  14043. shelby@Spot
  14044. 4
  14045. 6
  14046. 1
  14047. 2
  14048. 1
  14049. 77
  14050. 1
  14051. 79
  14052. 1
  14053. 146
  14054. 1
  14055. 78
  14056. 1
  14057. 154
  14058. 4
  14059. 1
  14060. 1
  14061. 71
  14062. 4
  14063. 1
  14064. 1
  14065. 71
  14066. 4
  14067. 1
  14068. 2
  14069. bolero
  14070. 4
  14071. 2
  14072. 2
  14073. Xerox
  14074. 2
  14075. foobar@apple
  14076. 4
  14077. 1
  14078. 1
  14079. 71
  14080. 38
  14081. 0
  14082. 5
  14083. 38
  14084. 4
  14085. 4
  14086. 3
  14087. 2
  14088. sitedb
  14089. 2
  14090. site
  14091. 2
  14092. db
  14093. 38
  14094. 5
  14095. 4
  14096. 2
  14097. 2
  14098. This object holds a db of places from which players have connected (see `help $site_db').
  14099. 2
  14100. The site blacklist and the graylist live as well (see `help blacklist').
  14101. 38
  14102. 5
  14103. 4
  14104. 2
  14105. 0
  14106. 1229769
  14107. 0
  14108. 743587273
  14109. 2
  14110. 1
  14111. #28
  14112. Math Utilities
  14113.  
  14114. 16
  14115. 38
  14116. -1
  14117. -1
  14118. -1
  14119. 1
  14120. -1
  14121. 53
  14122. 35
  14123. sin
  14124. 38
  14125. 173
  14126. -1
  14127. cos
  14128. 38
  14129. 173
  14130. -1
  14131. tan
  14132. 38
  14133. 173
  14134. -1
  14135. xsin
  14136. 38
  14137. 173
  14138. -1
  14139. xcos
  14140. 38
  14141. 173
  14142. -1
  14143. factorial
  14144. 38
  14145. 173
  14146. -1
  14147. pow
  14148. 38
  14149. 173
  14150. -1
  14151. fibonacci
  14152. 38
  14153. 173
  14154. -1
  14155. geometric
  14156. 38
  14157. 173
  14158. -1
  14159. divmod
  14160. 38
  14161. 173
  14162. -1
  14163. combinations
  14164. 38
  14165. 173
  14166. -1
  14167. permutations
  14168. 38
  14169. 173
  14170. -1
  14171. simpson
  14172. 38
  14173. 173
  14174. -1
  14175. parts
  14176. 38
  14177. 173
  14178. -1
  14179. sqrt
  14180. 38
  14181. 173
  14182. -1
  14183. arctan
  14184. 38
  14185. 173
  14186. -1
  14187. div
  14188. 38
  14189. 173
  14190. -1
  14191. mod
  14192. 38
  14193. 173
  14194. -1
  14195. aexp
  14196. 38
  14197. 173
  14198. -1
  14199. random
  14200. 38
  14201. 173
  14202. -1
  14203. random_range
  14204. 38
  14205. 173
  14206. -1
  14207. is_prime
  14208. 38
  14209. 173
  14210. -1
  14211. AND
  14212. 38
  14213. 173
  14214. -1
  14215. OR
  14216. 38
  14217. 173
  14218. -1
  14219. XOR
  14220. 38
  14221. 173
  14222. -1
  14223. NOT
  14224. 38
  14225. 173
  14226. -1
  14227. BLFromInt
  14228. 38
  14229. 173
  14230. -1
  14231. IntFromBL
  14232. 38
  14233. 173
  14234. -1
  14235. gcd greatest_common_divisor
  14236. 38
  14237. 173
  14238. -1
  14239. lcm least_common_multiple
  14240. 38
  14241. 173
  14242. -1
  14243. are_rel_prime are_relatively_prime
  14244. 38
  14245. 173
  14246. -1
  14247. base_conversion
  14248. 38
  14249. 173
  14250. -1
  14251. exp
  14252. 38
  14253. 173
  14254. -1
  14255. norm
  14256. 38
  14257. 173
  14258. -1
  14259. sum
  14260. 38
  14261. 173
  14262. -1
  14263. 4
  14264. base_alphabet
  14265. tangents
  14266. factor
  14267. taylor
  14268. 8
  14269. 2
  14270. 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
  14271. 38
  14272. 5
  14273. 4
  14274. 45
  14275. 0
  14276. 174
  14277. 0
  14278. 349
  14279. 0
  14280. 524
  14281. 0
  14282. 699
  14283. 0
  14284. 874
  14285. 0
  14286. 1051
  14287. 0
  14288. 1227
  14289. 0
  14290. 1405
  14291. 0
  14292. 1583
  14293. 0
  14294. 1763
  14295. 0
  14296. 1943
  14297. 0
  14298. 2125
  14299. 0
  14300. 2308
  14301. 0
  14302. 2493
  14303. 0
  14304. 2679
  14305. 0
  14306. 2867
  14307. 0
  14308. 3057
  14309. 0
  14310. 3249
  14311. 0
  14312. 3443
  14313. 0
  14314. 3639
  14315. 0
  14316. 3838
  14317. 0
  14318. 4040
  14319. 0
  14320. 4244
  14321. 0
  14322. 4452
  14323. 0
  14324. 4663
  14325. 0
  14326. 4877
  14327. 0
  14328. 5095
  14329. 0
  14330. 5317
  14331. 0
  14332. 5543
  14333. 0
  14334. 5773
  14335. 0
  14336. 6008
  14337. 0
  14338. 6248
  14339. 0
  14340. 6494
  14341. 0
  14342. 6745
  14343. 0
  14344. 7002
  14345. 0
  14346. 7265
  14347. 0
  14348. 7535
  14349. 0
  14350. 7812
  14351. 0
  14352. 8097
  14353. 0
  14354. 8390
  14355. 0
  14356. 8692
  14357. 0
  14358. 9004
  14359. 0
  14360. 9325
  14361. 0
  14362. 9656
  14363. 0
  14364. 10000
  14365. 38
  14366. 5
  14367. 0
  14368. 10000
  14369. 38
  14370. 5
  14371. 0
  14372. 100
  14373. 38
  14374. 5
  14375. 5
  14376. 38
  14377. 4
  14378. 4
  14379. 4
  14380. 2
  14381. Math Utilities
  14382. 2
  14383. Math_Utils
  14384. 2
  14385. trigonometric utilites
  14386. 2
  14387. trig_utils
  14388. 38
  14389. 5
  14390. 4
  14391. 47
  14392. 2
  14393. Trigonometric/Exponential functions:
  14394. 2
  14395.   sin(a),cos(a),tan(a) -- returns 10000*(the value of the corresponding
  14396. 2
  14397.        trigonometric function) angle a is in degrees.
  14398. 2
  14399.   arctan([x,]y) -- returns arctan(y/x) in degrees in the range -179..180.
  14400. 2
  14401.        x defaults to 10000.  Quadrant is that of (x,y).
  14402. 2
  14403.   exp(x[,n]) -- calculates e^x with an nth order taylor polynomial
  14404. 2
  14405.  
  14406. 2
  14407. Statistical functions:
  14408. 2
  14409.   combinations(n,r) -- returns the number of combinations given n objects
  14410. 2
  14411.        taken r at a time.
  14412. 2
  14413.   permutations(n,r) -- returns the number of permutations possible given
  14414. 2
  14415.        n objects taken r at a time.
  14416. 2
  14417.  
  14418. 2
  14419. Number decomposition:
  14420. 2
  14421.   div(n,d) -- correct version of / (handles negative numbers correctly)
  14422. 2
  14423.   mod(n,d) -- correct version of % (handles negative numbers correctly)
  14424. 2
  14425.   divmod(n,d) -- {div(n,d),mod(n,d)}
  14426. 2
  14427.   parts(n,q[,i]) -- returns a list of two elements {integer,decimal fraction}
  14428. 2
  14429.  
  14430. 2
  14431. Other math functions:
  14432. 2
  14433.   sqrt(x)      -- returns the largest integer n <= the square root of x
  14434. 2
  14435.   pow(x,n)     -- returns x^n
  14436. 2
  14437.   factorial(x) -- returns x!
  14438. 2
  14439.  
  14440. 2
  14441. Series:
  14442. 2
  14443.   fibonacci(n) -- returns the 1st n fibonacci numbers in a list
  14444. 2
  14445.   geometric(x,n) -- returns the value of the nth order geometric series at x
  14446. 2
  14447.  
  14448. 2
  14449. Integer Properties:
  14450. 2
  14451.   gcd(a,b) -- find the greatest common divisor of the two numbers
  14452. 2
  14453.   lcm(a,b) -- find the least common multiple of the two numbers
  14454. 2
  14455.   are_relatively_prime(a,b) -- return 1 if a and b are relatively prime
  14456. 2
  14457.   is_prime(n) -- returns 1 if the number is a prime and 0 otherwise
  14458. 2
  14459.   
  14460. 2
  14461. Miscellaneous:
  14462. 2
  14463.   random(n) -- returns a random number from 0..n if n > 0 or n..0 if n < 0
  14464. 2
  14465.   random_range(n[,mean]) -- returns a random number from mean - n..mean + n
  14466. 2
  14467.        with mean defaulting to 0
  14468. 2
  14469.   simpson({a,b},{f(a),f((a+b)/2),f(b)}) -- returns the numerical
  14470. 2
  14471.       approximation of an integral using simpson's rule
  14472. 2
  14473.  
  14474. 2
  14475. Bitwise Arithmetic:
  14476. 2
  14477.   AND(x,y) -- returns x AND y
  14478. 2
  14479.   OR(x,y) -- returns x OR y
  14480. 2
  14481.   XOR(x,y) -- returns x XOR y (XOR is the exclusive-or function)
  14482. 2
  14483.   NOT(x) -- returns the complement of x
  14484. 2
  14485.       All bitwise manipulation is of 32-bit values.
  14486. 38
  14487. 5
  14488. 4
  14489. 2
  14490. 0
  14491. 19005
  14492. 0
  14493. 743585512
  14494. 2
  14495. 1
  14496. #29
  14497. Set Utilities
  14498.  
  14499. 16
  14500. 38
  14501. -1
  14502. -1
  14503. -1
  14504. 1
  14505. -1
  14506. 26
  14507. 7
  14508. union
  14509. 38
  14510. 173
  14511. -1
  14512. intersection
  14513. 38
  14514. 173
  14515. -1
  14516. diff*erence
  14517. 38
  14518. 173
  14519. -1
  14520. contains
  14521. 38
  14522. 173
  14523. -1
  14524. exclusive_or xor
  14525. 38
  14526. 173
  14527. -1
  14528. difference_suspended diff_suspended
  14529. 38
  14530. 173
  14531. -1
  14532. equal
  14533. 38
  14534. 173
  14535. -1
  14536. 0
  14537. 4
  14538. 5
  14539. 38
  14540. 4
  14541. 4
  14542. 2
  14543. 2
  14544. Set Utilities
  14545. 2
  14546. set_utilities
  14547. 38
  14548. 5
  14549. 4
  14550. 16
  14551. 2
  14552. This object is useful for operations that treat lists as sets (i.e.,
  14553. 2
  14554. without concern about order and assuming no duplication).
  14555. 2
  14556.  
  14557. 2
  14558.  union(set, set, ...)        => union
  14559. 2
  14560.  intersection(set, set, ...) => intersection
  14561. 2
  14562.  
  14563. 2
  14564.  diff*erence(set1, set2, ..., setn)
  14565. 2
  14566.         => result of removing all elements of sets 2..n from set 1.
  14567. 2
  14568.  exclusive_or(set, set, set, ...)
  14569. 2
  14570.         => all elements that are contained in exactly one of the sets
  14571. 2
  14572.  
  14573. 2
  14574.  contains(set1, set2, ..., setn)
  14575. 2
  14576.         => true if and only if all of sets 2..n are subsets of set 1
  14577. 2
  14578.  
  14579. 2
  14580.  equal(set1, set2)
  14581. 2
  14582.         => true if and only if set1 and set2 are equal
  14583. 38
  14584. 5
  14585. 4
  14586. 2
  14587. 0
  14588. 4429
  14589. 0
  14590. 743625628
  14591. 2
  14592. 1
  14593. #30
  14594. Builtin Function Help
  14595.  
  14596. 16
  14597. 38
  14598. -1
  14599. -1
  14600. -1
  14601. 32
  14602. -1
  14603. 25
  14604. 1
  14605. init_for_core
  14606. 2
  14607. 173
  14608. -1
  14609. 81
  14610. match()
  14611. rmatch()
  14612. substitute()
  14613. sqrt()
  14614. server_log()
  14615. pass()
  14616. builtin-index
  14617. open_network_connection()
  14618. connection_name()
  14619. shutdown()
  14620. dump_database()
  14621. memory_usage()
  14622. reset_max_object()
  14623. renumber()
  14624. server_version()
  14625. output_delimiters()
  14626. callers()
  14627. kill_task()
  14628. queued_tasks()
  14629. read()
  14630. suspend()
  14631. task_id()
  14632. seconds_left()
  14633. ticks_left()
  14634. caller_perms()
  14635. set_task_perms()
  14636. eval()
  14637. boot_player()
  14638. notify()
  14639. idle_seconds()
  14640. connected_seconds()
  14641. connected_players()
  14642. set_player_flag()
  14643. is_player()
  14644. players()
  14645. set_verb_code()
  14646. verb_code()
  14647. delete_verb()
  14648. add_verb()
  14649. set_verb_args()
  14650. verb_args()
  14651. set_verb_info()
  14652. verb_info()
  14653. verbs()
  14654. delete_property()
  14655. add_property()
  14656. set_property_info()
  14657. property_info()
  14658. properties()
  14659. move()
  14660. max_object()
  14661. recycle()
  14662. children()
  14663. parent()
  14664. valid()
  14665. chparent()
  14666. create()
  14667. setremove()
  14668. setadd()
  14669. listset()
  14670. listdelete()
  14671. listinsert()
  14672. listappend()
  14673. strcmp()
  14674. rindex()
  14675. index()
  14676. crypt()
  14677. strsub()
  14678. length()
  14679. ctime()
  14680. time()
  14681. random()
  14682. abs()
  14683. max()
  14684. min()
  14685. toobj()
  14686. tonum()
  14687. tostr()
  14688. typeof()
  14689. clear_property()
  14690. is_clear_property()
  14691. 86
  14692. 4
  14693. 20
  14694. 2
  14695. Syntax:  match (str <subject>, str <pattern> [, <case-matters>])  => list
  14696. 2
  14697.          rmatch (str <subject>, str <pattern> [, <case-matters>])  => list
  14698. 2
  14699.  
  14700. 2
  14701. The function `match()' (`rmatch()') searches for the first (last) occurrence of the regular expression <pattern> in the string <subject>.  If <pattern> is syntactically malformed, then `E_INVARG' is returned.  If no match is found, the empty list is returned; otherwise, these functions return a list containing information about the match (see below).  By default, the search ignores upper/lower case distinctions.  If <case-matters> is provided and true, then case is treated as significant in all comparisons.
  14702. 2
  14703.  
  14704. 2
  14705. The list that `match()' (`rmatch()') returns contains the details about the match made.  The list is in the form:
  14706. 2
  14707.  
  14708. 2
  14709.      {<start>, <end>, <replacements>, <subject>}
  14710. 2
  14711.  
  14712. 2
  14713. where <start> is the index in STRING of the beginning of the match, <end> is the index of the end of the match, <replacements> is a list described below, and <subject> is the same string that was given as the first argument to the `match()' or `rmatch()'.
  14714. 2
  14715.  
  14716. 2
  14717. The <replacements> list is always nine items long, each item itself being a list of two numbers, the start and end indices in <subject> matched by some parenthesized sub-pattern of <pattern>.  The first item in <replacements> carries the indices for the first parenthesized sub-pattern, the second item carries those for the second sub-pattern, and so on.  If there are fewer than nine parenthesized sub-patterns in <pattern>, or if some sub-pattern was not used in the match, then the corresponding item in <replacements> is the list {0, -1}.  See the discussion of `%)' in `help regular-expressions', for more information on parenthesized sub-patterns.
  14718. 2
  14719.  
  14720. 2
  14721.    match("foo", "f*o")          =>  {1, 2, {{0, -1}, ...}, "foo"}
  14722. 2
  14723.    match("foo", "fo*")          =>  {1, 3, {{0, -1}, ...}, "foo"}
  14724. 2
  14725.    match("foobar", "o*b")       =>  {2, 4, {{0, -1}, ...}, "foobar"}
  14726. 2
  14727.    rmatch("foobar", "o*b")      =>  {4, 4, {{0, -1}, ...}, "foobar"}
  14728. 2
  14729.    match("foobar", "f%(o*%)b")  =>  {1, 4, {{2, 3}, {0, -1}, ...}, "foobar"}
  14730. 2
  14731.  
  14732. 2
  14733. See `help regular-expressions' for information on the syntax and semantics of patterns.
  14734. 38
  14735. 5
  14736. 4
  14737. 2
  14738. 2
  14739. *forward*
  14740. 2
  14741. match()
  14742. 38
  14743. 5
  14744. 4
  14745. 9
  14746. 2
  14747. Syntax:  substitute (str <template>, list <subs>)  => str
  14748. 2
  14749.  
  14750. 2
  14751. Performs a standard set of substitutions on the string <template>, using the information contained in <subs>, returning the resulting, transformed <template>.  <Subs> should be a list like those returned by `match()' or `rmatch()' when the match succeeds.
  14752. 2
  14753.  
  14754. 2
  14755. In <template>, the strings `%1' through `%9' will be replaced by the text matched by the first through ninth parenthesized sub-patterns when `match()' or `rmatch()' was called.  The string `%0' in <template> will be replaced by the text matched by the pattern as a whole when `match()' or `rmatch()' was called.
  14756. 2
  14757.  
  14758. 2
  14759.      subs = match("*** Welcome to LambdaMOO!!!", "%(%w*%) to %(%w*%)");
  14760. 2
  14761.      substitute("I thank you for your %1 here in %2.", subs)
  14762. 2
  14763.              =>   "I thank you for your Welcome here in LambdaMOO."
  14764. 38
  14765. 5
  14766. 4
  14767. 3
  14768. 2
  14769. Syntax:  sqrt (num <x>)  => num
  14770. 2
  14771.  
  14772. 2
  14773. Returns the square root of <x>.  If <x> is negative, then `E_INVARG' is returned.
  14774. 38
  14775. 5
  14776. 4
  14777. 3
  14778. 2
  14779. Syntax:  server_log (str <message> [, <is-error>])  => none
  14780. 2
  14781.  
  14782. 2
  14783. The text in <message> is sent to the server log.  If the programmer is not a wizard, then `E_PERM' is returned.  If <is-error> is provided and true, then <message> is marked in the server log as an error.
  14784. 38
  14785. 5
  14786. 4
  14787. 31
  14788. 2
  14789. Syntax:  pass (<arg>,...)
  14790. 2
  14791.  
  14792. 2
  14793. Often, it is useful for a child object to define a verb that *augments*
  14794. 2
  14795. the behavior of a verb on its parent object.  For example, the root object 
  14796. 2
  14797. (an ancestor of every other object) defines a :description() verb that 
  14798. 2
  14799. simply returns the value of `this.description'; 
  14800. 2
  14801. this verb is used by the implementation of the `look' command.  
  14802. 2
  14803. In many cases, a programmer would like the description of some object to
  14804. 2
  14805. include some non-constant part; for example, a sentence about whether or not
  14806. 2
  14807. the object was `awake' or `sleeping'.  This sentence should be added onto the
  14808. 2
  14809. end of the normal description.  The programmer would like to have a means of
  14810. 2
  14811. calling the normal `description' verb and then appending the sentence onto the
  14812. 2
  14813. end of that description.  The function `pass()' is for exactly such situations.
  14814. 2
  14815.  
  14816. 2
  14817. pass() calls the verb with the same name as the current verb but as
  14818. 2
  14819. defined on the parent of the object that defines the current verb.  The
  14820. 2
  14821. arguments given to the called verb are the ones given to pass() and the
  14822. 2
  14823. returned value of the called verb is returned from the call to pass().
  14824. 2
  14825. The initial value of `this' in the called verb is the same as in the
  14826. 2
  14827. calling verb.
  14828. 2
  14829.  
  14830. 2
  14831. Thus, in the example above, the child-object's :description() verb might
  14832. 2
  14833. have the following implementation:
  14834. 2
  14835.  
  14836. 2
  14837.     return pass(@args) + "  It is " + (this.awake ? "awake." | "sleeping.");
  14838. 2
  14839.  
  14840. 2
  14841. That is, it calls its parent's :description() verb and then appends to the
  14842. 2
  14843. result a sentence whose content is computed based on the value of a property on
  14844. 2
  14845. the object.
  14846. 2
  14847.  
  14848. 2
  14849. In the above example, `pass()' would have worked just as well, since :description() is not normally given any arguements.  However, it is a good idea to get into the habit of using `pass(@args)' rather than `pass(args[1])' or `pass()' even if the verb being pass()ed to is already known to take a set number of arguments or none at all.  For one thing, though the args may be irrelevant to the code that you've written, it may be that the corresponding verb on the parent has been rewritten to take additional arguments, in which case you will want your verb to continue to work...
  14850. 38
  14851. 5
  14852. 4
  14853. 2
  14854. 2
  14855. *index*
  14856. 2
  14857. Server Built-in Functions
  14858. 38
  14859. 5
  14860. 4
  14861. 52
  14862. 2
  14863. Syntax:  open_network_connection (<value>, ...)   => obj
  14864. 2
  14865.  
  14866. 2
  14867. Establishes a network connection to the place specified by the arguments and
  14868. 2
  14869. pretends that a new, normal player connection has been established from there.
  14870. 2
  14871. The new connection, as usual, will not be logged in initially and will have a
  14872. 2
  14873. negative object number associated with it for use with `read()',
  14874. 2
  14875. `notify()', and `boot_player()'.  This object number is the value returned by this function.
  14876. 2
  14877.  
  14878. 2
  14879. If the programmer is not a wizard or if the `OUTBOUND_NETWORK' compilation
  14880. 2
  14881. option was not used in building the server, then `E_PERM' is returned.  If
  14882. 2
  14883. the network connection cannot be made for some reason, then other errors will
  14884. 2
  14885. be returned, depending upon the particular network implementation in use.
  14886. 2
  14887.  
  14888. 2
  14889. For the BSD UNIX network implementation (the only publicly-available one as of
  14890. 2
  14891. this writing), there must be two arguments, a string naming a host (possibly
  14892. 2
  14893. using the numeric Internet syntax) and a number specifying a TCP port.  If a
  14894. 2
  14895. connection cannot be made because the host does not exist, the port does not
  14896. 2
  14897. exist, the host is not reachable or refused the connection, `E_INVARG' is
  14898. 2
  14899. returned.  If the connection cannot be made for other reasons, including
  14900. 2
  14901. resource limitations, then `E_QUOTA' is returned.
  14902. 2
  14903.  
  14904. 2
  14905. It is worth mentioning a couple of tricky points concerning the use of this
  14906. 2
  14907. function.
  14908. 2
  14909.  
  14910. 2
  14911. Since the server treats the new connection like any other normal
  14912. 2
  14913. player connection, it will naturally try to parse any input from that
  14914. 2
  14915. connection as commands in the usual way.  To prevent this treatment, it is
  14916. 2
  14917. necessary to ensure that some task is always suspended using `read()' on
  14918. 2
  14919. the connection whenever the server considers a line of input from it.  That
  14920. 2
  14921. way, the line of input will be given to that task instead of being parsed as a
  14922. 2
  14923. command.  The only reliable way to ensure this is for the task that opens the
  14924. 2
  14925. connection to enter an infinite loop reading from the connection.  One possible
  14926. 2
  14927. structure for such a task is as follows:
  14928. 2
  14929.  
  14930. 2
  14931.     conn = open_network_connection(...);
  14932. 2
  14933.     read(conn);
  14934. 2
  14935.     while (1)
  14936. 2
  14937.       line = read(conn);
  14938. 2
  14939.       fork (0)
  14940. 2
  14941.         this:handle_input(line);
  14942. 2
  14943.       endfork
  14944. 2
  14945.     endwhile
  14946. 2
  14947.  
  14948. 2
  14949. The first call to `read()' in this example is to discard the null line of
  14950. 2
  14951. input always automatically supplied by the server for new connections; for more
  14952. 2
  14953. details, see the discussion of `#0:do_login_command' in the section on
  14954. 2
  14955. server commands and database assumptions.
  14956. 2
  14957.  
  14958. 2
  14959. The second fine point to be considered is that, unless the new connection
  14960. 2
  14961. eventually `logs in' in the usual way for players, the server will impose its
  14962. 2
  14963. usual five-minute timeout on it, shutting down the connection unless new input
  14964. 2
  14965. arrives at least once every five minutes.
  14966. 38
  14967. 5
  14968. 4
  14969. 15
  14970. 2
  14971. Syntax:  connection_name (obj <player>)   => str
  14972. 2
  14973.  
  14974. 2
  14975. Returns a network-specific string identifying the connection being used by the
  14976. 2
  14977. given player.  If the programmer is not a wizard and not <player>, then
  14978. 2
  14979. `E_PERM' is returned.  If <player> is not currently connected, then
  14980. 2
  14981. `E_INVARG' is returned.
  14982. 2
  14983.  
  14984. 2
  14985. For the BSD UNIX network implementation (the only publicly-available one as of
  14986. 2
  14987. this writing), the string has the form
  14988. 2
  14989.  
  14990. 2
  14991.     "<number> from <host>"
  14992. 2
  14993.  
  14994. 2
  14995. where <number> is a remarkably uninteresting internal server index and
  14996. 2
  14997. <host> is either the name or decimal TCP address of the host from which the
  14998. 2
  14999. player is connected.
  15000. 38
  15001. 5
  15002. 4
  15003. 5
  15004. 2
  15005. Syntax:  shutdown (str <message>)   => none
  15006. 2
  15007.  
  15008. 2
  15009. Requests that the server shut itself down at its next opportunity.  Before
  15010. 2
  15011. doing so, the given <message> is printed to all connected players.  If the
  15012. 2
  15013. programmer is not a wizard, then `E_PERM' is returned.
  15014. 38
  15015. 5
  15016. 4
  15017. 7
  15018. 2
  15019. Syntax:  dump_database ()   => none
  15020. 2
  15021.  
  15022. 2
  15023. Requests that the server checkpoint the database at its next opportunity.  It
  15024. 2
  15025. is not normally necessary to call this function; the server automatically
  15026. 2
  15027. checkpoints the database at regular intervals; see the chapter on server
  15028. 2
  15029. assumptions about the database for details.  If the programmer is not a wizard,
  15030. 2
  15031. then `E_PERM' is returned.
  15032. 38
  15033. 5
  15034. 4
  15035. 17
  15036. 2
  15037. Syntax:  memory_usage ()   => list
  15038. 2
  15039.  
  15040. 2
  15041. On some versions of the server, this returns statistics concerning the server
  15042. 2
  15043. consumption of system memory.  The result is a list of lists, each in the
  15044. 2
  15045. following format:
  15046. 2
  15047.  
  15048. 2
  15049.     {<block-size>, <nused>, <nfree>}
  15050. 2
  15051.  
  15052. 2
  15053. where <block-size> is the size in bytes of a particular class of memory
  15054. 2
  15055. fragments, <nused> is the number of such fragments currently in use in the
  15056. 2
  15057. server, and <nfree> is the number of such fragments that have been reserved
  15058. 2
  15059. for use but are currently free.
  15060. 2
  15061.  
  15062. 2
  15063. On servers for which such statistics are not available, `memory_usage()'
  15064. 2
  15065. returns `{}'.  The compilation option `USE_SYSTEM_MALLOC' controls
  15066. 2
  15067. whether or not statistics are available; if the option is provided, statistics
  15068. 2
  15069. are not available.
  15070. 38
  15071. 5
  15072. 4
  15073. 10
  15074. 2
  15075. Syntax:  reset_max_object ()   => none
  15076. 2
  15077.  
  15078. 2
  15079. The server's idea of the highest object number ever used is changed to be the
  15080. 2
  15081. highest object number of a currently-existing object, thus allowing reuse of
  15082. 2
  15083. any higher numbers that refer to now-recycled objects.  If the programmer is
  15084. 2
  15085. not a wizard, then `E_PERM' is returned.
  15086. 2
  15087.  
  15088. 2
  15089. This operation is intended for use in making new versions of the LambdaCore
  15090. 2
  15091. database from the then-current LambdaMOO database, and other similar
  15092. 2
  15093. situations.  Its use requires great care.
  15094. 38
  15095. 5
  15096. 4
  15097. 19
  15098. 2
  15099. Syntax:  renumber (obj <object>)   => obj
  15100. 2
  15101.  
  15102. 2
  15103. The object number of the object currently numbered <object> is changed to
  15104. 2
  15105. be the least nonnegative object number not currently in use and the new object
  15106. 2
  15107. number is returned.  If <object> is not valid, then `E_INVARG' is
  15108. 2
  15109. returned.  If the programmer is not a wizard, then `E_PERM' is returned.
  15110. 2
  15111. If there are no unused nonnegative object numbers less than <object>, then
  15112. 2
  15113. <object> is returned and no changes take place.
  15114. 2
  15115.  
  15116. 2
  15117. The references to <object> in the parent/children and location/contents
  15118. 2
  15119. hierarchies are updated to use the new object number, and any verbs, properties
  15120. 2
  15121. and/or objects owned by <object> are also changed to be owned by the new
  15122. 2
  15123. object number.  The latter operation can be quite time consuming if the
  15124. 2
  15125. database is large.  No other changes to the database are performed; in
  15126. 2
  15127. particular, no object references in property values or verb code are updated.
  15128. 2
  15129.  
  15130. 2
  15131. This operation is intended for use in making new versions of the LambdaCore
  15132. 2
  15133. database from the then-current LambdaMOO database, and other similar
  15134. 2
  15135. situations.  Its use requires great care.
  15136. 38
  15137. 5
  15138. 4
  15139. 22
  15140. 2
  15141. Syntax:  server_version ()   => str
  15142. 2
  15143.  
  15144. 2
  15145. Returns a string giving the version number of the MOO server in the following
  15146. 2
  15147. format:
  15148. 2
  15149.  
  15150. 2
  15151.     "<major>.<minor>.<release>"
  15152. 2
  15153.  
  15154. 2
  15155. where <major>, <minor>, and <release> are all decimal numbers.
  15156. 2
  15157.  
  15158. 2
  15159. The major version number changes very slowly, only when existing MOO code might
  15160. 2
  15161. stop working, due to an incompatible change in the syntax or semantics of the
  15162. 2
  15163. programming language, or when an incompatible change is made to the database
  15164. 2
  15165. format.
  15166. 2
  15167.  
  15168. 2
  15169. The minor version number changes more quickly, whenever an upward-compatible
  15170. 2
  15171. change is made in the programming language syntax or semantics.  The most
  15172. 2
  15173. common cause of this is the addition of a new kind of expression, statement, or
  15174. 2
  15175. built-in function.
  15176. 2
  15177.  
  15178. 2
  15179. The release version number changes as frequently as bugs are fixed in the
  15180. 2
  15181. server code.  Changes in the release number indicate changes that should only
  15182. 2
  15183. be visible to users as bug fixes, if at all.
  15184. 38
  15185. 5
  15186. 4
  15187. 8
  15188. 2
  15189. Syntax:  output_delimiters (obj <player>)   => list
  15190. 2
  15191.  
  15192. 2
  15193. Returns a list of two strings, the current "output prefix" and "output
  15194. 2
  15195. suffix" for <player>.  If <player> does not have an active network
  15196. 2
  15197. connection, then `E_INVARG' is returned.  If either string is currently
  15198. 2
  15199. undefined, the value `""' is used instead.  See the discussion of the
  15200. 2
  15201. `PREFIX' and `SUFFIX' commands in the next chapter for more
  15202. 2
  15203. information about the output prefix and suffix.
  15204. 38
  15205. 5
  15206. 4
  15207. 22
  15208. 2
  15209. Syntax:  callers ()   => list
  15210. 2
  15211.  
  15212. 2
  15213. Returns information on each of the verbs currently waiting to resume execution
  15214. 2
  15215. in the current task.  When one verb calls another verb, execution of the caller
  15216. 2
  15217. is temporarily suspended, pending the called verb returning a value.  At any
  15218. 2
  15219. given time, there could be several such pending verbs: the one that called the
  15220. 2
  15221. currently executing verb, the verb that called that one, and so on.  The result
  15222. 2
  15223. of `callers()' is a list, each element of which gives information about
  15224. 2
  15225. one pending verb in the following format:
  15226. 2
  15227.  
  15228. 2
  15229.     {<this>, <verb-name>, <programmer>, <verb-loc>, <player>}
  15230. 2
  15231.  
  15232. 2
  15233. where <this> is the initial value of the variable `this' in that verb,
  15234. 2
  15235. <verb-name> is the name used to invoke that verb,  <programmer> is
  15236. 2
  15237. the player with whose permissions that verb is running, <verb-loc> is the
  15238. 2
  15239. object on which that verb is defined, and <player> is the initial value of
  15240. 2
  15241. the variable `player' in that verb.
  15242. 2
  15243.  
  15244. 2
  15245. The first element of the list returned by `callers()' gives information on
  15246. 2
  15247. the verb that called the currently-executing verb, the second element describes
  15248. 2
  15249. the verb that called that one, and so on.  The last element of the list
  15250. 2
  15251. describes the first verb called in this task.
  15252. 38
  15253. 5
  15254. 4
  15255. 6
  15256. 2
  15257. Syntax:  kill_task (num <task-id>)   => none
  15258. 2
  15259.  
  15260. 2
  15261. Removes the task with the given <task-id> from the queue of waiting tasks.
  15262. 2
  15263. If the programmer is not the owner of that task and not a wizard, then
  15264. 2
  15265. `E_PERM' is returned.  If there is no task on the queue with the given
  15266. 2
  15267. <task-id>, then `E_INVARG' is returned.
  15268. 38
  15269. 5
  15270. 4
  15271. 25
  15272. 2
  15273. Syntax:  queued_tasks ()   => list
  15274. 2
  15275.  
  15276. 2
  15277. Returns information on each of the forked, suspended or reading tasks owned by
  15278. 2
  15279. the programmer (or, if the programmer is a wizard, all queued tasks).  The
  15280. 2
  15281. returned value is a list of lists, each of which encodes certain information
  15282. 2
  15283. about a particular queued task in the following format:
  15284. 2
  15285.  
  15286. 2
  15287.     {<task-id>, <start-time>, <ticks>, <clock-id>,
  15288. 2
  15289.      <programmer>, <verb-loc>, <verb-name>, <line>, <this>}
  15290. 2
  15291.  
  15292. 2
  15293. where <task-id> is a numeric identifier for this queued task,
  15294. 2
  15295. <start-time> is the time after which this task will begin execution (in
  15296. 2
  15297. `time()' format), <ticks> is the number of ticks this task will have
  15298. 2
  15299. when it starts (always 20,000 now), <clock-id> is a number whose value is
  15300. 2
  15301. no longer interesting, <programmer> is the permissions with which this task
  15302. 2
  15303. will begin execution (and also the player who "owns" this task),
  15304. 2
  15305. <verb-loc> is the object on which the verb that forked this task was
  15306. 2
  15307. defined at the time, <verb-name> is that name of that verb, <line> is
  15308. 2
  15309. the number of the first line of the code in that verb that this task will
  15310. 2
  15311. execute, and <this> is the value of the variable `this' in that verb.
  15312. 2
  15313. For reading tasks, <start-time> is `-1'.
  15314. 2
  15315.  
  15316. 2
  15317. The <ticks> and <clock-id> fields are now obsolete and are retained
  15318. 2
  15319. only for backward-compatibility reasons.  They may disappear in a future
  15320. 2
  15321. version of the server.
  15322. 38
  15323. 5
  15324. 4
  15325. 46
  15326. 2
  15327. Syntax:  read ([obj <player>])   => str
  15328. 2
  15329.  
  15330. 2
  15331. This function suspends the current task, waiting for a line of input from the
  15332. 2
  15333. given <player> (which defaults to the player that typed the command that
  15334. 2
  15335. initiated the current task), and resumes when such a line is received,
  15336. 2
  15337. returning that line as a string.  Upon resumption, the task is given a full
  15338. 2
  15339. quota of ticks and seconds.  `Read()' may only be called by a wizard, and,
  15340. 2
  15341. unless <player> is given explicitly, only in a command task that has never
  15342. 2
  15343. been suspended by a call to `suspend()'.  Otherwise, `E_PERM' is
  15344. 2
  15345. returned.  If the given `player' is not currently connected and has no
  15346. 2
  15347. pending lines of input, `read()' returns `E_INVARG'.
  15348. 2
  15349.  
  15350. 2
  15351. These restrictions on the use of `read()' without an explicit argument
  15352. 2
  15353. preserve the following simple invariant: if input is being read from a player,
  15354. 2
  15355. it is for the task started by the last command that player typed.  This
  15356. 2
  15357. invariant adds responsibility to the programmer, however.  If your program
  15358. 2
  15359. calls another verb before doing a `read()', then that verb must also not
  15360. 2
  15361. suspend.  As an example, consider the following, which refers to the verbs
  15362. 2
  15363. programmed in the `suspend()' example in `help suspend()':
  15364. 2
  15365.  
  15366. 2
  15367.     .program   #0:read_twice_A
  15368. 2
  15369.     s = read();        /* success depends on programmer's permissions */
  15370. 2
  15371.     #0:callee_A();     /* callee_A does not suspend */
  15372. 2
  15373.     t = read();        /* success depends on programmer's permissions */
  15374. 2
  15375.     .
  15376. 2
  15377.  
  15378. 2
  15379.     .program   #0:read_twice_B
  15380. 2
  15381.     s = read();        /* success depends on programmer's permissions */
  15382. 2
  15383.     #0:callee_B();     /* callee_B does suspend */
  15384. 2
  15385.     t = read();        /* fails, returning E_PERM */
  15386. 2
  15387.     .
  15388. 2
  15389.  
  15390. 2
  15391. In three of the four calls to `read()', success depends on on the
  15392. 2
  15393. programmer's permissions.  However, the second `read()' in
  15394. 2
  15395. `#0:read_twice_B' always fails and returns `E_PERM'.  This is because
  15396. 2
  15397. the task was suspended, even though `#0:read_twice_B' did not do the
  15398. 2
  15399. actual suspending.  Hence, if you want to read some input (by using
  15400. 2
  15401. `read()' directly or by calling other verbs which do the reading), you
  15402. 2
  15403. must make sure that the task is not suspended before the reading.  This
  15404. 2
  15405. includes making sure that any verbs you call, directly or indirectly, also do
  15406. 2
  15407. not suspend.
  15408. 2
  15409.  
  15410. 2
  15411. It is possible to call `read()' many times in the same command task, so
  15412. 2
  15413. long as the task does not call `suspend()' or an explicit argument is
  15414. 2
  15415. given.  The best use for `read()' with an explicit argument is in
  15416. 2
  15417. conjunction with `open_network_connection()', if it is enabled.
  15418. 38
  15419. 5
  15420. 4
  15421. 61
  15422. 2
  15423. Syntax:  suspend (num <seconds>)   => none
  15424. 2
  15425.  
  15426. 2
  15427. Suspends the current task, and resumes it after at least <seconds> seconds.
  15428. 2
  15429. When the task is resumed, it will have a full quota of ticks and seconds.  This
  15430. 2
  15431. function is useful for programs that run for a long time or require a lot of
  15432. 2
  15433. ticks.  If <seconds> is negative, then `E_INVARG' is returned.
  15434. 2
  15435.  
  15436. 2
  15437. In some sense, this function forks the `rest' of the executing task.  However,
  15438. 2
  15439. there is a major difference between the use of `suspend(<seconds>)'
  15440. 2
  15441. and the use of the `fork (<seconds>)'.  The `fork' statement
  15442. 2
  15443. creates a new task (a "forked task") while the currently-running task still
  15444. 2
  15445. goes on to completion, but a `suspend()' suspends the currently-running
  15446. 2
  15447. task (thus making it into a "suspended task").  This difference may be best
  15448. 2
  15449. explained by the following examples, in which one verb calls another:
  15450. 2
  15451.  
  15452. 2
  15453.     .program   #0:caller_A
  15454. 2
  15455.     #0.prop = 1;
  15456. 2
  15457.     #0:callee_A();
  15458. 2
  15459.     #0.prop = 2;
  15460. 2
  15461.     .
  15462. 2
  15463.  
  15464. 2
  15465.     .program   #0:callee_A
  15466. 2
  15467.     fork(5)
  15468. 2
  15469.       #0.prop = 3;
  15470. 2
  15471.     endfork
  15472. 2
  15473.     .
  15474. 2
  15475.  
  15476. 2
  15477.     .program   #0:caller_B
  15478. 2
  15479.     #0.prop = 1;
  15480. 2
  15481.     #0:callee_B();
  15482. 2
  15483.     #0.prop = 2;
  15484. 2
  15485.     .
  15486. 2
  15487.  
  15488. 2
  15489.     .program   #0:callee_B
  15490. 2
  15491.     suspend(5);
  15492. 2
  15493.     #0.prop = 3;
  15494. 2
  15495.     .
  15496. 2
  15497.  
  15498. 2
  15499. Consider `#0:caller_A', which calls `#0:callee_A'.  Such a task would
  15500. 2
  15501. assign 1 to `#0.prop', call `#0:callee_A', fork a new task, return to
  15502. 2
  15503. `#0:caller_A', and assign 2 to `#0.prop', ending this task.  Five
  15504. 2
  15505. seconds later, if the forked task had not been killed, then it would begin to
  15506. 2
  15507. run; it would assign 3 to `#0.prop' and then stop.  So, the final value of
  15508. 2
  15509. `#0.prop' (i.e., the value after more than 5 seconds) would be 3.
  15510. 2
  15511.  
  15512. 2
  15513. Now consider `#0:caller_B', which calls `#0:callee_B' instead of
  15514. 2
  15515. `#0:callee_A'.  This task would assign 1 to `#0.prop', call
  15516. 2
  15517. `#0:callee_B', and suspend.  Five seconds later, if the suspended task had
  15518. 2
  15519. not been killed, then it would resume; it would assign 3 to `#0.prop',
  15520. 2
  15521. return to `#0:caller', and assign 2 to `#0.prop', ending the task.
  15522. 2
  15523. So, the final value of `#0.prop' (i.e., the value after more than 5
  15524. 2
  15525. seconds) would be 2.
  15526. 2
  15527.  
  15528. 2
  15529. A suspended task, like a forked task, can be described by the
  15530. 2
  15531. `queued_tasks()' function and killed by the `kill_task()' function.
  15532. 2
  15533. Suspending a task does not change its task id.  A task can be suspended again
  15534. 2
  15535. and again by successive calls to `suspend()'.
  15536. 2
  15537.  
  15538. 2
  15539. Once `suspend()' has been used in a particular task, then the
  15540. 2
  15541. `read()' function will always return `E_PERM' in that task.  For more
  15542. 2
  15543. details, see the description of `read()' below.
  15544. 38
  15545. 5
  15546. 4
  15547. 5
  15548. 2
  15549. Syntax:  task_id ()   => num
  15550. 2
  15551.  
  15552. 2
  15553. Returns the numeric identifier for the currently-executing task.  Such numbers
  15554. 2
  15555. are randomly selected for each task and can therefore safely be used in
  15556. 2
  15557. circumstances where unpredictability is required.
  15558. 38
  15559. 5
  15560. 4
  15561. 2
  15562. 2
  15563. *forward*
  15564. 2
  15565. ticks_left()
  15566. 38
  15567. 5
  15568. 4
  15569. 7
  15570. 2
  15571. Syntax:  ticks_left ()   => num
  15572. 2
  15573.        seconds_left ()   => num
  15574. 2
  15575.  
  15576. 2
  15577. These two functions return the number of ticks or seconds (respectively) left
  15578. 2
  15579. to the current task before it will be forcibly terminated.  These are useful,
  15580. 2
  15581. for example, in deciding when to fork another task to continue a long-lived
  15582. 2
  15583. computation.
  15584. 38
  15585. 5
  15586. 4
  15587. 6
  15588. 2
  15589. Syntax:  caller_perms ()   => obj
  15590. 2
  15591.  
  15592. 2
  15593. Returns the permissions in use by the verb that called the currently-executing
  15594. 2
  15595. verb.  If the currently-executing verb was not called by another verb (i.e., it
  15596. 2
  15597. is the first verb called in a command or server task), then
  15598. 2
  15599. `caller_perms()' returns `#-1'.
  15600. 38
  15601. 5
  15602. 4
  15603. 10
  15604. 2
  15605. Syntax:  set_task_perms (obj <player>)   => none
  15606. 2
  15607.  
  15608. 2
  15609. Changes the permissions with which the currently-executing verb is running to
  15610. 2
  15611. be those of <player>.  If <player> is not a valid player object, then
  15612. 2
  15613. `E_INVARG' is returned.  If the programmer is neither <player> nor a
  15614. 2
  15615. wizard, then `E_PERM' is returned.
  15616. 2
  15617.  
  15618. 2
  15619. Note: This does not change the owner of the currently-running verb, only the
  15620. 2
  15621. permissions of this particular invocation.  It is used in verbs owned by
  15622. 2
  15623. wizards to make themselves run with lesser (usually non-wizard) permissions.
  15624. 38
  15625. 5
  15626. 4
  15627. 32
  15628. 2
  15629. Syntax:  eval (str <string>)   => list
  15630. 2
  15631.  
  15632. 2
  15633. The MOO-code compiler processes <string> as if it were to be the program
  15634. 2
  15635. associated with some verb and, if no errors are found, that fictional verb is
  15636. 2
  15637. invoked.  If the programmer is not, in fact, a programmer, then `E_PERM'
  15638. 2
  15639. is returned.  The normal result of calling `eval()' is a two element list.
  15640. 2
  15641. The first element is true if there were no compilation errors and false
  15642. 2
  15643. otherwise.  The second element is either the result returned from the fictional
  15644. 2
  15645. verb (if there were no compilation errors) or a list of the compiler's error
  15646. 2
  15647. messages (otherwise).
  15648. 2
  15649.  
  15650. 2
  15651. When the fictional verb is invoked, the various built-in variables have values
  15652. 2
  15653. as shown below:
  15654. 2
  15655.  
  15656. 2
  15657.     player    the same as in the calling verb
  15658. 2
  15659.     this      #-1
  15660. 2
  15661.     caller    the same as the initial value of `this' in the calling verb
  15662. 2
  15663.  
  15664. 2
  15665.     args      {}
  15666. 2
  15667.     argstr    ""
  15668. 2
  15669.  
  15670. 2
  15671.     verb      ""
  15672. 2
  15673.     dobjstr   ""
  15674. 2
  15675.     dobj      #-1
  15676. 2
  15677.     prepstr   ""
  15678. 2
  15679.     iobjstr   ""
  15680. 2
  15681.     iobj      #-1
  15682. 2
  15683.  
  15684. 2
  15685. The fictional verb runs with the permissions of the programmer and as if its
  15686. 2
  15687. `d' permissions bit were on.
  15688. 2
  15689.  
  15690. 2
  15691.     eval("return 3 + 4;")   =>   {1, 7}
  15692. 38
  15693. 5
  15694. 4
  15695. 15
  15696. 2
  15697. Syntax:  boot_player (obj <player>)   => none
  15698. 2
  15699.  
  15700. 2
  15701. Immediately terminates any currently-active connection to the given
  15702. 2
  15703. <player>.  If the programmer is not either a wizard or the same as
  15704. 2
  15705. <player>, then `E_PERM' is returned.  If there is no currently-active
  15706. 2
  15707. connection to <player>, then this function does nothing.
  15708. 2
  15709.  
  15710. 2
  15711. If there was a currently-active connection, then the following two verb calls
  15712. 2
  15713. are made before the connection is closed:
  15714. 2
  15715.  
  15716. 2
  15717.     <player>:disfunc()
  15718. 2
  15719.     <player>.location:disfunc(<player>)
  15720. 2
  15721.  
  15722. 2
  15723. It is not an error if either of these verbs do not exist; the corresponding
  15724. 2
  15725. call is simply skipped.
  15726. 38
  15727. 5
  15728. 4
  15729. 6
  15730. 2
  15731. Syntax:  notify (obj <player>, str <string>)   => none
  15732. 2
  15733.  
  15734. 2
  15735. Outputs <string> (on a line by itself) to the user connected to the given
  15736. 2
  15737. <player>.  If the programmer is not <player> or a wizard, then
  15738. 2
  15739. `E_PERM' is returned.  If there is no currently-active connection to
  15740. 2
  15741. <player>, then this function does nothing.
  15742. 38
  15743. 5
  15744. 4
  15745. 2
  15746. 2
  15747. *forward*
  15748. 2
  15749. connected_seconds()
  15750. 38
  15751. 5
  15752. 4
  15753. 7
  15754. 2
  15755. Syntax:  connected_seconds (obj <player>)   => num
  15756. 2
  15757.               idle_seconds (obj <player>)   => num
  15758. 2
  15759.  
  15760. 2
  15761. These functions return the number of seconds that the currently-active
  15762. 2
  15763. connection to <player> has existed and been idle, respectively.  If
  15764. 2
  15765. <player> is not the object number of a player object with a
  15766. 2
  15767. currently-active connection, then `E_INVARG' is returned.
  15768. 38
  15769. 5
  15770. 4
  15771. 4
  15772. 2
  15773. Syntax:  connected_players ()   => list
  15774. 2
  15775.  
  15776. 2
  15777. Returns a list of the object numbers of those player objects with
  15778. 2
  15779. currently-active connections.
  15780. 38
  15781. 5
  15782. 4
  15783. 20
  15784. 2
  15785. Syntax:  set_player_flag (obj <object>, <value>)   => none
  15786. 2
  15787.  
  15788. 2
  15789. Confers or removes the ``player object'' status of the given <object>,
  15790. 2
  15791. depending upon the truth value of <value>.  If <object> is not valid,
  15792. 2
  15793. `E_INVARG' is returned.  If the programmer is not a wizard, then
  15794. 2
  15795. `E_PERM' is returned.
  15796. 2
  15797.  
  15798. 2
  15799. If <value> is true, then <object> gains (or keeps) ``player object''
  15800. 2
  15801. status: it will be an element of the list returned by `players()', the
  15802. 2
  15803. expression `is_player(<object>)' will return true, and users can
  15804. 2
  15805. connect to <object> by name when they log into the server.
  15806. 2
  15807.  
  15808. 2
  15809. If <value> is false, the <object> loses (or continues to lack) ``player
  15810. 2
  15811. object'' status: it will not be an element of the list returned by
  15812. 2
  15813. `players()', the expression `is_player(<object>)' will return
  15814. 2
  15815. false, and users cannot connect to <object> by name when they log into the
  15816. 2
  15817. server.  In addition, if a user is connected to <object> at the time that
  15818. 2
  15819. it loses ``player object'' status, then that connection is immediately broken,
  15820. 2
  15821. just as if `boot_player(<object>)' had been called (see the
  15822. 2
  15823. description of `boot_player()' below).
  15824. 38
  15825. 5
  15826. 4
  15827. 4
  15828. 2
  15829. Syntax:  is_player (obj <object>)   => num
  15830. 2
  15831.  
  15832. 2
  15833. Returns a true value if the given <object> is a player object and a false
  15834. 2
  15835. value otherwise.  If <object> is not valid, `E_INVARG' is returned.
  15836. 38
  15837. 5
  15838. 4
  15839. 3
  15840. 2
  15841. Syntax:  players ()   => list
  15842. 2
  15843.  
  15844. 2
  15845. Returns a list of the object numbers of all player objects in the database.
  15846. 38
  15847. 5
  15848. 4
  15849. 2
  15850. 2
  15851. *forward*
  15852. 2
  15853. verb_code()
  15854. 38
  15855. 5
  15856. 4
  15857. 25
  15858. 2
  15859. Syntax:  verb_code (obj <object>, str <verb-name> [, <fully-paren> [, <indent>]])   => list
  15860. 2
  15861.      set_verb_code (obj <object>, str <verb-name>, list <code>)   => list
  15862. 2
  15863.  
  15864. 2
  15865. These functions get and set (respectively) the MOO-code program associated with
  15866. 2
  15867. the verb named <verb-name> on <object>.  The program is represented as
  15868. 2
  15869. a list of strings, one for each line of the program; this is the kind of value
  15870. 2
  15871. returned by `verb_code()' and expected as the third argument to
  15872. 2
  15873. `set_verb_code()'.  For `verb_code()', the expressions in the
  15874. 2
  15875. returned code are usually written with the minimum-necessary parenthesization;
  15876. 2
  15877. if <full-paren> is true, then all expressions are fully parenthesized.
  15878. 2
  15879. Also for `verb_code()', the lines in the returned code are usually not
  15880. 2
  15881. indented at all; if <indent> is true, each line is indented to better show
  15882. 2
  15883. the nesting of statements.
  15884. 2
  15885.  
  15886. 2
  15887. If <object> is not valid, then `E_INVARG' is returned.  If
  15888. 2
  15889. <object> does not define a verb named <verb-name>, then `E_VERBNF'
  15890. 2
  15891. is returned.  If the programmer does not have read (write) permission on the
  15892. 2
  15893. verb in question, then `verb_code()' (`set_verb_code()') returns
  15894. 2
  15895. `E_PERM'.  If the programmer is not, in fact, a programmer, then
  15896. 2
  15897. `E_PERM' is returned.
  15898. 2
  15899.  
  15900. 2
  15901. For `set_verb_code()', the result is a list of strings, the error messages
  15902. 2
  15903. generated by the MOO-code compiler during processing of <code>.  If the
  15904. 2
  15905. list is non-empty, then `set_verb_code()' did not install <code>; the
  15906. 2
  15907. program associated with the verb in question is unchanged.
  15908. 38
  15909. 5
  15910. 4
  15911. 7
  15912. 2
  15913. Syntax:  delete_verb (obj <object>, str <verb-name>)   => none
  15914. 2
  15915.  
  15916. 2
  15917. Removes the verb named <verb-name> from the given <object>.  If
  15918. 2
  15919. <object> is not valid, then `E_INVARG' is returned.  If the programmer
  15920. 2
  15921. does not have write permission on <object>, then `E_PERM' is returned.
  15922. 2
  15923. If <object> does not define a verb named <verb-name>, then
  15924. 2
  15925. `E_VERBNF' is returned.
  15926. 38
  15927. 5
  15928. 4
  15929. 14
  15930. 2
  15931. Syntax:  add_verb (obj <object>, list <info>, list <args>)   => none
  15932. 2
  15933.  
  15934. 2
  15935. Defines a new verb on the given <object>.  The new verb's owner, permission
  15936. 2
  15937. bits and name(s) are given by <info> in the same format as is returned by
  15938. 2
  15939. `verb_info()'.  The new verb's direct-object, preposition, and indirect-object
  15940. 2
  15941. specifications are given by <args> in the same format as is returned by
  15942. 2
  15943. `verb_args()'.  The new verb initially has the empty program associated with 
  15944. 2
  15945. it; this program does nothing but return an unspecified value.
  15946. 2
  15947.  
  15948. 2
  15949. If <object> is not valid, or <info> does not specify a legitimate owner
  15950. 2
  15951. and permission bits, or <args> is not a legitimate syntax specification,
  15952. 2
  15953. then `E_INVARG' is retuned.  If the programmer does not have write
  15954. 2
  15955. permission on <object> or if the owner specified by <info> is not the
  15956. 2
  15957. programmer and the programmer is not a wizard, then `E_PERM' is returned.
  15958. 38
  15959. 5
  15960. 4
  15961. 2
  15962. 2
  15963. *forward*
  15964. 2
  15965. verb_args()
  15966. 38
  15967. 5
  15968. 4
  15969. 12
  15970. 2
  15971. Syntax:  verb_args (obj <object>, str <verb-name>)   => list
  15972. 2
  15973.      set_verb_args (obj <object>, str <verb-name>, list <args>)   => none
  15974. 2
  15975.  
  15976. 2
  15977. These two functions get and set (respectively) the direct-object, preposition, and indirect-object specifications for the verb named <verb-name> on the given <object>.  If <object> is not valid, then `E_INVARG' is returned.  If <object> does not define a verb named <verb-name>, then `E_VERBNF' is returned.  If the programmer does not have read (write) permission on the verb in question, then `verb_args()' (`set_verb_args()') returns `E_PERM'.  Verb args specifications have the following form:
  15978. 2
  15979.  
  15980. 2
  15981.     {<dobj>, <prep>, <iobj>}
  15982. 2
  15983.  
  15984. 2
  15985. where <dobj> and <iobj> are strings drawn from the set `"this"', `"none"', and `"any"', and <prep> is a string that is either `"none"', `"any"', or one of the prepositional phrases listed much earlier in the description of verbs in the first chapter.  This is the kind of value returned by `verb_info()' and expected as the third argument to `set_verb_info()'.  Note that for `set_verb_args()', <prep> must be only one of the prepositional phrases, not (as is shown in that table) a set of such phrases separated by `/' characters.  `Set_verb_args()' returns `E_INVARG' if any of the <dobj>, <prep>, or <iobj> strings is illegal.
  15986. 2
  15987.  
  15988. 2
  15989.     verb_args($container, "take")
  15990. 2
  15991.                         =>   {"any", "out of/from inside/from", "this"}
  15992. 2
  15993.     set_verb_args($container, "take", {"any", "from", "this"})
  15994. 38
  15995. 5
  15996. 4
  15997. 2
  15998. 2
  15999. *forward*
  16000. 2
  16001. verb_info()
  16002. 38
  16003. 5
  16004. 4
  16005. 19
  16006. 2
  16007. Syntax:  verb_info (obj <object>, str <verb-name>)   => list
  16008. 2
  16009.      set_verb_info (obj <object>, str <verb-name>, list <info>)   => none
  16010. 2
  16011.  
  16012. 2
  16013. These two functions get and set (respectively) the owner, permission bits, and
  16014. 2
  16015. name(s) for the verb named <verb-name> on the given <object>.  If
  16016. 2
  16017. <object> is not valid, then `E_INVARG' is returned.  If <object>
  16018. 2
  16019. does not define a verb named <verb-name>, then `E_VERBNF' is returned.
  16020. 2
  16021. If the programmer does not have read (write) permission on the verb in
  16022. 2
  16023. question, then `verb_info()' (`set_verb_info()') returns
  16024. 2
  16025. `E_PERM'.  Verb info has the following form:
  16026. 2
  16027.  
  16028. 2
  16029.     {<owner>, <perms>, <names>}
  16030. 2
  16031.  
  16032. 2
  16033. where <owner> is an object, <perms> is a string containing only
  16034. 2
  16035. characters from the set `r', `w', `x', and `d', and
  16036. 2
  16037. <names> is a string.  This is the kind of value returned by
  16038. 2
  16039. `verb_info()' and expected as the third argument to
  16040. 2
  16041. `set_verb_info()'; the latter function returns `E_INVARG' if
  16042. 2
  16043. <owner> is not valid or <perms> contains any illegal characters.
  16044. 38
  16045. 5
  16046. 4
  16047. 6
  16048. 2
  16049. Syntax:  verbs (obj <object>)   => list
  16050. 2
  16051.  
  16052. 2
  16053. Returns a list of the names of the verbs defined directly on the given
  16054. 2
  16055. <object>, not inherited from its parent.  If <object> is not valid,
  16056. 2
  16057. then `E_INVARG' is returned.  If the programmer does not have read
  16058. 2
  16059. permission on <object>, then `E_PERM' is returned.
  16060. 38
  16061. 5
  16062. 4
  16063. 8
  16064. 2
  16065. Syntax:  delete_property (obj <object>, str <prop-name>)   => none
  16066. 2
  16067.  
  16068. 2
  16069. Removes the property named <prop-name> from the given <object> and all
  16070. 2
  16071. of its descendants.  If <object> is not valid, then `E_INVARG' is
  16072. 2
  16073. returned.  If the programmer does not have write permission on <object>,
  16074. 2
  16075. then `E_PERM' is returned.  If <object> does not directly define a
  16076. 2
  16077. property named <prop-name> (as opposed to inheriting one from its parent),
  16078. 2
  16079. then `E_PROPNF' is returned.
  16080. 38
  16081. 5
  16082. 4
  16083. 12
  16084. 2
  16085. Syntax:  add_property (obj <object>, str <prop-name>, <value>, list <info>)   => none
  16086. 2
  16087.  
  16088. 2
  16089. Defines a new property on the given <object>, inherited by all of its
  16090. 2
  16091. descendants; the property is named <prop-name>, its initial value is
  16092. 2
  16093. <value>, and its owner and initial permission bits are given by <info>
  16094. 2
  16095. in the same format as is returned by `property_info()'.
  16096. 2
  16097. If <object> is not valid or <object> already has a property named
  16098. 2
  16099. <prop-name> or <info> does not specify a legitimate owner and
  16100. 2
  16101. permission bits, then `E_INVARG' is retuned.  If the programmer does not
  16102. 2
  16103. have write permission on <object> or if the owner specified by <info>
  16104. 2
  16105. is not the programmer and the programmer is not a wizard, then `E_PERM' is
  16106. 2
  16107. returned.
  16108. 38
  16109. 5
  16110. 4
  16111. 2
  16112. 2
  16113. *forward*
  16114. 2
  16115. property_info()
  16116. 38
  16117. 5
  16118. 4
  16119. 18
  16120. 2
  16121. Syntax:  property_info (obj <object>, str <prop-name>)   => list
  16122. 2
  16123.      set_property_info (obj <object>, str <prop-name>, list <info>)   => none
  16124. 2
  16125.  
  16126. 2
  16127. These two functions get and set (respectively) the owner and permission bits
  16128. 2
  16129. for the property named <prop-name> on the given <object>.  If
  16130. 2
  16131. <object> is not valid, then `E_INVARG' is returned.  If <object>
  16132. 2
  16133. has no non-built-in property named <prop-name>, then `E_PROPNF' is
  16134. 2
  16135. returned.  If the programmer does not have read (write) permission on the
  16136. 2
  16137. property in question, then `property_info()' (`set_property_info()')
  16138. 2
  16139. returns `E_PERM'.  Property info has the following form:
  16140. 2
  16141.  
  16142. 2
  16143.     {<owner>, <perms>}
  16144. 2
  16145.  
  16146. 2
  16147. where <owner> is an object and <perms> is a string containing only
  16148. 2
  16149. characters from the set `r', `w', and `c'.  This is the kind of
  16150. 2
  16151. value returned by `property_info()' and expected as the third argument to
  16152. 2
  16153. `set_property_info()'; the latter function returns `E_INVARG' if
  16154. 2
  16155. <owner> is not valid or <perms> contains any illegal characters.
  16156. 38
  16157. 5
  16158. 4
  16159. 6
  16160. 2
  16161. Syntax:  properties (obj <object>)   => list
  16162. 2
  16163.  
  16164. 2
  16165. Returns a list of the names of the properties defined directly on the given
  16166. 2
  16167. <object>, not inherited from its parent.  If <object> is not valid,
  16168. 2
  16169. then `E_INVARG' is returned.  If the programmer does not have read
  16170. 2
  16171. permission on <object>, then `E_PERM' is returned.
  16172. 38
  16173. 5
  16174. 4
  16175. 41
  16176. 2
  16177. Syntax:  move (obj <what>, obj <where>)   => none
  16178. 2
  16179.  
  16180. 2
  16181. Changes <what>'s location to be <where>.  This is a complex process
  16182. 2
  16183. because a number of permissions checks and notifications must be performed.
  16184. 2
  16185. The actual movement takes place as described in the following paragraphs.
  16186. 2
  16187.  
  16188. 2
  16189. <what> should be a valid object and <where> should be either a valid
  16190. 2
  16191. object or `#-1' (denoting a location of 'nowhere'); otherwise
  16192. 2
  16193. `E_INVARG' is returned.  The programmer must be either the owner of
  16194. 2
  16195. <what> or a wizard; otherwise, `E_PERM' is returned.
  16196. 2
  16197.  
  16198. 2
  16199. If <where> is a valid object, then the verb-call
  16200. 2
  16201.  
  16202. 2
  16203.     <where>:accept(<what>)
  16204. 2
  16205.  
  16206. 2
  16207. is performed before any movement takes place.  If the verb returns a
  16208. 2
  16209. false value and the programmer is not a wizard, then <where> is
  16210. 2
  16211. considered to have refused entrance to <what>; `move()' returns
  16212. 2
  16213. `E_NACC'.  If <where> does not define an `accept' verb, then it
  16214. 2
  16215. is treated as if it defined one that always returned false.
  16216. 2
  16217.  
  16218. 2
  16219. If moving <what> into <where> would create a loop in the containment
  16220. 2
  16221. hierarchy (i.e., <what> would contain itself, even indirectly), then
  16222. 2
  16223. `E_RECMOVE' is returned instead.
  16224. 2
  16225.  
  16226. 2
  16227. The `location' property of <what> is changed to be <where>, and
  16228. 2
  16229. the `contents' properties of the old and new locations are modified
  16230. 2
  16231. appropriately.  Let <old-where> be the location of <what> before it was
  16232. 2
  16233. moved.  If <old-where> is a valid object, then the verb-call
  16234. 2
  16235.  
  16236. 2
  16237.     <old-where>:exitfunc(<what>)
  16238. 2
  16239.  
  16240. 2
  16241. is performed and its result is ignored; it is not an error if <old-where>
  16242. 2
  16243. does not define a verb named `exitfunc'.  Finally, if <where> and
  16244. 2
  16245. <what> are still valid objects, and <where> is still the location of
  16246. 2
  16247. <what>, then the verb-call
  16248. 2
  16249.  
  16250. 2
  16251.     <where>:enterfunc(<what>)
  16252. 2
  16253.  
  16254. 2
  16255. is performed and its result is ignored; again, it is not an error if
  16256. 2
  16257. <where> does not define a verb named `enterfunc'.
  16258. 38
  16259. 5
  16260. 4
  16261. 6
  16262. 2
  16263. Syntax:  max_object ()   => obj
  16264. 2
  16265.  
  16266. 2
  16267. Returns the largest object number yet assigned to a created object.  Note that
  16268. 2
  16269. the object with this number may no longer exist; it may have been recycled.
  16270. 2
  16271. The next object created will be assigned the object number one larger than the
  16272. 2
  16273. value of `max_object()'.
  16274. 38
  16275. 5
  16276. 4
  16277. 14
  16278. 2
  16279. Syntax:  recycle (obj <object>)   => none
  16280. 2
  16281.  
  16282. 2
  16283. The given <object> is destroyed, irrevocably.  The programmer must either
  16284. 2
  16285. own <object> or be a wizard; otherwise, `E_PERM' is returned.  If
  16286. 2
  16287. <object> is not valid, then `E_INVARG' is returned.  The children of
  16288. 2
  16289. <object> are reparented to the parent of <object>.  Before <object>
  16290. 2
  16291. is recycled, each object in its contents is moved to `#-1' (implying a
  16292. 2
  16293. call to <object>'s `exitfunc' verb, if any) and then <object>'s
  16294. 2
  16295. `recycle' verb, if any, is called with no arguments.
  16296. 2
  16297.  
  16298. 2
  16299. After <object> is recycled, if the owner of the former object has a
  16300. 2
  16301. property named `ownership_quota' and the value of that property is a
  16302. 2
  16303. number, then `recycle()' treats that value as a "quota" and increments
  16304. 2
  16305. it by one, storing the result back into the `ownership_quota' property.
  16306. 38
  16307. 5
  16308. 4
  16309. 2
  16310. 2
  16311. *forward*
  16312. 2
  16313. parent()
  16314. 38
  16315. 5
  16316. 4
  16317. 5
  16318. 2
  16319. Syntax:  parent (obj <object>)   => obj
  16320. 2
  16321.        children (obj <object>)   => list
  16322. 2
  16323.  
  16324. 2
  16325. These functions return the parent and a list of the children of <object>,
  16326. 2
  16327. respectively.  If <object> is not valid, then `E_INVARG' is returned.
  16328. 38
  16329. 5
  16330. 4
  16331. 8
  16332. 2
  16333. Syntax:  valid (obj <object>)   => num
  16334. 2
  16335.  
  16336. 2
  16337. Returns a non-zero number (i.e., a true value) if <object> is a valid
  16338. 2
  16339. object (one that has been created and not yet recycled) and zero (i.e., a false
  16340. 2
  16341. value) otherwise.
  16342. 2
  16343.  
  16344. 2
  16345.     valid(#0)    =>   1
  16346. 2
  16347.     valid(#-1)   =>   0
  16348. 38
  16349. 5
  16350. 4
  16351. 27
  16352. 2
  16353. Syntax:  chparent (obj <object>, obj <new-parent>)   => none
  16354. 2
  16355.  
  16356. 2
  16357. Changes the parent of <object> to be <new-parent>.  If the programmer
  16358. 2
  16359. is neither a wizard or the owner of <object>, or if <new-parent> is not
  16360. 2
  16361. fertile (i.e., its `f' bit is not set) and the programmer is neither the
  16362. 2
  16363. owner of <new-parent> nor a wizard, then `E_PERM' is returned.  If
  16364. 2
  16365. <object> is not valid or if <object> or one of its descendants defines
  16366. 2
  16367. a property with the same name as one defined either on <new-parent> or on
  16368. 2
  16369. one of its ancestors, then `E_INVARG' is returned.
  16370. 2
  16371.  
  16372. 2
  16373. Changing an object's parent can have the effect of removing some properties
  16374. 2
  16375. from and adding some other properties to that object and all of its descendants
  16376. 2
  16377. (i.e., its children and its children's children, etc.).  Let <common> be
  16378. 2
  16379. the nearest ancestor that <object> and <new-parent> have in common
  16380. 2
  16381. before the parent of <object> is changed.  Then all properties defined by
  16382. 2
  16383. ancestors of <object> under <common> (that is, those ancestors of
  16384. 2
  16385. <object> that are in turn descendants of <common>) are removed from
  16386. 2
  16387. <object> and all of its descendants.  All properties defined by
  16388. 2
  16389. <new-parent> or its ancestors under <common> are added to <object>
  16390. 2
  16391. and all of its descendants.  As with `create()', the newly-added
  16392. 2
  16393. properties are given the same permission bits as they have on <new-parent>,
  16394. 2
  16395. the owner of each added property is either the owner of the object it's added
  16396. 2
  16397. to (if the `c' permissions bit is set) or the owner of that property on
  16398. 2
  16399. <new-parent>, and the value of each added property is "clear"; see the
  16400. 2
  16401. description of the built-in function `clear_property()' for details.  All
  16402. 2
  16403. properties that are not removed or added in the reparenting process are 
  16404. 2
  16405. completely unchanged.
  16406. 38
  16407. 5
  16408. 4
  16409. 45
  16410. 2
  16411. Syntax:  create (obj <parent> [, obj <owner>])   => obj
  16412. 2
  16413.  
  16414. 2
  16415. Creates and returns a new object whose parent is <parent> and whose owner
  16416. 2
  16417. is as described below.  Either the given <parent> object must be fertile
  16418. 2
  16419. (i.e., its `f' bit must be set) or else the programmer must own
  16420. 2
  16421. <parent> or be a wizard; otherwise `E_PERM' is returned.
  16422. 2
  16423. `E_PERM' is also returned if <owner> is provided and not the same as 
  16424. 2
  16425. the programmer, unless the programmer is a wizard.  After the new object is
  16426. 2
  16427. created, its `initialize' verb, if any, is called with no arguments.
  16428. 2
  16429.  
  16430. 2
  16431. The new object is assigned the least non-negative object number that has not
  16432. 2
  16433. yet been used for a created object.  Note that no object number is ever reused,
  16434. 2
  16435. even if the object with that number is recycled.
  16436. 2
  16437.  
  16438. 2
  16439. The owner of the new object is either the programmer (if <owner> is not
  16440. 2
  16441. provided), the new object itself (if <owner> was given as `#-1'), or
  16442. 2
  16443. <owner> (otherwise).
  16444. 2
  16445.  
  16446. 2
  16447. The other built-in properties of the new object are initialized as follows:
  16448. 2
  16449.     name         ""
  16450. 2
  16451.     location     #-1
  16452. 2
  16453.     contents     {}
  16454. 2
  16455.     programmer   0
  16456. 2
  16457.     wizard       0
  16458. 2
  16459.     r            0
  16460. 2
  16461.     w            0
  16462. 2
  16463.     f            0
  16464. 2
  16465.  
  16466. 2
  16467. In addition, the new object inherits all of the other properties on
  16468. 2
  16469. <parent>.  These properties have the same permission bits as on
  16470. 2
  16471. <parent>.  If the `c' permissions bit is set, then the owner of the
  16472. 2
  16473. property on the new object is the same as the owner of the new object itself;
  16474. 2
  16475. otherwise, the owner of the property on the new object is the same as that on
  16476. 2
  16477. <parent>.  The initial value of every inherited property is "clear";
  16478. 2
  16479. see the description of the built-in function `clear_property()' for
  16480. 2
  16481. details.
  16482. 2
  16483.  
  16484. 2
  16485.  
  16486. 2
  16487. If the intended owner of the new object has a property named
  16488. 2
  16489. `ownership_quota' and the value of that property is a number, then
  16490. 2
  16491. `create()' treats that value as a "quota".  If the quota is less than
  16492. 2
  16493. or equal to zero, then the quota is considered to be exhausted and
  16494. 2
  16495. `create()' returns `E_QUOTA' instead of creating an object.
  16496. 2
  16497. Otherwise, the quota is decremented and stored back into the
  16498. 2
  16499. `ownership_quota' property as a part of the creation of the new object.
  16500. 38
  16501. 5
  16502. 4
  16503. 2
  16504. 2
  16505. *forward*
  16506. 2
  16507. setadd()
  16508. 38
  16509. 5
  16510. 4
  16511. 16
  16512. 2
  16513. Syntax:  setadd (list <list>, <value>)   => list
  16514. 2
  16515.       setremove (list <list>, <value>)   => list
  16516. 2
  16517.  
  16518. 2
  16519. Returns a copy of <list> with the given <value> added or removed, as
  16520. 2
  16521. appropriate.  `setadd()' only adds <value> if it is not already an
  16522. 2
  16523. element of <list>; <list> is thus treated as a mathematical set.
  16524. 2
  16525. <value> is added at the end of the resulting list, if at all.  Similarly,
  16526. 2
  16527. `setremove()' returns a list identical to <list> if <value> is not
  16528. 2
  16529. an element.  If <value> appears more than once in <list>, only the
  16530. 2
  16531. first occurrence is removed in the returned copy.
  16532. 2
  16533.  
  16534. 2
  16535.     setadd({1, 2, 3}, 3)         =>   {1, 2, 3}
  16536. 2
  16537.     setadd({1, 2, 3}, 4)         =>   {1, 2, 3, 4}
  16538. 2
  16539.     setremove({1, 2, 3}, 3)      =>   {1, 2}
  16540. 2
  16541.     setremove({1, 2, 3}, 4)      =>   {1, 2, 3}
  16542. 2
  16543.     setremove({1, 2, 3, 2}, 2)   =>   {1, 3, 2}
  16544. 38
  16545. 5
  16546. 4
  16547. 8
  16548. 2
  16549. Syntax:  listset (list <list>, <value>, num <index>)   => list
  16550. 2
  16551.  
  16552. 2
  16553. Returns a copy of <list> with the <index>th element replaced by
  16554. 2
  16555. <value>.  If <index> is not in the range
  16556. 2
  16557. `[1..length(<list>)]', then `E_RANGE' is returned.
  16558. 2
  16559.  
  16560. 2
  16561.     x = {"foo", "bar", "baz"};
  16562. 2
  16563.     listset(x, "mumble", 2)   =>   {"foo", "mumble", "baz"}
  16564. 38
  16565. 5
  16566. 4
  16567. 8
  16568. 2
  16569. Syntax:  listdelete (list <list>, num <index>)   => list
  16570. 2
  16571.  
  16572. 2
  16573. Returns a copy of <list> with the <index>th element removed.  If
  16574. 2
  16575. <index> is not in the range `[1..length(<list>)]', then
  16576. 2
  16577. `E_RANGE' is returned.
  16578. 2
  16579.  
  16580. 2
  16581.     x = {"foo", "bar", "baz"};
  16582. 2
  16583.     listdelete(x, 2)   =>   {"foo", "baz"}
  16584. 38
  16585. 5
  16586. 4
  16587. 27
  16588. 2
  16589. Syntax:  listinsert (list <list>, <value> [, num <index>])   => list
  16590. 2
  16591.          listappend (list <list>, <value> [, num <index>])   => list
  16592. 2
  16593.  
  16594. 2
  16595. These functions return a copy of <list> with <value> added as a new
  16596. 2
  16597. element.  `listinsert()' and `listappend()' add <value> before
  16598. 2
  16599. and after (respectively) the existing element with the given <index>, if
  16600. 2
  16601. provided.
  16602. 2
  16603.  
  16604. 2
  16605. The following three expressions always have the same value:
  16606. 2
  16607.  
  16608. 2
  16609.     listinsert(<list>, <element>, <index>)
  16610. 2
  16611.     listappend(<list>, <element>, <index> - 1)
  16612. 2
  16613.     {@<list>[1..<index> - 1], <element>, @<list>[<index>..length(<list>)]}
  16614. 2
  16615.  
  16616. 2
  16617. If <index> is not provided, then `listappend()' adds the <value>
  16618. 2
  16619. at the end of the list and `listinsert()' adds it at the beginning; this
  16620. 2
  16621. usage is discouraged, however, since the same intent can be more clearly
  16622. 2
  16623. expressed using the list-construction expression, as shown in the examples
  16624. 2
  16625. below.
  16626. 2
  16627.  
  16628. 2
  16629.     x = {1, 2, 3};
  16630. 2
  16631.     listappend(x, 4, 2)   =>   {1, 2, 4, 3}
  16632. 2
  16633.     listinsert(x, 4, 2)   =>   {1, 4, 2, 3}
  16634. 2
  16635.     listappend(x, 4)      =>   {1, 2, 3, 4}
  16636. 2
  16637.     listinsert(x, 4)      =>   {4, 1, 2, 3}
  16638. 2
  16639.     {@x, 4}               =>   {1, 2, 3, 4}
  16640. 2
  16641.     {4, @x}               =>   {4, 1, 2, 3}
  16642. 38
  16643. 5
  16644. 4
  16645. 2
  16646. 2
  16647. *forward*
  16648. 2
  16649. listinsert()
  16650. 38
  16651. 5
  16652. 4
  16653. 8
  16654. 2
  16655. Syntax:  strcmp (str <str1>, str <str2>)   => num
  16656. 2
  16657.  
  16658. 2
  16659. Performs a case-sensitive comparison of the two argument strings.  If
  16660. 2
  16661. <str1> is lexicographically less than <str2>, the
  16662. 2
  16663. `strcmp()' returns a negative number.  If the two strings are
  16664. 2
  16665. identical, `strcmp()' returns zero.  Otherwise, `strcmp()'
  16666. 2
  16667. returns a positive number.  The ASCII character ordering is used for the
  16668. 2
  16669. comparison.
  16670. 38
  16671. 5
  16672. 4
  16673. 2
  16674. 2
  16675. *forward*
  16676. 2
  16677. index()
  16678. 38
  16679. 5
  16680. 4
  16681. 15
  16682. 2
  16683. Syntax:  index (str <str1>, str <str2> [, <case-matters>])   => num
  16684. 2
  16685.         rindex (str <str1>, str <str2> [, <case-matters>])   => num
  16686. 2
  16687.  
  16688. 2
  16689. The function `index()' (`rindex()') returns the index of the first
  16690. 2
  16691. character of the first (last) occurrence of <str2> in <str1>, or zero
  16692. 2
  16693. if <str2> does not occur in <str1> at all.  By default the search for
  16694. 2
  16695. an occurrence of <str2> is done while ignoring the upper/lower case
  16696. 2
  16697. distinction.  If <case-matters> is provided and true, then case is treated
  16698. 2
  16699. as significant in all comparisons.
  16700. 2
  16701.  
  16702. 2
  16703.     index("foobar", "o")        =>   2
  16704. 2
  16705.     rindex("foobar", "o")       =>   3
  16706. 2
  16707.     index("foobar", "x")        =>   0
  16708. 2
  16709.     index("foobar", "oba")      =>   3
  16710. 2
  16711.     index("Foobar", "foo", 1)   =>   0
  16712. 38
  16713. 5
  16714. 4
  16715. 19
  16716. 2
  16717. Syntax:  crypt (str <text> [, str <salt>])   => str
  16718. 2
  16719.  
  16720. 2
  16721. Encrypts the given <text> using the standard UNIX encryption method.  If
  16722. 2
  16723. provided, <salt> should be a two-character string for use as the extra
  16724. 2
  16725. encryption ``salt'' in the algorithm.  If <salt> is not provided, a random
  16726. 2
  16727. pair of characters is used.  In any case, the salt used is also returned as the
  16728. 2
  16729. first two characters of the resulting encrypted string.
  16730. 2
  16731.  
  16732. 2
  16733. Aside from the possibly-random selection of the salt, the encryption algorithm
  16734. 2
  16735. is entirely deterministic.  In particular, you can test whether or not a given
  16736. 2
  16737. string is the same as the one used to produced a given piece of encrypted text;
  16738. 2
  16739. simply extract the first two characters of the encrypted text and pass the
  16740. 2
  16741. candidate string and those two characters to `crypt()'.  If the result is
  16742. 2
  16743. identical to the given encrypted text, then you've got a match.
  16744. 2
  16745.  
  16746. 2
  16747.     crypt("foobar")         =>   "J3fSFQfgkp26w"
  16748. 2
  16749.     crypt("foobar", "J3")   =>   "J3fSFQfgkp26w"
  16750. 2
  16751.     crypt("mumble", "J3")   =>   "J3D0.dh.jjmWQ"
  16752. 2
  16753.     crypt("foobar", "J4")   =>   "J4AcPxOJ4ncq2"
  16754. 38
  16755. 5
  16756. 4
  16757. 12
  16758. 2
  16759. Syntax:  strsub (str <subject>, str <what>, str <with> [, <case-matters>])   => str
  16760. 2
  16761.  
  16762. 2
  16763. Replaces all occurrences in <subject> of <what> with <with>,
  16764. 2
  16765. performing string substitution.  The occurrences are found from left to right
  16766. 2
  16767. and all substitutions happen simultaneously.  By default, occurrences of
  16768. 2
  16769. <what> are searched for while ignoring the upper/lower case distinction.
  16770. 2
  16771. If <case-matters> is provided and true, then case is treated as significant
  16772. 2
  16773. in all comparisons.
  16774. 2
  16775.  
  16776. 2
  16777.     strsub("%n is a fink.", "%n", "Fred")   =>   "Fred is a fink."
  16778. 2
  16779.     strsub("foobar", "OB", "b")             =>   "fobar"
  16780. 2
  16781.     strsub("foobar", "OB", "b", 1)          =>   "foobar"
  16782. 38
  16783. 5
  16784. 4
  16785. 8
  16786. 2
  16787. Syntax:  length (<list or string>)   => num
  16788. 2
  16789.  
  16790. 2
  16791. Returns the number of characters in <list or string>.  
  16792. 2
  16793.  
  16794. 2
  16795.     length("foo")       =>   3
  16796. 2
  16797.     length("")          =>   0
  16798. 2
  16799.     length({1, 2, 3})   =>   3
  16800. 2
  16801.     length({})          =>   0
  16802. 38
  16803. 5
  16804. 4
  16805. 17
  16806. 2
  16807. Syntax:  ctime ([num <time>])   => str
  16808. 2
  16809.  
  16810. 2
  16811. Interprets <time> as a time, using the same representation as given in the
  16812. 2
  16813. description of `time()', and converts it into a 28-character,
  16814. 2
  16815. human-readable string in the following format:
  16816. 2
  16817.  
  16818. 2
  16819.     Mon Aug 13 19:13:20 1990 PDT
  16820. 2
  16821.  
  16822. 2
  16823. If the current day of the month is less than 10, then an extra blank appears
  16824. 2
  16825. between the month and the day:
  16826. 2
  16827.  
  16828. 2
  16829.     Mon Apr  1 14:10:43 1991 PST
  16830. 2
  16831.  
  16832. 2
  16833. If <time> is not provided, then the current time is used.
  16834. 2
  16835.  
  16836. 2
  16837. Note that `ctime()' interprets <time> for the local time zone of the
  16838. 2
  16839. computer on which the MOO server is running.
  16840. 38
  16841. 5
  16842. 4
  16843. 4
  16844. 2
  16845. Syntax:  time ()   => num
  16846. 2
  16847.  
  16848. 2
  16849. Returns the current time, represented as the number of seconds that have
  16850. 2
  16851. elapsed since midnight on 1 January 1970, Greenwich Mean Time.
  16852. 38
  16853. 5
  16854. 4
  16855. 4
  16856. 2
  16857. Syntax:  random (num <mod>)   => num
  16858. 2
  16859.  
  16860. 2
  16861. <mod> must be a positive number; otherwise, `E_INVARG' is returned.  A
  16862. 2
  16863. number is chosen randomly from the range `[1..<mod>]' and returned.
  16864. 38
  16865. 5
  16866. 4
  16867. 4
  16868. 2
  16869. Syntax:  abs (num <x>)   => num
  16870. 2
  16871.  
  16872. 2
  16873. Returns the absolute value of <x>.  If <x> is negative, then the result
  16874. 2
  16875. is `-<x>'; otherwise, the result is <x>.
  16876. 38
  16877. 5
  16878. 4
  16879. 2
  16880. 2
  16881. *forward*
  16882. 2
  16883. min()
  16884. 38
  16885. 5
  16886. 4
  16887. 6
  16888. 2
  16889. Syntax:  min (num <x>, ...)   => num
  16890. 2
  16891.          max (num <x>, ...)   => num
  16892. 2
  16893.  
  16894. 2
  16895. These two functions return the smallest or largest of their arguments,
  16896. 2
  16897. respectively.  All of the arguments must be numbers; otherwise `E_TYPE' is
  16898. 2
  16899. returned.
  16900. 38
  16901. 5
  16902. 4
  16903. 10
  16904. 2
  16905. Syntax:  toobj (<value>)   => obj
  16906. 2
  16907.  
  16908. 2
  16909. Converts the given MOO value into an object number and returns that object
  16910. 2
  16911. number.  The conversions are very similar to those for `tonum()' except
  16912. 2
  16913. that for strings, the number *may* be preceded by `#'.
  16914. 2
  16915.  
  16916. 2
  16917.     toobj("34")       =>   #34
  16918. 2
  16919.     toobj("#34")      =>   #34
  16920. 2
  16921.     toobj("foo")      =>   #0
  16922. 2
  16923.     toobj({1, 2})     -error->   E_TYPE
  16924. 38
  16925. 5
  16926. 4
  16927. 14
  16928. 2
  16929. Syntax:  tonum (<value>)   => num
  16930. 2
  16931.  
  16932. 2
  16933. Converts the given MOO value into a number and returns that number.  Object
  16934. 2
  16935. numbers are converted into the equivalent numbers, strings are parsed as the
  16936. 2
  16937. decimal encoding of a number, and errors are converted into numbers obeying the
  16938. 2
  16939. same ordering (with respect to `<=' as the errors themselves.
  16940. 2
  16941. `tonum()' returns `E_TYPE' if <value> is a list.  If <value>
  16942. 2
  16943. is a string but the string does not contain a syntactically-correct number,
  16944. 2
  16945. then `tonum()' returns 0.
  16946. 2
  16947.  
  16948. 2
  16949.     tonum(#34)         =>   34
  16950. 2
  16951.     tonum("34")        =>   34
  16952. 2
  16953.     tonum(" - 34  ")   =>  -34
  16954. 2
  16955.     tonum(E_TYPE)      =>    1
  16956. 38
  16957. 5
  16958. 4
  16959. 15
  16960. 2
  16961. Syntax:  tostr (<value>, ...)   => str
  16962. 2
  16963.  
  16964. 2
  16965. Converts all of the given MOO values into strings and returns the concatenation
  16966. 2
  16967. of the results.
  16968. 2
  16969.  
  16970. 2
  16971.     tostr(17)                  =>   "17"
  16972. 2
  16973.     tostr(#17)                 =>   "#17"
  16974. 2
  16975.     tostr("foo")               =>   "foo"
  16976. 2
  16977.     tostr({1, 2})              =>   "{list}"
  16978. 2
  16979.     tostr(E_PERM)              =>   "Permission denied"
  16980. 2
  16981.     tostr("3 + 4 = ", 3 + 4)   =>   "3 + 4 = 7"
  16982. 2
  16983.  
  16984. 2
  16985. Note that `tostr()' does not do a good job of converting lists into
  16986. 2
  16987. strings; all lists, including the empty list, are converted into the string
  16988. 2
  16989. `"{list}"'.
  16990. 38
  16991. 5
  16992. 4
  16993. 14
  16994. 2
  16995. Syntax:  typeof (<value>)   => num
  16996. 2
  16997.  
  16998. 2
  16999. Takes any MOO value and returns a number representing the type of <value>.
  17000. 2
  17001. The result is the same as the initial value of one of these built-in variables:
  17002. 2
  17003. `NUM', `STR', `LIST', `OBJ', or `ERR'.  Thus, one
  17004. 2
  17005. usually writes code like this:
  17006. 2
  17007.  
  17008. 2
  17009.     if (typeof(x) == LIST) ...
  17010. 2
  17011.  
  17012. 2
  17013. and not like this:
  17014. 2
  17015.  
  17016. 2
  17017.     if (typeof(x) == 3) ...
  17018. 2
  17019.  
  17020. 2
  17021. because the former is much more readable than the latter.
  17022. 38
  17023. 5
  17024. 4
  17025. 15
  17026. 2
  17027. Syntax:  clear_property (obj <object>, str <prop-name>)  => none
  17028. 2
  17029.       is_clear_property (obj <object>, str <prop-name>)  => boolean
  17030. 2
  17031.  
  17032. 2
  17033. These two functions test for clear and set to clear, respectively, the property
  17034. 2
  17035. named <prop-name> on the given <object>.  If <object> is not valid,
  17036. 2
  17037. then `E_INVARG' is returned.  If <object> has no non-built-in property
  17038. 2
  17039. named <prop-name>, then `E_PROPNF' is returned.  If the programmer
  17040. 2
  17041. does not have read (write) permission on the property in question, then
  17042. 2
  17043. `is_clear_property()' (`clear_property()') returns `E_PERM'.
  17044. 2
  17045. If a property is clear, then when the value of that property is queried the
  17046. 2
  17047. value of the parent's property of the same name is returned.  If the parent's
  17048. 2
  17049. property is clear, then the parent's parent's value is examined, and so on.
  17050. 2
  17051. If <object> is the definer of the property <prop-name>, as opposed to
  17052. 2
  17053. an inheritor of the property, then `clear_property()' returns
  17054. 2
  17055. `E_INVARG'.
  17056. 38
  17057. 5
  17058. 4
  17059. 2
  17060. 2
  17061. *forward*
  17062. 2
  17063. clear_property()
  17064. 38
  17065. 5
  17066. 5
  17067. 38
  17068. 5
  17069. 5
  17070. 38
  17071. 4
  17072. 4
  17073. 1
  17074. 2
  17075. Builtin Function Help
  17076. 38
  17077. 5
  17078. 4
  17079. 32
  17080. 2
  17081. A help database (in the sense of anything that is usable by $player:help()) is any object having the following two verbs:
  17082. 2
  17083.  
  17084. 2
  17085.   :find_topics(string)
  17086. 2
  17087.      returns a list of strings or some boolean false value.
  17088. 2
  17089.  
  17090. 2
  17091.   :get_topic(string)
  17092. 2
  17093.      given one of the strings returned by :find_topics this either
  17094. 2
  17095.      returns a list of strings (text to be spewed to the player) or
  17096. 2
  17097.      returns 1 to indicate that it has already taken care of printing
  17098. 2
  17099.      information to the player.
  17100. 2
  17101.  
  17102. 2
  17103. $player:help() consults any .help properties that exist on the player, its ancestors, player.location and its ancestors (in that order).  These properties are assumed to have values that are objects or lists of objects, each object itself assumed to be a help database in the above sense.  The main help database ($help) is placed at the end of the list of databases to be consulted.
  17104. 2
  17105.  
  17106. 2
  17107. The Generic Help Database (this object) is the standard model help database of which the actual help database itself ($help) is an instance.  On help databases of this type, every help topic has a corresponding property, interpreted as follows:
  17108. 2
  17109.  
  17110. 2
  17111. this.(topic) = string           - one-line help text.
  17112. 2
  17113. this.(topic) = {"*verb*",@args} - call this:verb(@args) to get text
  17114. 2
  17115. this.(topic) = any other list   - multi-line help text
  17116. 2
  17117.  
  17118. 2
  17119. For the {"*verb*",...} form, the current verbs available are
  17120. 2
  17121.  
  17122. 2
  17123.   {"*forward*", topic2, @rest}   
  17124. 2
  17125.      - get topic2 help text and then append rest.  
  17126. 2
  17127.        rest may, in turn, begin with a "*verb*"...
  17128. 2
  17129.  
  17130. 2
  17131.   {"*subst*", @lines} 
  17132. 2
  17133.      - all occurences of %[exp] in lines are replaced with value of exp.  
  17134. 2
  17135.        exp is assumed to evaluate to a string.  Evaluation is done using 
  17136. 2
  17137.        $no_one's permissions so exp can only refer to public information.
  17138. 2
  17139.  
  17140. 2
  17141.   {"*index*"}
  17142. 2
  17143.      - returns a list of all topics in this database, arranged in columns.
  17144. 38
  17145. 5
  17146. 4
  17147. 2
  17148. 0
  17149. 65428
  17150. 0
  17151. 743668286
  17152. 2
  17153. 1
  17154. #31
  17155. New-Prog-Log
  17156.  
  17157. 0
  17158. 38
  17159. 47
  17160. -1
  17161. -1
  17162. 46
  17163. -1
  17164. 16
  17165. 7
  17166. init_for_core
  17167. 2
  17168. 173
  17169. -1
  17170. receive_message
  17171. 38
  17172. 173
  17173. -1
  17174. display_seq_headers display_seq_full
  17175. 38
  17176. 173
  17177. -1
  17178. from_msg_seq
  17179. 38
  17180. 173
  17181. -1
  17182. to_msg_seq
  17183. 38
  17184. 173
  17185. -1
  17186. %to_msg_seq subject_msg_seq
  17187. 2
  17188. 173
  17189. -1
  17190. %from_msg_seq
  17191. 2
  17192. 173
  17193. -1
  17194. 0
  17195. 18
  17196. 5
  17197. 38
  17198. 5
  17199. 0
  17200. -1464082045
  17201. 38
  17202. 1
  17203. 4
  17204. 0
  17205. 38
  17206. 0
  17207. 0
  17208. 1
  17209. 38
  17210. 5
  17211. 2
  17212. %n (%#) can't send to moderated list %t (%[#t]) directly.
  17213. 38
  17214. 5
  17215. 4
  17216. 0
  17217. 38
  17218. 5
  17219. 4
  17220. 0
  17221. 38
  17222. 5
  17223. 4
  17224. 1
  17225. 1
  17226. 2
  17227. 38
  17228. 1
  17229. 4
  17230. 2
  17231. 1
  17232. 2
  17233. 1
  17234. 31
  17235. 38
  17236. 1
  17237. 0
  17238. 2592000
  17239. 38
  17240. 5
  17241. 0
  17242. -1464082045
  17243. 38
  17244. 1
  17245. 4
  17246. 8
  17247. 4
  17248. 2
  17249. 0
  17250. 1
  17251. 4
  17252. 4
  17253. 0
  17254. -1465142007
  17255. 1
  17256. 2
  17257. 1
  17258. 146
  17259. 2
  17260. JL
  17261. 4
  17262. 2
  17263. 0
  17264. 2
  17265. 4
  17266. 4
  17267. 0
  17268. -1465140906
  17269. 1
  17270. 2
  17271. 1
  17272. 147
  17273. 2
  17274. LiverSpot
  17275. 4
  17276. 2
  17277. 0
  17278. 3
  17279. 4
  17280. 4
  17281. 0
  17282. -1465130015
  17283. 1
  17284. 2
  17285. 1
  17286. 77
  17287. 2
  17288. The_Demolished_Man
  17289. 4
  17290. 2
  17291. 0
  17292. 4
  17293. 4
  17294. 4
  17295. 0
  17296. -1465129956
  17297. 1
  17298. 2
  17299. 1
  17300. 154
  17301. 2
  17302. Mark
  17303. 4
  17304. 2
  17305. 0
  17306. 5
  17307. 4
  17308. 4
  17309. 0
  17310. -1464698968
  17311. 1
  17312. 2
  17313. 1
  17314. 228
  17315. 2
  17316. builder
  17317. 4
  17318. 2
  17319. 0
  17320. 6
  17321. 4
  17322. 4
  17323. 0
  17324. -1464179478
  17325. 1
  17326. 77
  17327. 1
  17328. 337
  17329. 2
  17330. Trygve
  17331. 4
  17332. 2
  17333. 0
  17334. 7
  17335. 4
  17336. 4
  17337. 0
  17338. -1464094704
  17339. 1
  17340. 147
  17341. 1
  17342. 346
  17343. 2
  17344. shelby
  17345. 4
  17346. 2
  17347. 0
  17348. 8
  17349. 4
  17350. 4
  17351. 0
  17352. -1464082045
  17353. 1
  17354. 2
  17355. 1
  17356. 79
  17357. 2
  17358. Dead_Meat
  17359. 38
  17360. 0
  17361. 5
  17362. 38
  17363. 5
  17364. 5
  17365. 38
  17366. 5
  17367. 5
  17368. 38
  17369. 4
  17370. 4
  17371. 3
  17372. 2
  17373. New-Prog-Log
  17374. 2
  17375. New_Prog_Log
  17376. 2
  17377. NPL
  17378. 38
  17379. 1
  17380. 2
  17381. Record of who's been made a @programmer.
  17382. 38
  17383. 5
  17384. 4
  17385. 2
  17386. 0
  17387. 24888
  17388. 0
  17389. 743970084
  17390. 2
  17391. 1
  17392. #32
  17393. Generic Help Database
  17394.  
  17395. 144
  17396. 38
  17397. -1
  17398. -1
  17399. -1
  17400. 1
  17401. 61
  17402. 17
  17403. 10
  17404. find_topics
  17405. 2
  17406. 165
  17407. -1
  17408. get_topic
  17409. 2
  17410. 165
  17411. -1
  17412. sort_topics
  17413. 38
  17414. 173
  17415. -1
  17416. columnize
  17417. 38
  17418. 173
  17419. -1
  17420. forward pass
  17421. 38
  17422. 165
  17423. -1
  17424. subst
  17425. 38
  17426. 173
  17427. -1
  17428. index
  17429. 38
  17430. 173
  17431. -1
  17432. initialize
  17433. 2
  17434. 173
  17435. -1
  17436. verbdoc
  17437. 2
  17438. 173
  17439. -1
  17440. dump_topic
  17441. 2
  17442. 165
  17443. -1
  17444. 1
  17445. index
  17446. 5
  17447. 4
  17448. 0
  17449. 38
  17450. 5
  17451. 5
  17452. 38
  17453. 4
  17454. 4
  17455. 1
  17456. 2
  17457. Generic Help Database
  17458. 38
  17459. 5
  17460. 2
  17461. A help database of the standard form in need of a description. See `help $generic_help'...
  17462. 38
  17463. 5
  17464. 4
  17465. 2
  17466. 0
  17467. 7944
  17468. 0
  17469. 743756001
  17470. 2
  17471. 1
  17472. #33
  17473. Generic Guest
  17474.  
  17475. 16
  17476. 38
  17477. -1
  17478. -1
  17479. -1
  17480. 6
  17481. 83
  17482. 4
  17483. 18
  17484. @password
  17485. 2
  17486. 93
  17487. -2
  17488. boot
  17489. 2
  17490. 173
  17491. -1
  17492. disfunc
  17493. 2
  17494. 173
  17495. -1
  17496. defer
  17497. 2
  17498. 173
  17499. -1
  17500. mail_catch_up
  17501. 2
  17502. 173
  17503. -1
  17504. create
  17505. 38
  17506. 89
  17507. -2
  17508. eject
  17509. 38
  17510. 173
  17511. -1
  17512. log
  17513. 38
  17514. 173
  17515. -1
  17516. confunc
  17517. 2
  17518. 173
  17519. -1
  17520. log_disconnect
  17521. 2
  17522. 165
  17523. -1
  17524. @last-c*onnection
  17525. 2
  17526. 29
  17527. -1
  17528. connection_name_hash
  17529. 2
  17530. 173
  17531. -1
  17532. my_huh
  17533. 2
  17534. 173
  17535. -1
  17536. @read
  17537. 38
  17538. 89
  17539. -2
  17540. set_current_folder
  17541. 38
  17542. 173
  17543. -1
  17544. @request*-character @register
  17545. 2
  17546. 89
  17547. 11
  17548. init_for_core
  17549. 2
  17550. 173
  17551. -1
  17552. set_name set_aliases
  17553. 2
  17554. 173
  17555. -1
  17556. 4
  17557. default_gender
  17558. default_description
  17559. request
  17560. extra_confunc_msg
  17561. 60
  17562. 2
  17563. neuter
  17564. 38
  17565. 1
  17566. 4
  17567. 1
  17568. 2
  17569. By definition, guests appear nondescript.
  17570. 38
  17571. 1
  17572. 0
  17573. 0
  17574. 2
  17575. 0
  17576. 2
  17577.  
  17578. 38
  17579. 5
  17580. 5
  17581. 38
  17582. 1
  17583. 5
  17584. 2
  17585. 0
  17586. 5
  17587. 38
  17588. 5
  17589. 5
  17590. 2
  17591. 0
  17592. 5
  17593. 2
  17594. 1
  17595. 0
  17596. 0
  17597. 38
  17598. 5
  17599. 5
  17600. 38
  17601. 5
  17602. 5
  17603. 38
  17604. 1
  17605. 5
  17606. 38
  17607. 1
  17608. 5
  17609. 38
  17610. 0
  17611. 5
  17612. 38
  17613. 1
  17614. 5
  17615. 38
  17616. 5
  17617. 5
  17618. 2
  17619. 1
  17620. 0
  17621. 79
  17622. 38
  17623. 1
  17624. 5
  17625. 38
  17626. 4
  17627. 5
  17628. 2
  17629. 0
  17630. 5
  17631. 2
  17632. 0
  17633. 5
  17634. 38
  17635. 5
  17636. 5
  17637. 38
  17638. 4
  17639. 5
  17640. 38
  17641. 5
  17642. 4
  17643. 39
  17644. 4
  17645. 2
  17646. 4
  17647. 3
  17648. 4
  17649. 5
  17650. 1
  17651. 11
  17652. 2
  17653. announce_all_but
  17654. 1
  17655. 2
  17656. 1
  17657. 3
  17658. 1
  17659. 58320
  17660. 4
  17661. 5
  17662. 1
  17663. 25489
  17664. 2
  17665. confunc
  17666. 1
  17667. 2
  17668. 1
  17669. 25489
  17670. 1
  17671. 58320
  17672. 4
  17673. 3
  17674. 1
  17675. 58320
  17676. 2
  17677. <cmd-line>
  17678. 1
  17679. 58320
  17680. 4
  17681. 2
  17682. 2
  17683. Redback
  17684. 2
  17685.  has connected.
  17686. 4
  17687. 2
  17688. 4
  17689. 5
  17690. 4
  17691. 5
  17692. 1
  17693. 11
  17694. 2
  17695. announce_all_but
  17696. 1
  17697. 2
  17698. 1
  17699. 3
  17700. 1
  17701. 58320
  17702. 4
  17703. 5
  17704. 1
  17705. 16
  17706. 2
  17707. move
  17708. 1
  17709. 2
  17710. 1
  17711. 7
  17712. 1
  17713. 58320
  17714. 4
  17715. 5
  17716. 1
  17717. 16
  17718. 2
  17719. invoke
  17720. 1
  17721. 2
  17722. 1
  17723. 7
  17724. 1
  17725. 58320
  17726. 4
  17727. 5
  17728. 1
  17729. 11
  17730. 2
  17731. open
  17732. 1
  17733. 50
  17734. 1
  17735. 11
  17736. 1
  17737. 58320
  17738. 4
  17739. 3
  17740. 1
  17741. 58320
  17742. 2
  17743. <cmd-line>
  17744. 1
  17745. 58320
  17746. 4
  17747. 3
  17748. 2
  17749. Redback
  17750. 2
  17751.  
  17752. 2
  17753. opens the closet door and leaves, closing it behind itself.
  17754. 4
  17755. 2
  17756. 4
  17757. 5
  17758. 4
  17759. 5
  17760. 1
  17761. 11
  17762. 2
  17763. announce_all_but
  17764. 1
  17765. 2
  17766. 1
  17767. 3
  17768. 1
  17769. 5743
  17770. 4
  17771. 5
  17772. 1
  17773. 16
  17774. 2
  17775. move
  17776. 1
  17777. 2
  17778. 1
  17779. 7
  17780. 1
  17781. 5743
  17782. 4
  17783. 5
  17784. 1
  17785. 16
  17786. 2
  17787. invoke
  17788. 1
  17789. 2
  17790. 1
  17791. 7
  17792. 1
  17793. 5743
  17794. 4
  17795. 5
  17796. 1
  17797. 11
  17798. 2
  17799. open
  17800. 1
  17801. 50
  17802. 1
  17803. 11
  17804. 1
  17805. 5743
  17806. 4
  17807. 3
  17808. 1
  17809. 5743
  17810. 2
  17811. <cmd-line>
  17812. 1
  17813. 5743
  17814. 4
  17815. 3
  17816. 2
  17817. Yellow_Guest
  17818. 2
  17819.  
  17820. 2
  17821. opens the closet door and leaves, closing it behind itself.
  17822. 4
  17823. 2
  17824. 4
  17825. 3
  17826. 4
  17827. 5
  17828. 1
  17829. 11
  17830. 2
  17831. announce
  17832. 1
  17833. 2
  17834. 1
  17835. 3
  17836. 1
  17837. 5704
  17838. 4
  17839. 5
  17840. 1
  17841. 11
  17842. 2
  17843. disfunc
  17844. 1
  17845. 2
  17846. 1
  17847. 11
  17848. 1
  17849. 5704
  17850. 4
  17851. 3
  17852. 1
  17853. 5704
  17854. 2
  17855. <cmd-line>
  17856. 1
  17857. 5704
  17858. 4
  17859. 3
  17860. 2
  17861. You hear a quiet popping sound; 
  17862. 2
  17863. Guest
  17864. 2
  17865.  has disconnected.
  17866. 4
  17867. 2
  17868. 4
  17869. 3
  17870. 4
  17871. 5
  17872. 1
  17873. 11
  17874. 2
  17875. announce_all_but
  17876. 1
  17877. 2
  17878. 1
  17879. 3
  17880. 1
  17881. 18308
  17882. 4
  17883. 5
  17884. 1
  17885. 25489
  17886. 2
  17887. confunc
  17888. 1
  17889. 2
  17890. 1
  17891. 25489
  17892. 1
  17893. 18308
  17894. 4
  17895. 3
  17896. 1
  17897. 18308
  17898. 2
  17899. <cmd-line>
  17900. 1
  17901. 18308
  17902. 4
  17903. 2
  17904. 2
  17905. Dafydd
  17906. 2
  17907.  has connected.
  17908. 4
  17909. 2
  17910. 4
  17911. 3
  17912. 4
  17913. 5
  17914. 1
  17915. 11
  17916. 2
  17917. announce
  17918. 1
  17919. 2
  17920. 1
  17921. 3
  17922. 1
  17923. 18308
  17924. 4
  17925. 5
  17926. 1
  17927. 11
  17928. 2
  17929. disfunc
  17930. 1
  17931. 2
  17932. 1
  17933. 11
  17934. 1
  17935. 18308
  17936. 4
  17937. 3
  17938. 1
  17939. 18308
  17940. 2
  17941. <cmd-line>
  17942. 1
  17943. 18308
  17944. 4
  17945. 3
  17946. 2
  17947. You hear a quiet popping sound; 
  17948. 2
  17949. Dafydd
  17950. 2
  17951.  has disconnected.
  17952. 4
  17953. 2
  17954. 4
  17955. 3
  17956. 4
  17957. 5
  17958. 1
  17959. 11
  17960. 2
  17961. announce_all_but
  17962. 1
  17963. 2
  17964. 1
  17965. 3
  17966. 1
  17967. 58322
  17968. 4
  17969. 5
  17970. 1
  17971. 25489
  17972. 2
  17973. confunc
  17974. 1
  17975. 2
  17976. 1
  17977. 25489
  17978. 1
  17979. 58322
  17980. 4
  17981. 3
  17982. 1
  17983. 58322
  17984. 2
  17985. <cmd-line>
  17986. 1
  17987. 58322
  17988. 4
  17989. 2
  17990. 2
  17991. predator
  17992. 2
  17993.  has connected.
  17994. 4
  17995. 2
  17996. 4
  17997. 5
  17998. 4
  17999. 5
  18000. 1
  18001. 11
  18002. 2
  18003. announce_all_but
  18004. 1
  18005. 2
  18006. 1
  18007. 3
  18008. 1
  18009. 58322
  18010. 4
  18011. 5
  18012. 1
  18013. 16
  18014. 2
  18015. move
  18016. 1
  18017. 2
  18018. 1
  18019. 7
  18020. 1
  18021. 58322
  18022. 4
  18023. 5
  18024. 1
  18025. 16
  18026. 2
  18027. invoke
  18028. 1
  18029. 2
  18030. 1
  18031. 7
  18032. 1
  18033. 58322
  18034. 4
  18035. 5
  18036. 1
  18037. 11
  18038. 2
  18039. open
  18040. 1
  18041. 50
  18042. 1
  18043. 11
  18044. 1
  18045. 58322
  18046. 4
  18047. 3
  18048. 1
  18049. 58322
  18050. 2
  18051. <cmd-line>
  18052. 1
  18053. 58322
  18054. 4
  18055. 3
  18056. 2
  18057. predator
  18058. 2
  18059.  
  18060. 2
  18061. opens the closet door and leaves, closing it behind itself.
  18062. 4
  18063. 2
  18064. 4
  18065. 3
  18066. 4
  18067. 5
  18068. 1
  18069. 11
  18070. 2
  18071. announce_all_but
  18072. 1
  18073. 2
  18074. 1
  18075. 3
  18076. 1
  18077. 5704
  18078. 4
  18079. 5
  18080. 1
  18081. 25489
  18082. 2
  18083. confunc
  18084. 1
  18085. 2
  18086. 1
  18087. 25489
  18088. 1
  18089. 5704
  18090. 4
  18091. 3
  18092. 1
  18093. 5704
  18094. 2
  18095. <cmd-line>
  18096. 1
  18097. 5704
  18098. 4
  18099. 2
  18100. 2
  18101. Guest
  18102. 2
  18103.  has connected.
  18104. 4
  18105. 2
  18106. 4
  18107. 5
  18108. 4
  18109. 5
  18110. 1
  18111. 11
  18112. 2
  18113. announce_all_but
  18114. 1
  18115. 2
  18116. 1
  18117. 3
  18118. 1
  18119. 5704
  18120. 4
  18121. 5
  18122. 1
  18123. 16
  18124. 2
  18125. move
  18126. 1
  18127. 2
  18128. 1
  18129. 7
  18130. 1
  18131. 5704
  18132. 4
  18133. 5
  18134. 1
  18135. 16
  18136. 2
  18137. invoke
  18138. 1
  18139. 2
  18140. 1
  18141. 7
  18142. 1
  18143. 5704
  18144. 4
  18145. 5
  18146. 1
  18147. 11
  18148. 2
  18149. open
  18150. 1
  18151. 50
  18152. 1
  18153. 11
  18154. 1
  18155. 5704
  18156. 4
  18157. 3
  18158. 1
  18159. 5704
  18160. 2
  18161. <cmd-line>
  18162. 1
  18163. 5704
  18164. 4
  18165. 3
  18166. 2
  18167. Guest
  18168. 2
  18169.  
  18170. 2
  18171. opens the closet door and leaves, closing it behind itself.
  18172. 4
  18173. 2
  18174. 4
  18175. 3
  18176. 4
  18177. 5
  18178. 1
  18179. 11
  18180. 2
  18181. announce_all
  18182. 1
  18183. 2
  18184. 1
  18185. 3
  18186. 1
  18187. 49853
  18188. 4
  18189. 5
  18190. 1
  18191. 20259
  18192. 2
  18193. cuckoo
  18194. 1
  18195. 47498
  18196. 1
  18197. 20259
  18198. 1
  18199. 49853
  18200. 4
  18201. 3
  18202. 1
  18203. 49853
  18204. 2
  18205. <cmd-line>
  18206. 1
  18207. 49853
  18208. 4
  18209. 1
  18210. 2
  18211. You hear what sounds like a strange bird song coming from the living room.
  18212. 4
  18213. 2
  18214. 4
  18215. 3
  18216. 4
  18217. 5
  18218. 1
  18219. 11
  18220. 2
  18221. announce_all_but
  18222. 1
  18223. 2
  18224. 1
  18225. 3
  18226. 1
  18227. 58053
  18228. 4
  18229. 5
  18230. 1
  18231. 25489
  18232. 2
  18233. confunc
  18234. 1
  18235. 2
  18236. 1
  18237. 25489
  18238. 1
  18239. 58053
  18240. 4
  18241. 3
  18242. 1
  18243. 58053
  18244. 2
  18245. <cmd-line>
  18246. 1
  18247. 58053
  18248. 4
  18249. 2
  18250. 2
  18251. Komrade_Wolfy
  18252. 2
  18253.  has connected.
  18254. 4
  18255. 2
  18256. 4
  18257. 5
  18258. 4
  18259. 5
  18260. 1
  18261. 11
  18262. 2
  18263. announce_all_but
  18264. 1
  18265. 2
  18266. 1
  18267. 3
  18268. 1
  18269. 58053
  18270. 4
  18271. 5
  18272. 1
  18273. 58053
  18274. 2
  18275. teleport_messages
  18276. 1
  18277. 47
  18278. 1
  18279. 3133
  18280. 1
  18281. 58053
  18282. 4
  18283. 5
  18284. 1
  18285. 58053
  18286. 2
  18287. teleport
  18288. 1
  18289. 47
  18290. 1
  18291. 3133
  18292. 1
  18293. 58053
  18294. 4
  18295. 5
  18296. 1
  18297. 58053
  18298. 2
  18299. @join
  18300. 1
  18301. 47
  18302. 1
  18303. 3133
  18304. 1
  18305. 58053
  18306. 4
  18307. 3
  18308. 1
  18309. 58053
  18310. 2
  18311. <cmd-line>
  18312. 1
  18313. 58053
  18314. 4
  18315. 1
  18316. 2
  18317. Komrade_Wolfy teleports out.
  18318. 4
  18319. 2
  18320. 4
  18321. 3
  18322. 4
  18323. 5
  18324. 1
  18325. 11
  18326. 2
  18327. announce_all_but
  18328. 1
  18329. 2
  18330. 1
  18331. 3
  18332. 1
  18333. 18308
  18334. 4
  18335. 5
  18336. 1
  18337. 25489
  18338. 2
  18339. confunc
  18340. 1
  18341. 2
  18342. 1
  18343. 25489
  18344. 1
  18345. 18308
  18346. 4
  18347. 3
  18348. 1
  18349. 18308
  18350. 2
  18351. <cmd-line>
  18352. 1
  18353. 18308
  18354. 4
  18355. 2
  18356. 2
  18357. Dafydd
  18358. 2
  18359.  has connected.
  18360. 4
  18361. 2
  18362. 4
  18363. 3
  18364. 4
  18365. 5
  18366. 1
  18367. 11
  18368. 2
  18369. announce
  18370. 1
  18371. 2
  18372. 1
  18373. 3
  18374. 1
  18375. 18308
  18376. 4
  18377. 5
  18378. 1
  18379. 11
  18380. 2
  18381. disfunc
  18382. 1
  18383. 2
  18384. 1
  18385. 11
  18386. 1
  18387. 18308
  18388. 4
  18389. 3
  18390. 1
  18391. 18308
  18392. 2
  18393. <cmd-line>
  18394. 1
  18395. 18308
  18396. 4
  18397. 3
  18398. 2
  18399. You hear a quiet popping sound; 
  18400. 2
  18401. Dafydd
  18402. 2
  18403.  has disconnected.
  18404. 4
  18405. 2
  18406. 4
  18407. 3
  18408. 4
  18409. 5
  18410. 1
  18411. 11
  18412. 2
  18413. announce
  18414. 1
  18415. 2
  18416. 1
  18417. 3
  18418. 1
  18419. 56289
  18420. 4
  18421. 5
  18422. 1
  18423. 11
  18424. 2
  18425. confunc
  18426. 1
  18427. 2
  18428. 1
  18429. 3
  18430. 1
  18431. 56289
  18432. 4
  18433. 3
  18434. 1
  18435. 56289
  18436. 2
  18437. <cmd-line>
  18438. 1
  18439. 56289
  18440. 4
  18441. 2
  18442. 2
  18443. RPG_GM
  18444. 2
  18445.  has connected.
  18446. 4
  18447. 2
  18448. 4
  18449. 4
  18450. 4
  18451. 5
  18452. 1
  18453. 11
  18454. 2
  18455. announce
  18456. 1
  18457. 2
  18458. 1
  18459. 3
  18460. 1
  18461. 56289
  18462. 4
  18463. 5
  18464. 1
  18465. 11
  18466. 2
  18467. disfunc
  18468. 1
  18469. 2
  18470. 1
  18471. 3
  18472. 1
  18473. 56289
  18474. 4
  18475. 5
  18476. 1
  18477. 11
  18478. 2
  18479. disfunc
  18480. 1
  18481. 2
  18482. 1
  18483. 11
  18484. 1
  18485. 56289
  18486. 4
  18487. 3
  18488. 1
  18489. 56289
  18490. 2
  18491. <cmd-line>
  18492. 1
  18493. 56289
  18494. 4
  18495. 2
  18496. 2
  18497. RPG_GM
  18498. 2
  18499.  has disconnected.
  18500. 4
  18501. 2
  18502. 4
  18503. 3
  18504. 4
  18505. 5
  18506. 1
  18507. 11
  18508. 2
  18509. announce
  18510. 1
  18511. 2
  18512. 1
  18513. 3
  18514. 1
  18515. 53530
  18516. 4
  18517. 5
  18518. 1
  18519. 11
  18520. 2
  18521. confunc
  18522. 1
  18523. 2
  18524. 1
  18525. 3
  18526. 1
  18527. 53530
  18528. 4
  18529. 3
  18530. 1
  18531. 53530
  18532. 2
  18533. <cmd-line>
  18534. 1
  18535. 53530
  18536. 4
  18537. 2
  18538. 2
  18539. D!
  18540. 2
  18541.  has connected.
  18542. 4
  18543. 2
  18544. 4
  18545. 3
  18546. 4
  18547. 5
  18548. 1
  18549. 11
  18550. 2
  18551. announce
  18552. 1
  18553. 2
  18554. 1
  18555. 3
  18556. 1
  18557. 58320
  18558. 4
  18559. 5
  18560. 1
  18561. 58320
  18562. 2
  18563. home
  18564. 1
  18565. 2
  18566. 1
  18567. 6
  18568. 1
  18569. 58320
  18570. 4
  18571. 3
  18572. 1
  18573. 58320
  18574. 2
  18575. <cmd-line>
  18576. 1
  18577. 58320
  18578. 4
  18579. 2
  18580. 2
  18581. Redback
  18582. 2
  18583.  comes home.
  18584. 4
  18585. 2
  18586. 4
  18587. 5
  18588. 4
  18589. 5
  18590. 1
  18591. 11
  18592. 2
  18593. announce_all_but
  18594. 1
  18595. 2
  18596. 1
  18597. 3
  18598. 1
  18599. 58320
  18600. 4
  18601. 5
  18602. 1
  18603. 16
  18604. 2
  18605. move
  18606. 1
  18607. 2
  18608. 1
  18609. 7
  18610. 1
  18611. 58320
  18612. 4
  18613. 5
  18614. 1
  18615. 16
  18616. 2
  18617. invoke
  18618. 1
  18619. 2
  18620. 1
  18621. 7
  18622. 1
  18623. 58320
  18624. 4
  18625. 5
  18626. 1
  18627. 11
  18628. 2
  18629. open
  18630. 1
  18631. 50
  18632. 1
  18633. 11
  18634. 1
  18635. 58320
  18636. 4
  18637. 3
  18638. 1
  18639. 58320
  18640. 2
  18641. <cmd-line>
  18642. 1
  18643. 58320
  18644. 4
  18645. 3
  18646. 2
  18647. Redback
  18648. 2
  18649.  
  18650. 2
  18651. opens the closet door and leaves, closing it behind himself.
  18652. 4
  18653. 2
  18654. 4
  18655. 6
  18656. 4
  18657. 5
  18658. 1
  18659. 11
  18660. 2
  18661. announce_all_but
  18662. 1
  18663. 2
  18664. 1
  18665. 3
  18666. 1
  18667. 53530
  18668. 4
  18669. 5
  18670. 1
  18671. 53530
  18672. 2
  18673. teleport_messages
  18674. 1
  18675. 47
  18676. 1
  18677. 3133
  18678. 1
  18679. 53530
  18680. 4
  18681. 5
  18682. 1
  18683. 53530
  18684. 2
  18685. teleport
  18686. 1
  18687. 47
  18688. 1
  18689. 3133
  18690. 1
  18691. 53530
  18692. 4
  18693. 5
  18694. 1
  18695. 53530
  18696. 2
  18697. teleport
  18698. 1
  18699. 3920
  18700. 1
  18701. 33337
  18702. 1
  18703. 53530
  18704. 4
  18705. 5
  18706. 1
  18707. 53530
  18708. 2
  18709. @join
  18710. 1
  18711. 47
  18712. 1
  18713. 3133
  18714. 1
  18715. 53530
  18716. 4
  18717. 3
  18718. 1
  18719. 53530
  18720. 2
  18721. <cmd-line>
  18722. 1
  18723. 53530
  18724. 4
  18725. 1
  18726. 2
  18727. D! teleports out.
  18728. 4
  18729. 2
  18730. 4
  18731. 3
  18732. 4
  18733. 5
  18734. 1
  18735. 11
  18736. 2
  18737. announce_all
  18738. 1
  18739. 2
  18740. 1
  18741. 3
  18742. 1
  18743. 49853
  18744. 4
  18745. 5
  18746. 1
  18747. 20259
  18748. 2
  18749. cuckoo
  18750. 1
  18751. 47498
  18752. 1
  18753. 20259
  18754. 1
  18755. 49853
  18756. 4
  18757. 3
  18758. 1
  18759. 49853
  18760. 2
  18761. <cmd-line>
  18762. 1
  18763. 49853
  18764. 4
  18765. 1
  18766. 2
  18767. You hear what sounds like a strange bird song coming from the living room.
  18768. 4
  18769. 2
  18770. 4
  18771. 3
  18772. 4
  18773. 5
  18774. 1
  18775. 11
  18776. 2
  18777. announce
  18778. 1
  18779. 2
  18780. 1
  18781. 3
  18782. 1
  18783. 56289
  18784. 4
  18785. 5
  18786. 1
  18787. 11
  18788. 2
  18789. confunc
  18790. 1
  18791. 2
  18792. 1
  18793. 3
  18794. 1
  18795. 56289
  18796. 4
  18797. 3
  18798. 1
  18799. 56289
  18800. 2
  18801. <cmd-line>
  18802. 1
  18803. 56289
  18804. 4
  18805. 2
  18806. 2
  18807. RPG_GM
  18808. 2
  18809.  has connected.
  18810. 4
  18811. 2
  18812. 4
  18813. 6
  18814. 4
  18815. 5
  18816. 1
  18817. 11
  18818. 2
  18819. announce_all_but
  18820. 1
  18821. 2
  18822. 1
  18823. 3
  18824. 1
  18825. 56289
  18826. 4
  18827. 5
  18828. 1
  18829. 56289
  18830. 2
  18831. teleport_messages
  18832. 1
  18833. 47
  18834. 1
  18835. 3133
  18836. 1
  18837. 56289
  18838. 4
  18839. 5
  18840. 1
  18841. 56289
  18842. 2
  18843. teleport
  18844. 1
  18845. 47
  18846. 1
  18847. 3133
  18848. 1
  18849. 56289
  18850. 4
  18851. 5
  18852. 1
  18853. 56289
  18854. 2
  18855. teleport
  18856. 1
  18857. 3920
  18858. 1
  18859. 33337
  18860. 1
  18861. 56289
  18862. 4
  18863. 5
  18864. 1
  18865. 56289
  18866. 2
  18867. @join
  18868. 1
  18869. 47
  18870. 1
  18871. 3133
  18872. 1
  18873. 56289
  18874. 4
  18875. 3
  18876. 1
  18877. 56289
  18878. 2
  18879. <cmd-line>
  18880. 1
  18881. 56289
  18882. 4
  18883. 1
  18884. 2
  18885. RPG_GM teleports out.
  18886. 4
  18887. 2
  18888. 4
  18889. 3
  18890. 4
  18891. 5
  18892. 1
  18893. 11
  18894. 2
  18895. announce_all_but
  18896. 1
  18897. 2
  18898. 1
  18899. 3
  18900. 1
  18901. 5790
  18902. 4
  18903. 5
  18904. 1
  18905. 25489
  18906. 2
  18907. confunc
  18908. 1
  18909. 2
  18910. 1
  18911. 25489
  18912. 1
  18913. 5790
  18914. 4
  18915. 3
  18916. 1
  18917. 5790
  18918. 2
  18919. <cmd-line>
  18920. 1
  18921. 5790
  18922. 4
  18923. 2
  18924. 2
  18925. Purple_Guest
  18926. 2
  18927.  has connected.
  18928. 4
  18929. 2
  18930. 4
  18931. 5
  18932. 4
  18933. 5
  18934. 1
  18935. 11
  18936. 2
  18937. announce_all_but
  18938. 1
  18939. 2
  18940. 1
  18941. 3
  18942. 1
  18943. 5790
  18944. 4
  18945. 5
  18946. 1
  18947. 5790
  18948. 2
  18949. teleport_messages
  18950. 1
  18951. 47
  18952. 1
  18953. 3133
  18954. 1
  18955. 5790
  18956. 4
  18957. 5
  18958. 1
  18959. 5790
  18960. 2
  18961. teleport
  18962. 1
  18963. 47
  18964. 1
  18965. 3133
  18966. 1
  18967. 5790
  18968. 4
  18969. 5
  18970. 1
  18971. 5790
  18972. 2
  18973. @join
  18974. 1
  18975. 47
  18976. 1
  18977. 3133
  18978. 1
  18979. 5790
  18980. 4
  18981. 3
  18982. 1
  18983. 5790
  18984. 2
  18985. <cmd-line>
  18986. 1
  18987. 5790
  18988. 4
  18989. 1
  18990. 2
  18991. Purple_Guest teleports out.
  18992. 4
  18993. 2
  18994. 4
  18995. 3
  18996. 4
  18997. 5
  18998. 1
  18999. 11
  19000. 2
  19001. announce
  19002. 1
  19003. 2
  19004. 1
  19005. 3
  19006. 1
  19007. 58002
  19008. 4
  19009. 5
  19010. 1
  19011. 58002
  19012. 2
  19013. home
  19014. 1
  19015. 57140
  19016. 1
  19017. 49900
  19018. 1
  19019. 58002
  19020. 4
  19021. 3
  19022. 1
  19023. 58002
  19024. 2
  19025. <cmd-line>
  19026. 1
  19027. 58002
  19028. 4
  19029. 1
  19030. 2
  19031. Morgaine comes home.
  19032. 4
  19033. 2
  19034. 4
  19035. 3
  19036. 4
  19037. 5
  19038. 1
  19039. 11
  19040. 2
  19041. announce_all
  19042. 1
  19043. 2
  19044. 1
  19045. 3
  19046. 1
  19047. 58002
  19048. 4
  19049. 5
  19050. 1
  19051. 58002
  19052. 2
  19053. !quit
  19054. 1
  19055. 4292
  19056. 1
  19057. 5803
  19058. 1
  19059. 58002
  19060. 4
  19061. 3
  19062. 1
  19063. 58002
  19064. 2
  19065. <cmd-line>
  19066. 1
  19067. 58002
  19068. 4
  19069. 1
  19070. 2
  19071. quit      --Morgaine
  19072. 4
  19073. 2
  19074. 4
  19075. 3
  19076. 4
  19077. 5
  19078. 1
  19079. 11
  19080. 2
  19081. announce_all
  19082. 1
  19083. 2
  19084. 1
  19085. 3
  19086. 1
  19087. 58002
  19088. 4
  19089. 5
  19090. 1
  19091. 58002
  19092. 2
  19093. !jfldj
  19094. 1
  19095. 4292
  19096. 1
  19097. 5803
  19098. 1
  19099. 58002
  19100. 4
  19101. 3
  19102. 1
  19103. 58002
  19104. 2
  19105. <cmd-line>
  19106. 1
  19107. 58002
  19108. 4
  19109. 1
  19110. 2
  19111. jfldj      --Morgaine
  19112. 4
  19113. 2
  19114. 4
  19115. 3
  19116. 4
  19117. 5
  19118. 1
  19119. 11
  19120. 2
  19121. announce
  19122. 1
  19123. 2
  19124. 1
  19125. 3
  19126. 1
  19127. 58002
  19128. 4
  19129. 5
  19130. 1
  19131. 11
  19132. 2
  19133. disfunc
  19134. 1
  19135. 2
  19136. 1
  19137. 11
  19138. 1
  19139. 58002
  19140. 4
  19141. 3
  19142. 1
  19143. 58002
  19144. 2
  19145. <cmd-line>
  19146. 1
  19147. 58002
  19148. 4
  19149. 3
  19150. 2
  19151. You hear a quiet popping sound; 
  19152. 2
  19153. Morgaine
  19154. 2
  19155.  has disconnected.
  19156. 4
  19157. 2
  19158. 4
  19159. 7
  19160. 4
  19161. 5
  19162. 1
  19163. 11
  19164. 2
  19165. announce_all_but
  19166. 1
  19167. 2
  19168. 1
  19169. 3
  19170. 1
  19171. 57490
  19172. 4
  19173. 5
  19174. 1
  19175. 57490
  19176. 2
  19177. teleport_messages
  19178. 1
  19179. 47
  19180. 1
  19181. 3133
  19182. 1
  19183. 57490
  19184. 4
  19185. 5
  19186. 1
  19187. 57490
  19188. 2
  19189. teleport
  19190. 1
  19191. 47
  19192. 1
  19193. 3133
  19194. 1
  19195. 57490
  19196. 4
  19197. 5
  19198. 1
  19199. 57490
  19200. 2
  19201. teleport
  19202. 1
  19203. 3920
  19204. 1
  19205. 33337
  19206. 1
  19207. 57490
  19208. 4
  19209. 5
  19210. 1
  19211. 57490
  19212. 2
  19213. @go
  19214. 1
  19215. 47
  19216. 1
  19217. 3133
  19218. 1
  19219. 57490
  19220. 4
  19221. 5
  19222. 1
  19223. 57490
  19224. 2
  19225. @go
  19226. 1
  19227. 57490
  19228. 1
  19229. 57490
  19230. 1
  19231. 57490
  19232. 4
  19233. 3
  19234. 1
  19235. 57490
  19236. 2
  19237. <cmd-line>
  19238. 1
  19239. 57490
  19240. 4
  19241. 1
  19242. 2
  19243. You hear a loud *SWOOOOOSHING* sound... You look up and see Tired flying high overhead, in his red & blue *Super-MOOer* costume. He quickly swings in, through an open window, and *SMACKS* into the wall on the opposite side of the room. *Insta-changing* into his secret I.D as mild mannered Tired, he struggles to his feet and bows to all.....
  19244. 4
  19245. 2
  19246. 4
  19247. 5
  19248. 4
  19249. 5
  19250. 1
  19251. 11
  19252. 2
  19253. announce_all_but
  19254. 1
  19255. 2
  19256. 1
  19257. 3
  19258. 1
  19259. 56427
  19260. 4
  19261. 5
  19262. 1
  19263. 52657
  19264. 2
  19265. nuke
  19266. 1
  19267. 49725
  19268. 1
  19269. 29360
  19270. 1
  19271. 56427
  19272. 4
  19273. 5
  19274. 1
  19275. 52657
  19276. 2
  19277. action
  19278. 1
  19279. 49725
  19280. 1
  19281. 29360
  19282. 1
  19283. 56427
  19284. 4
  19285. 5
  19286. 1
  19287. 52657
  19288. 2
  19289. action
  19290. 1
  19291. 49725
  19292. 1
  19293. 29360
  19294. 1
  19295. 56427
  19296. 4
  19297. 3
  19298. 1
  19299. 56427
  19300. 2
  19301. <cmd-line>
  19302. 1
  19303. 56427
  19304. 4
  19305. 3
  19306. 2
  19307. An disspiritted soul appears in the air and drops of a pile of ashes, from which a figure grows. The incarnated form appears to be
  19308. 2
  19309.  
  19310. 2
  19311. Skinwalker
  19312. 4
  19313. 2
  19314. 4
  19315. 6
  19316. 4
  19317. 5
  19318. 1
  19319. 11
  19320. 2
  19321. announce_all_but
  19322. 1
  19323. 2
  19324. 1
  19325. 3
  19326. 1
  19327. 58287
  19328. 4
  19329. 5
  19330. 1
  19331. 58287
  19332. 2
  19333. teleport_messages
  19334. 1
  19335. 47
  19336. 1
  19337. 3133
  19338. 1
  19339. 58287
  19340. 4
  19341. 5
  19342. 1
  19343. 58287
  19344. 2
  19345. teleport
  19346. 1
  19347. 47
  19348. 1
  19349. 3133
  19350. 1
  19351. 58287
  19352. 4
  19353. 5
  19354. 1
  19355. 58287
  19356. 2
  19357. teleport
  19358. 1
  19359. 3920
  19360. 1
  19361. 33337
  19362. 1
  19363. 58287
  19364. 4
  19365. 5
  19366. 1
  19367. 58287
  19368. 2
  19369. @go
  19370. 1
  19371. 47
  19372. 1
  19373. 3133
  19374. 1
  19375. 58287
  19376. 4
  19377. 3
  19378. 1
  19379. 58287
  19380. 2
  19381. <cmd-line>
  19382. 1
  19383. 58287
  19384. 4
  19385. 1
  19386. 2
  19387. Skinwalker teleports out.
  19388. 4
  19389. 2
  19390. 4
  19391. 3
  19392. 4
  19393. 5
  19394. 1
  19395. 11
  19396. 2
  19397. announce
  19398. 1
  19399. 2
  19400. 1
  19401. 3
  19402. 1
  19403. 57490
  19404. 4
  19405. 5
  19406. 1
  19407. 57490
  19408. 2
  19409. @morph
  19410. 1
  19411. 57140
  19412. 1
  19413. 49900
  19414. 1
  19415. 57490
  19416. 4
  19417. 3
  19418. 1
  19419. 57490
  19420. 2
  19421. <cmd-line>
  19422. 1
  19423. 57490
  19424. 4
  19425. 1
  19426. 2
  19427. Tired quickly morphs into HELP!.
  19428. 4
  19429. 2
  19430. 4
  19431. 3
  19432. 4
  19433. 5
  19434. 1
  19435. 11
  19436. 2
  19437. announce
  19438. 1
  19439. 2
  19440. 1
  19441. 3
  19442. 1
  19443. 57490
  19444. 4
  19445. 5
  19446. 1
  19447. 57490
  19448. 2
  19449. @morph
  19450. 1
  19451. 57140
  19452. 1
  19453. 49900
  19454. 1
  19455. 57490
  19456. 4
  19457. 3
  19458. 1
  19459. 57490
  19460. 2
  19461. <cmd-line>
  19462. 1
  19463. 57490
  19464. 4
  19465. 1
  19466. 2
  19467. HELP! quickly morphs into Tired.
  19468. 4
  19469. 2
  19470. 4
  19471. 3
  19472. 4
  19473. 5
  19474. 1
  19475. 11
  19476. 2
  19477. announce
  19478. 1
  19479. 2
  19480. 1
  19481. 3
  19482. 1
  19483. 57490
  19484. 4
  19485. 5
  19486. 1
  19487. 57490
  19488. 2
  19489. @morph
  19490. 1
  19491. 57140
  19492. 1
  19493. 49900
  19494. 1
  19495. 57490
  19496. 4
  19497. 3
  19498. 1
  19499. 57490
  19500. 2
  19501. <cmd-line>
  19502. 1
  19503. 57490
  19504. 4
  19505. 1
  19506. 2
  19507. Tired quickly morphs into Deiter...
  19508. 4
  19509. 2
  19510. 4
  19511. 3
  19512. 4
  19513. 5
  19514. 1
  19515. 11
  19516. 2
  19517. announce
  19518. 1
  19519. 2
  19520. 1
  19521. 3
  19522. 1
  19523. 57490
  19524. 4
  19525. 5
  19526. 1
  19527. 57490
  19528. 2
  19529. @morph
  19530. 1
  19531. 57140
  19532. 1
  19533. 49900
  19534. 1
  19535. 57490
  19536. 4
  19537. 3
  19538. 1
  19539. 57490
  19540. 2
  19541. <cmd-line>
  19542. 1
  19543. 57490
  19544. 4
  19545. 1
  19546. 2
  19547. Deiter.. quickly morphs into Tired.
  19548. 4
  19549. 2
  19550. 4
  19551. 7
  19552. 4
  19553. 5
  19554. 1
  19555. 11
  19556. 2
  19557. announce_all_but
  19558. 1
  19559. 2
  19560. 1
  19561. 3
  19562. 1
  19563. 57490
  19564. 4
  19565. 5
  19566. 1
  19567. 57490
  19568. 2
  19569. teleport_messages
  19570. 1
  19571. 47
  19572. 1
  19573. 3133
  19574. 1
  19575. 57490
  19576. 4
  19577. 5
  19578. 1
  19579. 57490
  19580. 2
  19581. teleport
  19582. 1
  19583. 47
  19584. 1
  19585. 3133
  19586. 1
  19587. 57490
  19588. 4
  19589. 5
  19590. 1
  19591. 57490
  19592. 2
  19593. teleport
  19594. 1
  19595. 3920
  19596. 1
  19597. 33337
  19598. 1
  19599. 57490
  19600. 4
  19601. 5
  19602. 1
  19603. 57490
  19604. 2
  19605. @go
  19606. 1
  19607. 47
  19608. 1
  19609. 3133
  19610. 1
  19611. 57490
  19612. 4
  19613. 5
  19614. 1
  19615. 57490
  19616. 2
  19617. @go
  19618. 1
  19619. 57490
  19620. 1
  19621. 57490
  19622. 1
  19623. 57490
  19624. 4
  19625. 3
  19626. 1
  19627. 57490
  19628. 2
  19629. <cmd-line>
  19630. 1
  19631. 57490
  19632. 4
  19633. 1
  19634. 2
  19635. Tired *instachanges* into *Super-MOOer*, leaps *HEROICALLY* through an open window, and quickly flies far away. (You feel *safe* in the knowledge that he is out there making the VR-world secure for peace, freedom, and deMOOcracy.....)
  19636. 4
  19637. 2
  19638. 4
  19639. 3
  19640. 4
  19641. 5
  19642. 1
  19643. 11
  19644. 2
  19645. announce_all
  19646. 1
  19647. 2
  19648. 1
  19649. 3
  19650. 1
  19651. 49853
  19652. 4
  19653. 5
  19654. 1
  19655. 20259
  19656. 2
  19657. cuckoo
  19658. 1
  19659. 47498
  19660. 1
  19661. 20259
  19662. 1
  19663. 49853
  19664. 4
  19665. 3
  19666. 1
  19667. 49853
  19668. 2
  19669. <cmd-line>
  19670. 1
  19671. 49853
  19672. 4
  19673. 1
  19674. 2
  19675. You hear what sounds like a strange bird song coming from the living room.
  19676. 38
  19677. 4
  19678. 0
  19679. 30
  19680. 38
  19681. 4
  19682. 5
  19683. 38
  19684. 5
  19685. 5
  19686. 38
  19687. 5
  19688. 5
  19689. 38
  19690. 5
  19691. 5
  19692. 38
  19693. 5
  19694. 5
  19695. 38
  19696. 5
  19697. 5
  19698. 38
  19699. 5
  19700. 2
  19701. %t (%[#t]) is a guest character.
  19702. 38
  19703. 5
  19704. 5
  19705. 38
  19706. 5
  19707. 5
  19708. 38
  19709. 5
  19710. 5
  19711. 38
  19712. 4
  19713. 5
  19714. 38
  19715. 4
  19716. 5
  19717. 2
  19718. 1
  19719. 0
  19720. 0
  19721. 2
  19722. 0
  19723. 5
  19724. 38
  19725. 5
  19726. 5
  19727. 38
  19728. 5
  19729. 5
  19730. 38
  19731. 5
  19732. 5
  19733. 38
  19734. 5
  19735. 5
  19736. 38
  19737. 5
  19738. 5
  19739. 38
  19740. 5
  19741. 5
  19742. 38
  19743. 5
  19744. 5
  19745. 38
  19746. 5
  19747. 5
  19748. 38
  19749. 5
  19750. 5
  19751. 38
  19752. 5
  19753. 0
  19754. 0
  19755. 2
  19756. 0
  19757. 5
  19758. 38
  19759. 5
  19760. 0
  19761. 1
  19762. 38
  19763. 5
  19764. 5
  19765. 38
  19766. 5
  19767. 5
  19768. 38
  19769. 5
  19770. 5
  19771. 38
  19772. 5
  19773. 5
  19774. 2
  19775. 1
  19776. 5
  19777. 38
  19778. 4
  19779. 4
  19780. 1
  19781. 2
  19782. Generic Guest
  19783. 2
  19784. 1
  19785. 4
  19786. 1
  19787. 2
  19788. By definition, guests appear nondescript.
  19789. 38
  19790. 5
  19791. 4
  19792. 2
  19793. 0
  19794. 25940
  19795. 0
  19796. 743667542
  19797. 2
  19798. 1
  19799. #34
  19800.  
  19801.  
  19802. 0
  19803. 2
  19804. -1
  19805. -1
  19806. -1
  19807. 1
  19808. -1
  19809. -1
  19810. 0
  19811. 0
  19812. 4
  19813. 0
  19814. 0
  19815. 2
  19816. 4
  19817. 5
  19818. 2
  19819. 5
  19820. 5
  19821. 2
  19822. 5
  19823. 4
  19824. 2
  19825. 0
  19826. 0
  19827. 0
  19828. 0
  19829. 2
  19830. 1
  19831. #35
  19832. sequence utilities
  19833.  
  19834. 16
  19835. 38
  19836. -1
  19837. -1
  19838. -1
  19839. 1
  19840. -1
  19841. 39
  19842. 17
  19843. add remove
  19844. 38
  19845. 173
  19846. -1
  19847. contains
  19848. 38
  19849. 173
  19850. -1
  19851. complement
  19852. 38
  19853. 173
  19854. -1
  19855. union intersection
  19856. 38
  19857. 173
  19858. -1
  19859. tostr
  19860. 38
  19861. 173
  19862. -1
  19863. for
  19864. 38
  19865. 173
  19866. -1
  19867. extract
  19868. 38
  19869. 173
  19870. -1
  19871. tolist
  19872. 38
  19873. 173
  19874. -1
  19875. from_list
  19876. 38
  19877. 173
  19878. -1
  19879. from_sorted_list
  19880. 38
  19881. 173
  19882. -1
  19883. first
  19884. 38
  19885. 173
  19886. -1
  19887. last
  19888. 38
  19889. 173
  19890. -1
  19891. size
  19892. 38
  19893. 173
  19894. -1
  19895. from_string
  19896. 38
  19897. 173
  19898. -1
  19899. firstn
  19900. 38
  19901. 173
  19902. -1
  19903. lastn
  19904. 38
  19905. 173
  19906. -1
  19907. range
  19908. 38
  19909. 173
  19910. -1
  19911. 0
  19912. 4
  19913. 5
  19914. 38
  19915. 4
  19916. 4
  19917. 3
  19918. 2
  19919. sequence utilities
  19920. 2
  19921. seq_utils
  19922. 2
  19923. squ
  19924. 38
  19925. 5
  19926. 4
  19927. 35
  19928. 2
  19929. A sequence is a set of integers (*)
  19930. 2
  19931. This package supplies the following verbs:
  19932. 2
  19933.  
  19934. 2
  19935.   :add      (seq,f,t)  => seq with [f..t] interval added
  19936. 2
  19937.   :remove   (seq,f,t)  => seq with [f..t] interval removed
  19938. 2
  19939.   :range    (f,t)      => sequence corresponding to [f..t]
  19940. 2
  19941.   {}                   => empty sequence
  19942. 2
  19943.   :contains (seq,n)    => n in seq
  19944. 2
  19945.   :size     (seq)      => number of elements in seq
  19946. 2
  19947.   :first    (seq)      => first integer in seq or E_NONE
  19948. 2
  19949.   :firstn   (seq,n)    => first n integers in seq (as a sequence)
  19950. 2
  19951.   :last     (seq)      => last integer in seq  or E_NONE
  19952. 2
  19953.   :lastn    (seq,n)    => last n integers in seq (as a sequence)
  19954. 2
  19955.  
  19956. 2
  19957.   :complement(seq)       => [-2147483648..2147483647] - seq
  19958. 2
  19959.   :union    (seq,seq,...) 
  19960. 2
  19961.   :intersect(seq,seq,...) 
  19962. 2
  19963.  
  19964. 2
  19965.   :extract(seq,array)           => array[@seq]
  19966. 2
  19967.   :for([n,]seq,obj,verb,@args)  => for s in (seq) obj:verb(s,@args); endfor
  19968. 2
  19969.  
  19970. 2
  19971.   :tolist(seq)            => list corresponding to seq
  19972. 2
  19973.   :tostr(seq)             => contents of seq as a string
  19974. 2
  19975.   :from_list(list)        => sequence corresponding to list
  19976. 2
  19977.   :from_sorted_list(list) => sequence corresponding to list (assumed sorted)
  19978. 2
  19979.   :from_string(string)    => sequence corresponding to string
  19980. 2
  19981.  
  19982. 2
  19983. For boolean expressions, note that
  19984. 2
  19985.   the representation of the empty sequence is {} (boolean FALSE) and
  19986. 2
  19987.   all non-empty sequences are represented as nonempty lists (boolean TRUE).
  19988. 2
  19989.  
  19990. 2
  19991. The representation used works better than the usual list implementation for sets consisting of long uninterrupted ranges of integers.  
  19992. 2
  19993. For sparse sets of integers the representation is decidedly non-optimal (though it never takes more than double the space of the usual list representation).
  19994. 2
  19995.  
  19996. 2
  19997. (*) Actually what this package implements is sets of integers-mod-2^32, but this assumes the underlying machine on which the server runs has 32-bit integers.  If not, you need to change this.maxneg to be the largest negative ("smallest"?) integer available.
  19998. 38
  19999. 5
  20000. 4
  20001. 2
  20002. 0
  20003. 10857
  20004. 0
  20005. 743841611
  20006. 2
  20007. 1
  20008. #36
  20009. Quota-Log
  20010.  
  20011. 0
  20012. 38
  20013. -1
  20014. -1
  20015. -1
  20016. 46
  20017. -1
  20018. 31
  20019. 1
  20020. init_for_core
  20021. 38
  20022. 173
  20023. -1
  20024. 0
  20025. 18
  20026. 4
  20027. 0
  20028. 38
  20029. 5
  20030. 0
  20031. -1464686259
  20032. 38
  20033. 1
  20034. 4
  20035. 0
  20036. 38
  20037. 0
  20038. 0
  20039. 1
  20040. 38
  20041. 5
  20042. 2
  20043. %n (%#) can't send to moderated list %t (%[#t]) directly.
  20044. 38
  20045. 5
  20046. 4
  20047. 0
  20048. 38
  20049. 5
  20050. 4
  20051. 0
  20052. 38
  20053. 5
  20054. 4
  20055. 1
  20056. 1
  20057. 2
  20058. 38
  20059. 1
  20060. 4
  20061. 2
  20062. 1
  20063. 2
  20064. 1
  20065. 36
  20066. 38
  20067. 1
  20068. 0
  20069. 2592000
  20070. 38
  20071. 5
  20072. 0
  20073. -1464686259
  20074. 38
  20075. 1
  20076. 4
  20077. 2
  20078. 4
  20079. 2
  20080. 0
  20081. 1
  20082. 4
  20083. 6
  20084. 0
  20085. -1465032313
  20086. 2
  20087. Bob (#2)
  20088. 2
  20089. *Quota-Log (#36)
  20090. 2
  20091. @quota builder (#228) 200 (from 0)
  20092. 2
  20093.  
  20094. 2
  20095. Reason for quota increase: (none).
  20096. 4
  20097. 2
  20098. 0
  20099. 2
  20100. 4
  20101. 6
  20102. 0
  20103. -1464686259
  20104. 2
  20105. Bob (#2)
  20106. 2
  20107. *Quota-Log (#36)
  20108. 2
  20109. @quota Bob (#2) 100 (from 0)
  20110. 2
  20111.  
  20112. 2
  20113. Reason for quota increase: (none).
  20114. 38
  20115. 0
  20116. 5
  20117. 38
  20118. 5
  20119. 5
  20120. 38
  20121. 5
  20122. 5
  20123. 38
  20124. 4
  20125. 4
  20126. 3
  20127. 2
  20128. Quota-Log
  20129. 2
  20130. Quota_Log
  20131. 2
  20132. QL
  20133. 38
  20134. 1
  20135. 2
  20136. Record of whose quota has been messed with and why.
  20137. 38
  20138. 5
  20139. 4
  20140. 2
  20141. 0
  20142. 72513
  20143. 0
  20144. 743970005
  20145. 2
  20146. 1
  20147. #37
  20148. you
  20149.  
  20150. 16
  20151. 38
  20152. -1
  20153. -1
  20154. -1
  20155. 76
  20156. -1
  20157. -1
  20158. 3
  20159. verb_sub
  20160. 38
  20161. 173
  20162. -1
  20163. say_action
  20164. 38
  20165. 165
  20166. -1
  20167. fixpos
  20168. 38
  20169. 173
  20170. -1
  20171. 1
  20172. conjugations
  20173. 16
  20174. 4
  20175. 4
  20176. 4
  20177. 2
  20178. 2
  20179. is
  20180. 2
  20181. are
  20182. 4
  20183. 2
  20184. 2
  20185. was
  20186. 2
  20187. were
  20188. 4
  20189. 2
  20190. 2
  20191. does
  20192. 2
  20193. do
  20194. 4
  20195. 2
  20196. 2
  20197. has
  20198. 2
  20199. have
  20200. 38
  20201. 1
  20202. 2
  20203. 2nd
  20204. 38
  20205. 5
  20206. 2
  20207. Yours
  20208. 38
  20209. 5
  20210. 2
  20211. yours
  20212. 38
  20213. 5
  20214. 2
  20215. Your
  20216. 38
  20217. 5
  20218. 2
  20219. your
  20220. 38
  20221. 5
  20222. 2
  20223. Yourself
  20224. 38
  20225. 5
  20226. 2
  20227. yourself
  20228. 38
  20229. 5
  20230. 2
  20231. You
  20232. 38
  20233. 5
  20234. 2
  20235. you
  20236. 38
  20237. 5
  20238. 2
  20239. You
  20240. 38
  20241. 5
  20242. 2
  20243. you
  20244. 38
  20245. 5
  20246. 5
  20247. 38
  20248. 4
  20249. 4
  20250. 1
  20251. 2
  20252. you
  20253. 38
  20254. 5
  20255. 4
  20256. 1
  20257. 2
  20258. an object useful for pronoun substitution
  20259. 38
  20260. 5
  20261. 4
  20262. 2
  20263. 0
  20264. 3130
  20265. 0
  20266. 743624380
  20267. 2
  20268. 1
  20269. #38
  20270. Hacker
  20271.  
  20272. 19
  20273. 38
  20274. -1
  20275. -1
  20276. -1
  20277. 59
  20278. -1
  20279. 71
  20280. 0
  20281. 0
  20282. 61
  20283. 5
  20284. 38
  20285. 1
  20286. 5
  20287. 38
  20288. 5
  20289. 5
  20290. 38
  20291. 5
  20292. 5
  20293. 38
  20294. 5
  20295. 5
  20296. 38
  20297. 5
  20298. 4
  20299. 0
  20300. 38
  20301. 1
  20302. 5
  20303. 2
  20304. 0
  20305. 5
  20306. 38
  20307. 5
  20308. 5
  20309. 2
  20310. 0
  20311. 5
  20312. 2
  20313. 1
  20314. 0
  20315. 0
  20316. 38
  20317. 5
  20318. 5
  20319. 38
  20320. 5
  20321. 5
  20322. 38
  20323. 1
  20324. 5
  20325. 38
  20326. 1
  20327. 5
  20328. 38
  20329. 0
  20330. 5
  20331. 38
  20332. 1
  20333. 5
  20334. 38
  20335. 5
  20336. 0
  20337. 0
  20338. 2
  20339. 1
  20340. 5
  20341. 38
  20342. 1
  20343. 1
  20344. 18105
  20345. 38
  20346. 4
  20347. 5
  20348. 2
  20349. 0
  20350. 5
  20351. 2
  20352. 0
  20353. 5
  20354. 38
  20355. 5
  20356. 4
  20357. 0
  20358. 38
  20359. 4
  20360. 5
  20361. 38
  20362. 5
  20363. 4
  20364. 0
  20365. 38
  20366. 4
  20367. 5
  20368. 38
  20369. 4
  20370. 5
  20371. 38
  20372. 5
  20373. 5
  20374. 38
  20375. 5
  20376. 5
  20377. 38
  20378. 5
  20379. 5
  20380. 38
  20381. 5
  20382. 5
  20383. 38
  20384. 5
  20385. 5
  20386. 38
  20387. 5
  20388. 5
  20389. 38
  20390. 5
  20391. 5
  20392. 38
  20393. 5
  20394. 5
  20395. 38
  20396. 5
  20397. 4
  20398. 2
  20399. 0
  20400. 0
  20401. 0
  20402. 0
  20403. 38
  20404. 4
  20405. 5
  20406. 38
  20407. 4
  20408. 0
  20409. 750802956
  20410. 2
  20411. 1
  20412. 0
  20413. 10628
  20414. 2
  20415. 0
  20416. 5
  20417. 38
  20418. 5
  20419. 5
  20420. 38
  20421. 5
  20422. 5
  20423. 38
  20424. 5
  20425. 5
  20426. 38
  20427. 5
  20428. 5
  20429. 38
  20430. 5
  20431. 5
  20432. 38
  20433. 5
  20434. 5
  20435. 38
  20436. 5
  20437. 5
  20438. 38
  20439. 5
  20440. 5
  20441. 38
  20442. 5
  20443. 1
  20444. -1
  20445. 38
  20446. 5
  20447. 0
  20448. 0
  20449. 2
  20450. 0
  20451. 5
  20452. 38
  20453. 5
  20454. 5
  20455. 38
  20456. 5
  20457. 5
  20458. 38
  20459. 5
  20460. 5
  20461. 38
  20462. 5
  20463. 5
  20464. 38
  20465. 5
  20466. 0
  20467. 0
  20468. 2
  20469. 1
  20470. 5
  20471. 38
  20472. 4
  20473. 4
  20474. 1
  20475. 2
  20476. Hacker
  20477. 2
  20478. 1
  20479. 2
  20480. You see a player who should type '@describe me as ...'.
  20481. 38
  20482. 5
  20483. 4
  20484. 2
  20485. 0
  20486. 1598
  20487. 0
  20488. 744012273
  20489. 2
  20490. 1
  20491. #39
  20492. Generic Database
  20493.  
  20494. 144
  20495. 38
  20496. -1
  20497. -1
  20498. -1
  20499. 1
  20500. 41
  20501. 32
  20502. 19
  20503. find find_key
  20504. 38
  20505. 173
  20506. -1
  20507. find_exact
  20508. 38
  20509. 173
  20510. -1
  20511. find_all find_all_keys
  20512. 38
  20513. 173
  20514. -1
  20515. _only
  20516. 38
  20517. 173
  20518. -1
  20519. _every
  20520. 38
  20521. 173
  20522. -1
  20523. _every_key
  20524. 38
  20525. 173
  20526. -1
  20527. insert
  20528. 38
  20529. 173
  20530. -1
  20531. delete
  20532. 38
  20533. 173
  20534. -1
  20535. delete2
  20536. 38
  20537. 173
  20538. -1
  20539. set_node
  20540. 38
  20541. 173
  20542. -1
  20543. make_node
  20544. 2
  20545. 173
  20546. -1
  20547. kill_node
  20548. 2
  20549. 173
  20550. -1
  20551. clearall
  20552. 2
  20553. 173
  20554. -1
  20555. clearall_big
  20556. 38
  20557. 173
  20558. -1
  20559. _kill_subtrees
  20560. 38
  20561. 173
  20562. -1
  20563. depth
  20564. 38
  20565. 173
  20566. -1
  20567. count_entries
  20568. 38
  20569. 173
  20570. -1
  20571. count_chars
  20572. 38
  20573. 173
  20574. -1
  20575. count
  20576. 38
  20577. 153
  20578. 3
  20579. 3
  20580. node_perms
  20581. data
  20582.  
  20583. 7
  20584. 2
  20585. r
  20586. 38
  20587. 5
  20588. 0
  20589. 4
  20590. 38
  20591. 1
  20592. 4
  20593. 4
  20594. 2
  20595.  
  20596. 2
  20597.  
  20598. 4
  20599. 0
  20600. 4
  20601. 0
  20602. 38
  20603. 0
  20604. 5
  20605. 38
  20606. 4
  20607. 4
  20608. 1
  20609. 2
  20610. Generic Database
  20611. 38
  20612. 5
  20613. 2
  20614. A generic `database' (well, really more like a string-indexed array if you want the truth...). See `help $generic_db' for details.
  20615. 38
  20616. 5
  20617. 4
  20618. 2
  20619. 0
  20620. 17561
  20621. 0
  20622. 743929162
  20623. 2
  20624. 1
  20625. #40
  20626. Everyman
  20627.  
  20628. 19
  20629. 38
  20630. -1
  20631. -1
  20632. -1
  20633. 6
  20634. -1
  20635. 33
  20636. 4
  20637. eval
  20638. 2
  20639. 165
  20640. -1
  20641. moveto
  20642. 38
  20643. 173
  20644. -1
  20645. eval_d
  20646. 2
  20647. 165
  20648. -1
  20649. call_verb
  20650. 2
  20651. 173
  20652. -1
  20653. 0
  20654. 56
  20655. 4
  20656. 0
  20657. 38
  20658. 1
  20659. 5
  20660. 2
  20661. 0
  20662. 5
  20663. 38
  20664. 5
  20665. 2
  20666. $no_one
  20667. 2
  20668. 0
  20669. 0
  20670. 2147483647
  20671. 2
  20672. 1
  20673. 0
  20674. 0
  20675. 38
  20676. 5
  20677. 5
  20678. 38
  20679. 5
  20680. 5
  20681. 38
  20682. 1
  20683. 5
  20684. 38
  20685. 1
  20686. 5
  20687. 38
  20688. 0
  20689. 5
  20690. 38
  20691. 1
  20692. 5
  20693. 38
  20694. 5
  20695. 4
  20696. 0
  20697. 2
  20698. 1
  20699. 5
  20700. 38
  20701. 1
  20702. 5
  20703. 38
  20704. 4
  20705. 5
  20706. 2
  20707. 0
  20708. 5
  20709. 2
  20710. 0
  20711. 5
  20712. 38
  20713. 5
  20714. 4
  20715. 0
  20716. 38
  20717. 4
  20718. 5
  20719. 38
  20720. 5
  20721. 5
  20722. 38
  20723. 4
  20724. 5
  20725. 38
  20726. 4
  20727. 5
  20728. 38
  20729. 5
  20730. 5
  20731. 38
  20732. 5
  20733. 5
  20734. 38
  20735. 5
  20736. 5
  20737. 38
  20738. 5
  20739. 2
  20740. ... no one out there to see it.
  20741. 38
  20742. 5
  20743. 5
  20744. 38
  20745. 5
  20746. 4
  20747. 1
  20748. 1
  20749. -1
  20750. 38
  20751. 5
  20752. 5
  20753. 38
  20754. 5
  20755. 5
  20756. 38
  20757. 5
  20758. 5
  20759. 38
  20760. 4
  20761. 5
  20762. 38
  20763. 4
  20764. 0
  20765. 750802956
  20766. 2
  20767. 1
  20768. 0
  20769. 0
  20770. 2
  20771. 0
  20772. 5
  20773. 38
  20774. 5
  20775. 5
  20776. 38
  20777. 5
  20778. 5
  20779. 38
  20780. 5
  20781. 5
  20782. 38
  20783. 5
  20784. 5
  20785. 38
  20786. 5
  20787. 5
  20788. 38
  20789. 5
  20790. 5
  20791. 38
  20792. 5
  20793. 5
  20794. 38
  20795. 5
  20796. 5
  20797. 38
  20798. 5
  20799. 1
  20800. -1
  20801. 38
  20802. 5
  20803. 0
  20804. 0
  20805. 2
  20806. 0
  20807. 5
  20808. 38
  20809. 5
  20810. 5
  20811. 38
  20812. 5
  20813. 5
  20814. 38
  20815. 5
  20816. 5
  20817. 38
  20818. 5
  20819. 5
  20820. 38
  20821. 5
  20822. 0
  20823. 0
  20824. 2
  20825. 1
  20826. 5
  20827. 38
  20828. 4
  20829. 4
  20830. 4
  20831. 2
  20832. Everyman
  20833. 2
  20834. everyone
  20835. 2
  20836. no_one
  20837. 2
  20838. noone
  20839. 2
  20840. 1
  20841. 2
  20842. ... He never even got to go to Disneyland.
  20843. 38
  20844. 5
  20845. 4
  20846. 2
  20847. 0
  20848. 3148
  20849. 0
  20850. 743839366
  20851. 2
  20852. 1
  20853. #41
  20854. Player Database
  20855.  
  20856. 16
  20857. 38
  20858. -1
  20859. -1
  20860. -1
  20861. 39
  20862. -1
  20863. 27
  20864. 5
  20865. load
  20866. 38
  20867. 173
  20868. -1
  20869. check
  20870. 38
  20871. 45
  20872. -1
  20873. init_for_core
  20874. 38
  20875. 173
  20876. -1
  20877. available
  20878. 38
  20879. 173
  20880. -1
  20881. suspend_restart
  20882. 38
  20883. 173
  20884. -1
  20885. 17
  20886. stupid_names
  20887. frozen
  20888. reserved
  20889.  H
  20890.  e
  20891.  n
  20892.  P
  20893.  U
  20894.  D
  20895.  Du
  20896.  b
  20897.  de
  20898.  dem
  20899.  m
  20900.  t
  20901.  Th
  20902.  Tr
  20903. 24
  20904. 4
  20905. 27
  20906. 2
  20907. with
  20908. 2
  20909. using
  20910. 2
  20911. at
  20912. 2
  20913. to
  20914. 2
  20915. in
  20916. 2
  20917. into
  20918. 2
  20919. on
  20920. 2
  20921. onto
  20922. 2
  20923. upon
  20924. 2
  20925. out
  20926. 2
  20927. from
  20928. 2
  20929. inside
  20930. 2
  20931. over
  20932. 2
  20933. through
  20934. 2
  20935. under
  20936. 2
  20937. underneath
  20938. 2
  20939. beneath
  20940. 2
  20941. behind
  20942. 2
  20943. beside
  20944. 2
  20945. for
  20946. 2
  20947. about
  20948. 2
  20949. is
  20950. 2
  20951. as
  20952. 2
  20953. off
  20954. 2
  20955. of
  20956. 2
  20957. me
  20958. 2
  20959. you
  20960. 38
  20961. 5
  20962. 0
  20963. 0
  20964. 38
  20965. 5
  20966. 4
  20967. 0
  20968. 38
  20969. 1
  20970. 4
  20971. 4
  20972. 2
  20973.  
  20974. 2
  20975.  
  20976. 4
  20977. 2
  20978. 2
  20979. Hacker
  20980. 2
  20981. housekeeper
  20982. 4
  20983. 2
  20984. 1
  20985. 38
  20986. 1
  20987. 71
  20988. 38
  20989. 1
  20990. 4
  20991. 4
  20992. 2
  20993. very
  20994. 2
  20995.  
  20996. 4
  20997. 2
  20998. 2
  20999. everyone
  21000. 2
  21001. Everyman
  21002. 4
  21003. 2
  21004. 1
  21005. 40
  21006. 1
  21007. 40
  21008. 38
  21009. 1
  21010. 4
  21011. 4
  21012. 2
  21013. o
  21014. 2
  21015.  
  21016. 4
  21017. 2
  21018. 2
  21019. noone
  21020. 2
  21021. no_one
  21022. 4
  21023. 2
  21024. 1
  21025. 40
  21026. 1
  21027. 40
  21028. 38
  21029. 1
  21030. 4
  21031. 4
  21032. 2
  21033. assionate
  21034. 2
  21035.  
  21036. 4
  21037. 2
  21038. 2
  21039. Passionate
  21040. 2
  21041. Passionate_Guest
  21042. 4
  21043. 2
  21044. 1
  21045. 84
  21046. 1
  21047. 84
  21048. 38
  21049. 1
  21050. 4
  21051. 4
  21052. 2
  21053. gly
  21054. 2
  21055.  
  21056. 4
  21057. 2
  21058. 2
  21059. Ugly
  21060. 2
  21061. Ugly_Guest
  21062. 4
  21063. 2
  21064. 1
  21065. 85
  21066. 1
  21067. 85
  21068. 38
  21069. 1
  21070. 4
  21071. 4
  21072. 2
  21073.  
  21074. 2
  21075. ue
  21076. 4
  21077. 0
  21078. 4
  21079. 0
  21080. 38
  21081. 1
  21082. 4
  21083. 4
  21084. 2
  21085. sty
  21086. 2
  21087.  
  21088. 4
  21089. 2
  21090. 2
  21091. Dusty
  21092. 2
  21093. Dusty_Guest
  21094. 4
  21095. 2
  21096. 1
  21097. 86
  21098. 1
  21099. 86
  21100. 38
  21101. 1
  21102. 4
  21103. 4
  21104. 2
  21105.  
  21106. 2
  21107.  
  21108. 4
  21109. 3
  21110. 2
  21111. Bob
  21112. 2
  21113. Bill_Enright
  21114. 2
  21115. builder
  21116. 4
  21117. 3
  21118. 1
  21119. 2
  21120. 1
  21121. 77
  21122. 1
  21123. 228
  21124. 38
  21125. 1
  21126. 4
  21127. 4
  21128. 2
  21129.  
  21130. 2
  21131. m
  21132. 4
  21133. 1
  21134. 2
  21135. Dead_Meat
  21136. 4
  21137. 1
  21138. 1
  21139. 79
  21140. 38
  21141. 1
  21142. 4
  21143. 4
  21144. 2
  21145. olish
  21146. 2
  21147.  
  21148. 4
  21149. 2
  21150. 2
  21151. demolished
  21152. 2
  21153. demolish
  21154. 4
  21155. 2
  21156. 1
  21157. 77
  21158. 1
  21159. 77
  21160. 38
  21161. 1
  21162. 4
  21163. 4
  21164. 2
  21165. a
  21166. 2
  21167.  
  21168. 4
  21169. 2
  21170. 2
  21171. man
  21172. 2
  21173. Mark
  21174. 4
  21175. 2
  21176. 1
  21177. 77
  21178. 1
  21179. 154
  21180. 38
  21181. 1
  21182. 4
  21183. 4
  21184. 2
  21185.  
  21186. 2
  21187. hr
  21188. 4
  21189. 0
  21190. 4
  21191. 0
  21192. 38
  21193. 1
  21194. 4
  21195. 4
  21196. 2
  21197. e_
  21198. 2
  21199.  
  21200. 4
  21201. 2
  21202. 2
  21203. the_
  21204. 2
  21205. The_Demolished_Man
  21206. 4
  21207. 2
  21208. 1
  21209. 77
  21210. 1
  21211. 77
  21212. 38
  21213. 1
  21214. 4
  21215. 4
  21216. 2
  21217. ygve
  21218. 2
  21219.  
  21220. 4
  21221. 2
  21222. 2
  21223. Trygve_Isaacson
  21224. 2
  21225. Trygve
  21226. 4
  21227. 2
  21228. 1
  21229. 337
  21230. 1
  21231. 337
  21232. 38
  21233. 1
  21234. 5
  21235. 38
  21236. 5
  21237. 5
  21238. 38
  21239. 1
  21240. 4
  21241. 4
  21242. 2
  21243.  
  21244. 2
  21245. HenPUDbmt
  21246. 4
  21247. 4
  21248. 2
  21249. LiverSpot
  21250. 2
  21251. shelby
  21252. 2
  21253. John_Louch
  21254. 2
  21255. Guest
  21256. 4
  21257. 4
  21258. 1
  21259. 147
  21260. 1
  21261. 346
  21262. 1
  21263. 147
  21264. 1
  21265. 83
  21266. 38
  21267. 0
  21268. 5
  21269. 38
  21270. 4
  21271. 4
  21272. 3
  21273. 2
  21274. player_db
  21275. 2
  21276. plyrdb
  21277. 2
  21278. pdb
  21279. 38
  21280. 5
  21281. 4
  21282. 2
  21283. 2
  21284. A database containing all player names and aliases.  
  21285. 2
  21286. See `help $player_db' for more information.
  21287. 38
  21288. 5
  21289. 4
  21290. 2
  21291. 0
  21292. 475926
  21293. 0
  21294. 743670063
  21295. 2
  21296. 1
  21297. #42
  21298. permissions utilities
  21299.  
  21300. 24
  21301. 2
  21302. -1
  21303. -1
  21304. -1
  21305. 1
  21306. -1
  21307. 60
  21308. 4
  21309. controls
  21310. 2
  21311. 173
  21312. -1
  21313. apply
  21314. 38
  21315. 173
  21316. -1
  21317. caller
  21318. 2
  21319. 173
  21320. -1
  21321. controls_prop controls_property
  21322. 2
  21323. 165
  21324. -1
  21325. 0
  21326. 4
  21327. 5
  21328. 2
  21329. 4
  21330. 5
  21331. 2
  21332. 5
  21333. 5
  21334. 2
  21335. 5
  21336. 4
  21337. 2
  21338. 0
  21339. 1842
  21340. 0
  21341. 743619438
  21342. 2
  21343. 1
  21344. #43
  21345. gender utilities
  21346.  
  21347. 16
  21348. 38
  21349. -1
  21350. -1
  21351. -1
  21352. 1
  21353. -1
  21354. 76
  21355. 8
  21356. set
  21357. 2
  21358. 165
  21359. -1
  21360. add
  21361. 2
  21362. 173
  21363. -1
  21364. get_pronoun
  21365. 38
  21366. 165
  21367. -1
  21368. get_conj*ugation
  21369. 38
  21370. 165
  21371. -1
  21372. _verb_plural
  21373. 38
  21374. 173
  21375. -1
  21376. _verb_singular
  21377. 38
  21378. 165
  21379. -1
  21380. _do
  21381. 38
  21382. 165
  21383. -1
  21384. pronoun_sub
  21385. 2
  21386. 173
  21387. -1
  21388. 15
  21389. is_plural
  21390. have
  21391. be
  21392. pronouns
  21393. genders
  21394. ps
  21395. po
  21396. pp
  21397. pq
  21398. pr
  21399. psc
  21400. poc
  21401. ppc
  21402. pqc
  21403. prc
  21404. 19
  21405. 4
  21406. 11
  21407. 0
  21408. 0
  21409. 0
  21410. 0
  21411. 0
  21412. 0
  21413. 0
  21414. 0
  21415. 0
  21416. 0
  21417. 0
  21418. 0
  21419. 0
  21420. 1
  21421. 0
  21422. 1
  21423. 0
  21424. 1
  21425. 0
  21426. 1
  21427. 0
  21428. 1
  21429. 38
  21430. 5
  21431. 4
  21432. 11
  21433. 2
  21434. has
  21435. 2
  21436. has
  21437. 2
  21438. has
  21439. 2
  21440. has
  21441. 2
  21442. has
  21443. 2
  21444. has
  21445. 2
  21446. have
  21447. 2
  21448. have
  21449. 2
  21450. have
  21451. 2
  21452. have
  21453. 2
  21454. have
  21455. 38
  21456. 5
  21457. 4
  21458. 11
  21459. 2
  21460. is
  21461. 2
  21462. is
  21463. 2
  21464. is
  21465. 2
  21466. is
  21467. 2
  21468. is
  21469. 2
  21470. is
  21471. 2
  21472. are
  21473. 2
  21474. am
  21475. 2
  21476. are
  21477. 2
  21478. are
  21479. 2
  21480. are
  21481. 38
  21482. 5
  21483. 4
  21484. 10
  21485. 2
  21486. ps
  21487. 2
  21488. po
  21489. 2
  21490. pp
  21491. 2
  21492. pq
  21493. 2
  21494. pr
  21495. 2
  21496. psc
  21497. 2
  21498. poc
  21499. 2
  21500. ppc
  21501. 2
  21502. pqc
  21503. 2
  21504. prc
  21505. 38
  21506. 5
  21507. 4
  21508. 10
  21509. 2
  21510. neuter
  21511. 2
  21512. male
  21513. 2
  21514. female
  21515. 2
  21516. either
  21517. 2
  21518. Spivak
  21519. 2
  21520. splat
  21521. 2
  21522. plural
  21523. 2
  21524. egotistical
  21525. 2
  21526. royal
  21527. 2
  21528. 2nd
  21529. 38
  21530. 5
  21531. 4
  21532. 10
  21533. 2
  21534. it
  21535. 2
  21536. he
  21537. 2
  21538. she
  21539. 2
  21540. s/he
  21541. 2
  21542. e
  21543. 2
  21544. *e
  21545. 2
  21546. they
  21547. 2
  21548. I
  21549. 2
  21550. we
  21551. 2
  21552. you
  21553. 38
  21554. 5
  21555. 4
  21556. 10
  21557. 2
  21558. it
  21559. 2
  21560. him
  21561. 2
  21562. her
  21563. 2
  21564. him/her
  21565. 2
  21566. em
  21567. 2
  21568. h*
  21569. 2
  21570. them
  21571. 2
  21572. me
  21573. 2
  21574. us
  21575. 2
  21576. you
  21577. 38
  21578. 5
  21579. 4
  21580. 10
  21581. 2
  21582. its
  21583. 2
  21584. his
  21585. 2
  21586. her
  21587. 2
  21588. his/her
  21589. 2
  21590. eir
  21591. 2
  21592. h*
  21593. 2
  21594. their
  21595. 2
  21596. my
  21597. 2
  21598. our
  21599. 2
  21600. your
  21601. 38
  21602. 5
  21603. 4
  21604. 10
  21605. 2
  21606. its
  21607. 2
  21608. his
  21609. 2
  21610. hers
  21611. 2
  21612. his/hers
  21613. 2
  21614. eirs
  21615. 2
  21616. h*s
  21617. 2
  21618. theirs
  21619. 2
  21620. mine
  21621. 2
  21622. ours
  21623. 2
  21624. yours
  21625. 38
  21626. 5
  21627. 4
  21628. 10
  21629. 2
  21630. itself
  21631. 2
  21632. himself
  21633. 2
  21634. herself
  21635. 2
  21636. (him/her)self
  21637. 2
  21638. eirself
  21639. 2
  21640. h*self
  21641. 2
  21642. themselves
  21643. 2
  21644. myself
  21645. 2
  21646. ourselves
  21647. 2
  21648. yourself
  21649. 38
  21650. 5
  21651. 4
  21652. 10
  21653. 2
  21654. It
  21655. 2
  21656. He
  21657. 2
  21658. She
  21659. 2
  21660. S/He
  21661. 2
  21662. E
  21663. 2
  21664. *E
  21665. 2
  21666. They
  21667. 2
  21668. I
  21669. 2
  21670. We
  21671. 2
  21672. You
  21673. 38
  21674. 5
  21675. 4
  21676. 10
  21677. 2
  21678. It
  21679. 2
  21680. Him
  21681. 2
  21682. Her
  21683. 2
  21684. Him/Her
  21685. 2
  21686. Em
  21687. 2
  21688. H*
  21689. 2
  21690. Them
  21691. 2
  21692. Me
  21693. 2
  21694. Us
  21695. 2
  21696. You
  21697. 38
  21698. 5
  21699. 4
  21700. 10
  21701. 2
  21702. Its
  21703. 2
  21704. His
  21705. 2
  21706. Her
  21707. 2
  21708. His/Her
  21709. 2
  21710. Eir
  21711. 2
  21712. H*
  21713. 2
  21714. Their
  21715. 2
  21716. My
  21717. 2
  21718. Our
  21719. 2
  21720. Your
  21721. 38
  21722. 5
  21723. 4
  21724. 10
  21725. 2
  21726. Its
  21727. 2
  21728. His
  21729. 2
  21730. Hers
  21731. 2
  21732. His/Hers
  21733. 2
  21734. Eirs
  21735. 2
  21736. H*s
  21737. 2
  21738. Theirs
  21739. 2
  21740. Mine
  21741. 2
  21742. Ours
  21743. 2
  21744. Yours
  21745. 38
  21746. 5
  21747. 4
  21748. 10
  21749. 2
  21750. Itself
  21751. 2
  21752. Himself
  21753. 2
  21754. Herself
  21755. 2
  21756. (Him/Her)self
  21757. 2
  21758. Eirself
  21759. 2
  21760. H*self
  21761. 2
  21762. Themselves
  21763. 2
  21764. Myself
  21765. 2
  21766. Ourselves
  21767. 2
  21768. Yourself
  21769. 38
  21770. 5
  21771. 5
  21772. 38
  21773. 4
  21774. 4
  21775. 1
  21776. 2
  21777. Gender_Utilities
  21778. 38
  21779. 5
  21780. 4
  21781. 18
  21782. 2
  21783. Defines the list of standard genders, the default pronouns for each, and routines for adding or setting pronoun properties on any gendered object.
  21784. 2
  21785.  
  21786. 2
  21787. Properties:
  21788. 2
  21789.   .genders  -- list of standard genders
  21790. 2
  21791.   .pronouns -- list of pronoun properties
  21792. 2
  21793.   .ps .po .pp .pq .pr .psc .poc .ppc .pqc .prc 
  21794. 2
  21795.             -- lists of pronouns for each of the standard genders
  21796. 2
  21797.  
  21798. 2
  21799.   If foo is of gender this.gender[n], 
  21800. 2
  21801.   then the default pronoun foo.p is this.p[n] 
  21802. 2
  21803.   (where p is one of ps/po/pp/pq...)
  21804. 2
  21805.  
  21806. 2
  21807. Verbs:
  21808. 2
  21809.   :set(object,newgender) -- changes pronoun properties to match new gender.
  21810. 2
  21811.   :add(object[,perms[,owner]]) -- adds pronoun properties to object.
  21812. 2
  21813.  
  21814. 2
  21815.   :get_pronoun     (which,object) -- return pronoun for a given object
  21816. 2
  21817.   :get_conj*ugation(verbspec,object) -- return appropriately conjugated verb
  21818. 38
  21819. 5
  21820. 4
  21821. 2
  21822. 0
  21823. 14347
  21824. 0
  21825. 743668858
  21826. 2
  21827. 1
  21828. #44
  21829. time utilities
  21830.  
  21831. 16
  21832. 38
  21833. -1
  21834. -1
  21835. -1
  21836. 1
  21837. -1
  21838. 47
  21839. 16
  21840. day
  21841. 38
  21842. 13
  21843. -1
  21844. month
  21845. 38
  21846. 13
  21847. -1
  21848. ampm
  21849. 38
  21850. 13
  21851. -1
  21852. to_seconds
  21853. 38
  21854. 173
  21855. -1
  21856. sun
  21857. 38
  21858. 173
  21859. -1
  21860. from_ctime
  21861. 38
  21862. 173
  21863. -1
  21864. dhms dayshoursminutesseconds
  21865. 38
  21866. 173
  21867. -1
  21868. english_time
  21869. 38
  21870. 173
  21871. -1
  21872. from_day
  21873. 38
  21874. 173
  21875. -1
  21876. from_month
  21877. 38
  21878. 173
  21879. -1
  21880. dst_midnight
  21881. 38
  21882. 173
  21883. -1
  21884. time_sub
  21885. 38
  21886. 173
  21887. -1
  21888. mmddyy ddmmyy
  21889. 38
  21890. 173
  21891. -1
  21892. parse_english_time_interval
  21893. 38
  21894. 173
  21895. -1
  21896. seconds_until_date
  21897. 38
  21898. 165
  21899. -1
  21900. seconds_until_time
  21901. 38
  21902. 165
  21903. -1
  21904. 12
  21905. monthlens
  21906. timezones
  21907. stsd
  21908. ctcd
  21909. ct
  21910. corr
  21911. dayabbrs
  21912. days
  21913. months
  21914. monthabbrs
  21915. zones
  21916. time_units
  21917. 16
  21918. 4
  21919. 12
  21920. 0
  21921. 31
  21922. 0
  21923. 28
  21924. 0
  21925. 31
  21926. 0
  21927. 30
  21928. 0
  21929. 31
  21930. 0
  21931. 30
  21932. 0
  21933. 31
  21934. 0
  21935. 31
  21936. 0
  21937. 30
  21938. 0
  21939. 31
  21940. 0
  21941. 30
  21942. 0
  21943. 31
  21944. 38
  21945. 5
  21946. 4
  21947. 15
  21948. 4
  21949. 2
  21950. 2
  21951. AuEST
  21952. 0
  21953. -10
  21954. 4
  21955. 2
  21956. 2
  21957. AuCST
  21958. 0
  21959. -9
  21960. 4
  21961. 2
  21962. 2
  21963. AuWST
  21964. 0
  21965. -8
  21966. 4
  21967. 2
  21968. 2
  21969. WET
  21970. 0
  21971. -1
  21972. 4
  21973. 2
  21974. 2
  21975. GMT
  21976. 0
  21977. 0
  21978. 4
  21979. 2
  21980. 2
  21981. AST
  21982. 0
  21983. 4
  21984. 4
  21985. 2
  21986. 2
  21987. EDT
  21988. 0
  21989. 4
  21990. 4
  21991. 2
  21992. 2
  21993. EST
  21994. 0
  21995. 5
  21996. 4
  21997. 2
  21998. 2
  21999. CDT
  22000. 0
  22001. 5
  22002. 4
  22003. 2
  22004. 2
  22005. CST
  22006. 0
  22007. 6
  22008. 4
  22009. 2
  22010. 2
  22011. MDT
  22012. 0
  22013. 6
  22014. 4
  22015. 2
  22016. 2
  22017. MST
  22018. 0
  22019. 7
  22020. 4
  22021. 2
  22022. 2
  22023. PDT
  22024. 0
  22025. 7
  22026. 4
  22027. 2
  22028. 2
  22029. PST
  22030. 0
  22031. 8
  22032. 4
  22033. 2
  22034. 2
  22035. HST
  22036. 0
  22037. 10
  22038. 38
  22039. 5
  22040. 0
  22041. 2427
  22042. 38
  22043. 5
  22044. 0
  22045. 7276
  22046. 38
  22047. 5
  22048. 0
  22049. 7934
  22050. 38
  22051. 5
  22052. 0
  22053. -122
  22054. 38
  22055. 5
  22056. 4
  22057. 7
  22058. 2
  22059. Sun
  22060. 2
  22061. Mon
  22062. 2
  22063. Tue
  22064. 2
  22065. Wed
  22066. 2
  22067. Thu
  22068. 2
  22069. Fri
  22070. 2
  22071. Sat
  22072. 38
  22073. 5
  22074. 4
  22075. 7
  22076. 2
  22077. Sunday
  22078. 2
  22079. Monday
  22080. 2
  22081. Tuesday
  22082. 2
  22083. Wednesday
  22084. 2
  22085. Thursday
  22086. 2
  22087. Friday
  22088. 2
  22089. Saturday
  22090. 38
  22091. 5
  22092. 4
  22093. 12
  22094. 2
  22095. January
  22096. 2
  22097. February
  22098. 2
  22099. March
  22100. 2
  22101. April
  22102. 2
  22103. May
  22104. 2
  22105. June
  22106. 2
  22107. July
  22108. 2
  22109. August
  22110. 2
  22111. September
  22112. 2
  22113. October
  22114. 2
  22115. November
  22116. 2
  22117. December
  22118. 38
  22119. 5
  22120. 4
  22121. 12
  22122. 2
  22123. Jan
  22124. 2
  22125. Feb
  22126. 2
  22127. Mar
  22128. 2
  22129. Apr
  22130. 2
  22131. May
  22132. 2
  22133. Jun
  22134. 2
  22135. Jul
  22136. 2
  22137. Aug
  22138. 2
  22139. Sep
  22140. 2
  22141. Oct
  22142. 2
  22143. Nov
  22144. 2
  22145. Dec
  22146. 38
  22147. 5
  22148. 4
  22149. 5
  22150. 4
  22151. 2
  22152. 4
  22153. 4
  22154. 2
  22155. est
  22156. 2
  22157. edt
  22158. 2
  22159. Massachusetts
  22160. 2
  22161. MA
  22162. 0
  22163. 10800
  22164. 4
  22165. 2
  22166. 4
  22167. 2
  22168. 2
  22169. cst
  22170. 2
  22171. cdt
  22172. 0
  22173. 7200
  22174. 4
  22175. 2
  22176. 4
  22177. 2
  22178. 2
  22179. mst
  22180. 2
  22181. mdt
  22182. 0
  22183. 3600
  22184. 4
  22185. 2
  22186. 4
  22187. 5
  22188. 2
  22189. pst
  22190. 2
  22191. pdt
  22192. 2
  22193. California
  22194. 2
  22195. CA
  22196. 2
  22197. Lambda
  22198. 0
  22199. 0
  22200. 4
  22201. 2
  22202. 4
  22203. 1
  22204. 2
  22205. gmt
  22206. 0
  22207. 28800
  22208. 38
  22209. 5
  22210. 4
  22211. 7
  22212. 4
  22213. 4
  22214. 0
  22215. 31536000
  22216. 2
  22217. year
  22218. 2
  22219. years
  22220. 2
  22221. yrs
  22222. 4
  22223. 5
  22224. 0
  22225. 2678400
  22226. 2
  22227. month
  22228. 2
  22229. months
  22230. 2
  22231. mnths
  22232. 2
  22233. mo
  22234. 4
  22235. 5
  22236. 0
  22237. 604800
  22238. 2
  22239. week
  22240. 2
  22241. weeks
  22242. 2
  22243. wk
  22244. 2
  22245. wks
  22246. 4
  22247. 5
  22248. 0
  22249. 86400
  22250. 2
  22251. day
  22252. 2
  22253. days
  22254. 2
  22255. dy
  22256. 2
  22257. dys
  22258. 4
  22259. 5
  22260. 0
  22261. 3600
  22262. 2
  22263. hour
  22264. 2
  22265. hours
  22266. 2
  22267. hr
  22268. 2
  22269. hrs
  22270. 4
  22271. 5
  22272. 0
  22273. 60
  22274. 2
  22275. minute
  22276. 2
  22277. minutes
  22278. 2
  22279. min
  22280. 2
  22281. mins
  22282. 4
  22283. 5
  22284. 0
  22285. 1
  22286. 2
  22287. second
  22288. 2
  22289. seconds
  22290. 2
  22291. sec
  22292. 2
  22293. secs
  22294. 38
  22295. 5
  22296. 5
  22297. 38
  22298. 4
  22299. 4
  22300. 2
  22301. 2
  22302. time utilities
  22303. 2
  22304. time
  22305. 38
  22306. 5
  22307. 4
  22308. 30
  22309. 2
  22310.     Converting from seconds-since-1970    
  22311. 2
  22312. dhms          (time)                 => string ...DD:HH:MM:SS
  22313. 2
  22314. english_time  (time[, reference time)=> string of y, m, d, m, s
  22315. 2
  22316.  
  22317. 2
  22318.     Converting to seconds
  22319. 2
  22320. to_seconds    ("hh:mm:ss")           => seconds since 00:00:00
  22321. 2
  22322. from_ctime    (ctime)                => corresponding time-since-1970
  22323. 2
  22324. from_day      (day_of_week, which)   => time-since-1970 for the given day*
  22325. 2
  22326. from_month    (month, which)         => time-since-1970 for the given month*
  22327. 2
  22328.     (* the first midnight of that day/month)
  22329. 2
  22330. parse_english_time_interval("n1 u1 n2 u2...")
  22331. 2
  22332.                                      => seconds in interval
  22333. 2
  22334. seconds_until_time("hh:mm:ss")       => number of seconds from now until then
  22335. 2
  22336. seconds_until_date("month",day,"hh:mm:ss",flag 
  22337. 2
  22338.                                      => number of seconds from now until then
  22339. 2
  22340.                                         (see verb help for details)
  22341. 2
  22342.  
  22343. 2
  22344.     Converting to some standard English formats
  22345. 2
  22346. day           ([c]time)              => what day it is
  22347. 2
  22348. month         ([c]time)              => what month it is
  22349. 2
  22350. ampm          ([c]time[, precision]) => what time it is, with am or pm
  22351. 2
  22352. mmddyy        ([c]time)              => date in format MM/DD/YY
  22353. 2
  22354. ddmmyy        ([c]time)              => date in format DD/MM/YY
  22355. 2
  22356.  
  22357. 2
  22358.     Substitution
  22359. 2
  22360. time_sub      (string, time)         => substitute time information
  22361. 2
  22362.  
  22363. 2
  22364.     Miscellaneous
  22365. 2
  22366. sun           ([time])               => angle between sun and zenith
  22367. 2
  22368. dst_midnight  (time)                 
  22369. 38
  22370. 5
  22371. 4
  22372. 2
  22373. 0
  22374. 21697
  22375. 0
  22376. 743625666
  22377. 2
  22378. 1
  22379. #45
  22380. Editor Help
  22381.  
  22382. 16
  22383. 38
  22384. -1
  22385. -1
  22386. -1
  22387. 32
  22388. -1
  22389. 30
  22390. 0
  22391. 43
  22392. summary
  22393. edit-index
  22394. emote
  22395. say
  22396. delete
  22397. insert
  22398. view
  22399. depublish
  22400. perish
  22401. unpublish
  22402. publish
  22403. mode
  22404. enter
  22405. quit
  22406. unsubscribe
  22407. subscribe
  22408. reply-to
  22409. moo
  22410. find
  22411. edit
  22412. compile
  22413. save
  22414. showlists
  22415. subject
  22416. to
  22417. also-to
  22418. who
  22419. print
  22420. send
  22421. list
  22422. next
  22423. prev
  22424. subst
  22425. join
  22426. fill
  22427. move
  22428. copy
  22429. what
  22430. abort
  22431. done
  22432. pause
  22433. ranges
  22434. cc
  22435. 48
  22436. 4
  22437. 11
  22438. 2
  22439. You are inside an editor.  Do
  22440. 2
  22441.  
  22442. 2
  22443. look          -- for list of commands
  22444. 2
  22445. what          -- to find out what you're editing.
  22446. 2
  22447. list          -- to list out some portion of the text
  22448. 2
  22449. say / emote   -- to add new text to whatever you're editing
  22450. 2
  22451.  
  22452. 2
  22453. help edit-index -- for a full list of editor help topics
  22454. 2
  22455. help editors    -- for a general discussion about editors
  22456. 2
  22457. help moo        -- for the general MOO help summary (i.e., what you get by 
  22458. 2
  22459.                    typing `help' with no arguments from outside the editor).
  22460. 38
  22461. 5
  22462. 4
  22463. 2
  22464. 2
  22465. *index*
  22466. 2
  22467. Editor Help Topics
  22468. 38
  22469. 5
  22470. 4
  22471. 19
  22472. 2
  22473. Syntax: emote <text>
  22474. 2
  22475.         :<text>
  22476. 2
  22477.  
  22478. 2
  22479. (EDITOR)
  22480. 2
  22481. Appends <text> to the end of the line before the insertion point.
  22482. 2
  22483. The second form is equivalent to the first except that it doesn't strip leading blanks off of <text> (just as with the normal `emote' and `:' commands).
  22484. 2
  22485. The insertion point is left unmoved.
  22486. 2
  22487.  
  22488. 2
  22489.     >list .
  22490. 2
  22491.     _37_ Hello there
  22492. 2
  22493.     ^38^ Oh, I'm fine.
  22494. 2
  22495.     >:, how are you
  22496. 2
  22497.     Appended to line 37.
  22498. 2
  22499.     >:?
  22500. 2
  22501.     Appended to line 37.
  22502. 2
  22503.     >list .
  22504. 2
  22505.     _37_ Hello there, how are you?
  22506. 2
  22507.     ^38^ Oh, I'm fine.
  22508. 2
  22509.  
  22510. 38
  22511. 5
  22512. 4
  22513. 17
  22514. 2
  22515. Syntax: say <text>
  22516. 2
  22517.         "<text>
  22518. 2
  22519.  
  22520. 2
  22521. (EDITOR)
  22522. 2
  22523. Adds <text> to whatever you are editing.
  22524. 2
  22525. The second form is equivalent to the first except in that it doesn't strip leading blanks off of <text> (just as with the normal `say' and `"' commands).
  22526. 2
  22527.  
  22528. 2
  22529. The added text appears as a new line at the insertion point.  The insertion point, in turn, gets moved so as to be after the added text.  For example:
  22530. 2
  22531.  
  22532. 2
  22533.     >"first line
  22534. 2
  22535.     Line 1 added.
  22536. 2
  22537.     >"  second line"
  22538. 2
  22539.     Line 2 added.
  22540. 2
  22541.     >list
  22542. 2
  22543.       1: first line
  22544. 2
  22545.     __2_   second line"
  22546. 2
  22547.     ^^^^
  22548. 38
  22549. 5
  22550. 4
  22551. 5
  22552. 2
  22553. Syntax:  del*ete [<range>] 
  22554. 2
  22555.  
  22556. 2
  22557. (EDITOR)
  22558. 2
  22559. Deletes the specified range of lines
  22560. 2
  22561. <range> defaults to the line *before* the current insertion point.
  22562. 38
  22563. 5
  22564. 4
  22565. 21
  22566. 2
  22567. Syntax:  ins*ert [<ins>] ["<text>]
  22568. 2
  22569.          .                    (`.' == `insert' without arguments)
  22570. 2
  22571.  
  22572. 2
  22573. (EDITOR)
  22574. 2
  22575. Many editor commands refer to an "insertion point" which is (usually) the place right below where the most recent line was inserted.  The insertion point should really be thought of as sitting *between* lines.  In listings, the line above the insertion point is marked with `_' while the one below is marked with `^'.
  22576. 2
  22577.  
  22578. 2
  22579. The `insert' command, when given an argument, sets the insertion point.
  22580. 2
  22581. If <text> is provided, a new line will be created and inserted as with `say'.
  22582. 2
  22583. <ins>, both here and in other commands that require specifying an insertion point (e.g., copy/move), can be one of
  22584. 2
  22585.           
  22586. 2
  22587.     ^n   above line n
  22588. 2
  22589.      n   above line n
  22590. 2
  22591.     _n   below line n
  22592. 2
  22593.      $   at the end
  22594. 2
  22595.     ^$   before the last line
  22596. 2
  22597.    n^$   n lines before the end
  22598. 2
  22599.      .   the current insertion point  (i.e., `insert .' is a no-op)
  22600. 2
  22601.     +n   n lines below the current insertion point.
  22602. 2
  22603.     -n   n lines above the current insertion point.
  22604. 2
  22605.  
  22606. 2
  22607. For the truly perverse, there are other combinations that also work due to artifacts of the parsing process, but these might go away...
  22608. 38
  22609. 5
  22610. 4
  22611. 10
  22612. 2
  22613. Syntax:  view <player> [<range>] [nonum]
  22614. 2
  22615.          view
  22616. 2
  22617.  
  22618. 2
  22619. Prints some subset of the specified player's text.
  22620. 2
  22621. Said player must have previously made his text readable with `publish'.
  22622. 2
  22623. <ranges> are specified as in other commands (see `help ranges').
  22624. 2
  22625. References to the insertion point refer to wherever the other player has set his/her insertion point; you have no control over it.
  22626. 2
  22627. The default range is as in list.
  22628. 2
  22629.  
  22630. 2
  22631. If no arguments are given, this lists all of the players that have published anything in this editor.
  22632. 38
  22633. 5
  22634. 4
  22635. 2
  22636. 2
  22637. *forward*
  22638. 2
  22639. unpublish
  22640. 38
  22641. 5
  22642. 4
  22643. 2
  22644. 2
  22645. *forward*
  22646. 2
  22647. unpublish
  22648. 38
  22649. 5
  22650. 4
  22651. 5
  22652. 2
  22653. Syntax:  unpub*lish
  22654. 2
  22655.          depub*lish
  22656. 2
  22657.          perish
  22658. 2
  22659.  
  22660. 2
  22661. This command reverses the effects of `publish', making your text readable only by you.
  22662. 38
  22663. 5
  22664. 4
  22665. 6
  22666. 2
  22667. Syntax:  pub*lish
  22668. 2
  22669.  
  22670. 2
  22671. By default, only you (and wizards) can read the text you are editing.
  22672. 2
  22673. This command makes your text readable by the entire world (see `help view').
  22674. 2
  22675. This is useful if you need help from someone or if you just want to show off your programming acumen.
  22676. 2
  22677. Use `unpublish' to make your text private again.
  22678. 38
  22679. 5
  22680. 4
  22681. 12
  22682. 2
  22683. (NOTE EDITOR)
  22684. 2
  22685. Syntax:  mode
  22686. 2
  22687.          mode string
  22688. 2
  22689.          mode list
  22690. 2
  22691.          
  22692. 2
  22693. There are (currently) two modes the note editor can be in.
  22694. 2
  22695. One is string mode, in which if the text being edited is one line or less, 
  22696. 2
  22697. it will be saved as a single string (or an empty string) rather than as a list.
  22698. 2
  22699. The other is list mode, in which text is always saved as a list of strings.
  22700. 2
  22701. The mode is set when the text is first loaded (string mode if the text is a string, list mode otherwise), but can be changed using this command.
  22702. 2
  22703.  
  22704. 2
  22705. The first form above (i.e., without any arguments) reports the current mode.
  22706. 38
  22707. 5
  22708. 4
  22709. 12
  22710. 2
  22711. Syntax:  enter
  22712. 2
  22713.  
  22714. 2
  22715. (EDITOR)
  22716. 2
  22717. Enters a sequence of lines at the insertion point (see `help insert').
  22718. 2
  22719. This is similar to .program in that every line you type after the `enter' command is inserted verbatim into the text until you type a line with a single period (`.') on it.  This command is essentially for if you don't like the idea of putting " at the beginning of each line you type.  The only exceptions, i.e., lines that are not entered verbatim (aside from the `.' line), are
  22720. 2
  22721.  
  22722. 2
  22723.  - If you type a line whose sole text is `@abort', 
  22724. 2
  22725.    that aborts this command without making any changes to the text.  
  22726. 2
  22727.  - Any line whose first nonblank character is `.' and has additional text
  22728. 2
  22729.    is entered but with its first `.' stripped off.  
  22730. 2
  22731.  
  22732. 2
  22733. Thus, to enter a line whose text is `@abort', you could enter it as `.@abort'.
  22734. 38
  22735. 5
  22736. 4
  22737. 7
  22738. 2
  22739. Syntax:  q*uit
  22740. 2
  22741.          done
  22742. 2
  22743.          pause  
  22744. 2
  22745.  
  22746. 2
  22747. (EDITOR)
  22748. 2
  22749. Leaves the editor.  If you have unsaved text it will be there when you return (and in fact you will not be able to do anything else with this editor until you 'abort' or save the text).
  22750. 2
  22751.  
  22752. 38
  22753. 5
  22754. 4
  22755. 9
  22756. 2
  22757. Syntax: unsubscribe from <list-name>
  22758. 2
  22759.         unsubscribe <name>... from <list-name>
  22760. 2
  22761.  
  22762. 2
  22763. (MAILROOM)
  22764. 2
  22765. Remove yourself from the given mailing list.
  22766. 2
  22767. The second form removes arbitrary people from a mailing list.
  22768. 2
  22769. You can only do this if you own whatever is being removed or you own the list.
  22770. 2
  22771.  
  22772. 2
  22773. Use the `who' command to determine if you are on a given mailing list.
  22774. 38
  22775. 5
  22776. 4
  22777. 11
  22778. 2
  22779. Syntax: subscribe to <list-name>
  22780. 2
  22781.         subscribe [<name>...] to <list-name>
  22782. 2
  22783.  
  22784. 2
  22785. (MAILROOM)
  22786. 2
  22787. Add yourself to the given mailing list.  
  22788. 2
  22789. The second form adds arbitrary people to a mailing list.
  22790. 2
  22791. You can only do this if you own the list or if it is listed as [Public] and you own whatever is being added.
  22792. 2
  22793.  
  22794. 2
  22795. The first form of this command is probably obsolete since if <list-name> is public, you can already read it via `@mail on *<list-name>' and it's much better for the MOO if you do so.  `@mail-option +sticky' makes this even easier.
  22796. 2
  22797.  
  22798. 2
  22799. Use the `who' command to determine if you are on a given mailing list.
  22800. 38
  22801. 5
  22802. 4
  22803. 11
  22804. 2
  22805. Syntax:  reply-to [<recipients>]
  22806. 2
  22807.  
  22808. 2
  22809. (MAIL ROOM)
  22810. 2
  22811. Reports the current contents of the Reply-to: field of your message.
  22812. 2
  22813. With arguments, adds (or changes) the Reply-to: field.
  22814. 2
  22815.  
  22816. 2
  22817. When someone @answers a message, the Reply-to: field is checked first when determining to whom the reply should be sent --- see `help @answer'.
  22818. 2
  22819.  
  22820. 2
  22821. To clear the Reply-to: field, do
  22822. 2
  22823.  
  22824. 2
  22825.          reply-to ""
  22826. 38
  22827. 5
  22828. 4
  22829. 2
  22830. 2
  22831. *pass*
  22832. 2
  22833.  
  22834. 38
  22835. 5
  22836. 4
  22837. 9
  22838. 2
  22839. Syntax:  f*ind  /<str>[/[c][<ins>]]
  22840. 2
  22841.          /<str>[/[c][<ins>]]
  22842. 2
  22843.  
  22844. 2
  22845. Searches for the first line after <ins> containing <str>.  <ins> defaults to  the current insertion point (see `help insert' for how to specify other places).  With the first form, any character (not just `/') may be used as a delimiter.
  22846. 2
  22847. For the second form, you must use '/'.
  22848. 2
  22849.  
  22850. 2
  22851. The 'c' flag, if given, indicates that case is to be ignored while searching.
  22852. 2
  22853.  
  22854. 2
  22855. [Bug: With the second form, there are problems if the search string contains quotes, backslashes or a run of spaces.  The first whitespace will always be treated as a single space.  Likewise, quotes and backslashes occuring in the first word of the command (i.e., the "verb") need to be escaped with `\'.  Unfortunately it will not be possible to fix this until we get a new command parser.]
  22856. 38
  22857. 5
  22858. 4
  22859. 17
  22860. 2
  22861. (VERB EDITOR)
  22862. 2
  22863. Syntax:  edit <object>:<verb>
  22864. 2
  22865.  
  22866. 2
  22867. Changes what verb you are editing and loads the code for that verb
  22868. 2
  22869. into the editor. 
  22870. 2
  22871. Equivalent to @edit <object>:<verb>.
  22872. 2
  22873.  
  22874. 2
  22875. (NOTE EDITOR)
  22876. 2
  22877. Syntax:  edit <note-object>
  22878. 2
  22879.          edit <object>.<property>
  22880. 2
  22881.  
  22882. 2
  22883. Changes to a different note or a different object text property and 
  22884. 2
  22885. loads its text into the editor.
  22886. 2
  22887. These are equivalent to @notedit <note> or @notedit <object>.<property>
  22888. 2
  22889. respectively.
  22890. 2
  22891.  
  22892. 2
  22893. For both the verb-editor and note-editor commands, <object> will match on the room you came from, though if the room you came from was another editor, then all bets are off...
  22894. 38
  22895. 5
  22896. 4
  22897. 5
  22898. 2
  22899. Syntax:  compile [as <object>:<verb>]
  22900. 2
  22901.  
  22902. 2
  22903. (VERB EDITOR)
  22904. 2
  22905. Installs the new program into the system if there are no syntax errors.
  22906. 2
  22907. If a new object:verb is specified and actually turns out to exist, that <object>:<verb> becomes the default for subsequent compilations.
  22908. 38
  22909. 5
  22910. 4
  22911. 5
  22912. 2
  22913. Syntax:  save [<note-object>]
  22914. 2
  22915.          save [<object>.<property>]
  22916. 2
  22917.  
  22918. 2
  22919. (NOTE EDITOR)
  22920. 2
  22921. Installs the freshly edited text.  If <note> or <object>.<property> is specified, text is installed on that note or property instead of the original one.  In addition the new note or property becomes the default for future save commands.
  22922. 38
  22923. 5
  22924. 4
  22925. 4
  22926. 2
  22927. Syntax:  showlists
  22928. 2
  22929.  
  22930. 2
  22931. (MAIL ROOM)
  22932. 2
  22933. Print a list of the publically available mailing lists/archives and other non-player entities that can receive mail.
  22934. 38
  22935. 5
  22936. 4
  22937. 4
  22938. 2
  22939. Syntax:  subj*ect [<text>]
  22940. 2
  22941.  
  22942. 2
  22943. (MAIL ROOM)
  22944. 2
  22945. Specifies a Subject: line for your message.  If <text> is "", the Subject: line is removed.
  22946. 38
  22947. 5
  22948. 4
  22949. 6
  22950. 2
  22951. Syntax:  to [<recipients>]
  22952. 2
  22953.  
  22954. 2
  22955. (MAIL ROOM)
  22956. 2
  22957. Specifies a new set of recipients (the To: line) for your message.
  22958. 2
  22959. Recipient names not beginning with * are matched against the list of players.
  22960. 2
  22961. Recipient names beginning with * are interpreted as mailing-lists/archives/other types of non-person addresses and are matched against all such publically available objects (see `help showlists').  If the list you want to use isn't in the database (i.e., isn't located in the database ($mail_agent)) you need to refer to it by object id.
  22962. 38
  22963. 5
  22964. 4
  22965. 7
  22966. 2
  22967. Syntax:  also-to [<recipients>]
  22968. 2
  22969.  
  22970. 2
  22971. Synonym: cc
  22972. 2
  22973.  
  22974. 2
  22975. (MAIL ROOM)
  22976. 2
  22977. Adds additional recipients to the To: line of your message.
  22978. 2
  22979. Same rules apply as for the `to' command.
  22980. 38
  22981. 5
  22982. 4
  22983. 7
  22984. 2
  22985. Syntax:  who 
  22986. 2
  22987.          who <rcpt>...
  22988. 2
  22989.  
  22990. 2
  22991. (MAIL ROOM)
  22992. 2
  22993. Invokes $mail_agent's mail-forwarding tracer and determines who (or what) is actually going to receive your message.  The resulting list will not include destinations that will simply forward the message without :receive_message()'ing a copy for themselves.
  22994. 2
  22995.  
  22996. 2
  22997. The second form expands an arbitrary list of recipients, for if e.g., you're curious about the members of particular mailing list.
  22998. 38
  22999. 5
  23000. 4
  23001. 6
  23002. 2
  23003. Syntax:  pri*nt
  23004. 2
  23005.  
  23006. 2
  23007. Display your text without line numbers.
  23008. 2
  23009.  
  23010. 2
  23011. (MAIL ROOM)
  23012. 2
  23013. Display your message including headers.
  23014. 38
  23015. 5
  23016. 4
  23017. 8
  23018. 2
  23019. Syntax:  send
  23020. 2
  23021.  
  23022. 2
  23023. (MAIL ROOM)
  23024. 2
  23025. Send the message, then exit the mail room if all of the addresses on the To: line turn out to be valid and usable (you can use the `who' command to check these in advance, though the status of recipients may change without warning).
  23026. 2
  23027. If the To: line turns out to contain invalid recipients or recipients that are not usable by you, the message will not be sent and you will remain in the mail room.
  23028. 2
  23029. It may be, however, that valid addresses on your To: line will forward to other addresses that are bogus; you'll receive warnings about these, but in this case your message will still be delivered to those addresses that are valid.
  23030. 2
  23031.  
  23032. 2
  23033. Note that there may be particularly long delays when sending to recipients with large forwarding/notification lists or when sending on occasions when the MOO is heavily loaded in general.  In such a case, it is possible to continue editing the message while the send is in progress; any such edits affect only the text in the editor.  In particular, the text of the message currently being sent remains as it was when you first typed the send command.  However, any editing will mark the text as "changed" meaning that you will need to explicitly `abort' or `quit' in order to leave the mail room even if the send concludes successfully.
  23034. 38
  23035. 5
  23036. 4
  23037. 8
  23038. 2
  23039. Syntax:  lis*t [<range>] [nonum]
  23040. 2
  23041.  
  23042. 2
  23043. Prints some subset of the current verb text.
  23044. 2
  23045. The default range is some reasonable collection of lines around the current insertion point:  currently this is 8_-8^, ie., 8 lines above the insertion point to 8 lines below it unless this runs up against the beginning or end of file, in which case we just take the first or last 16 lines, or just 1-$ if there aren't that many.  (See `help ranges' for how to specify line numbers and ranges.)
  23046. 2
  23047.  
  23048. 2
  23049. `nonum' prints without line numbers.
  23050. 2
  23051.  
  23052. 2
  23053. Yes, window heights will be customizable some day.
  23054. 38
  23055. 5
  23056. 4
  23057. 4
  23058. 2
  23059. Syntax:  n*ext [n] ["<text>]
  23060. 2
  23061.  
  23062. 2
  23063. Moves the insertion point down n lines.  If <text> is provided, inserts a new line there just like `say'.
  23064. 2
  23065. Equivalent to `insert +n'.  As one might expect, n defaults to 1.
  23066. 38
  23067. 5
  23068. 4
  23069. 4
  23070. 2
  23071. Syntax:  p*rev [n] ["<text>]
  23072. 2
  23073.  
  23074. 2
  23075. Moves the insertion point up n lines.  If <text> is provided, a new line is inserted as with `say'.
  23076. 2
  23077. Equivalent to `insert -n'.  As one might expect, n defaults to 1.
  23078. 38
  23079. 5
  23080. 4
  23081. 13
  23082. 2
  23083. Syntax:  s*ubst/<str1>/<str2>[/[g][c][<range>]]
  23084. 2
  23085.  
  23086. 2
  23087. Substitutes <str2> for <str1>, in all of the lines of <range>.
  23088. 2
  23089. Any character (not just `/') may be used to delimit the strings. 
  23090. 2
  23091. If <str1> is blank, <str2> is inserted at the beginning of the line.  
  23092. 2
  23093. (For inserting a string at the end of a line use emote/:).
  23094. 2
  23095.  
  23096. 2
  23097. Normally, only one substitution is done per line in the specified range, but if the 'g' flag is given, *all* instances of <str1> are replaced.
  23098. 2
  23099. The 'c' flag indicates that case is not significant when searching for substitution instances.
  23100. 2
  23101. <range> defaults to the line *before* the insertion point.
  23102. 2
  23103.  
  23104. 2
  23105. You do *not* need a space between the verb and the delimeter before <str1>.
  23106. 2
  23107. [Bug: If you omit the space and the first whitespace in <str1> is a run of more than one space, those spaces get treated as one.  Likewise, quotes and backslashes occuring in the first word of the command (i.e., the "verb") need to be escaped with `\'.  The fix on this will have to wait for a new command parser.]
  23108. 38
  23109. 5
  23110. 4
  23111. 4
  23112. 2
  23113. Syntax:  join        [<range>]
  23114. 2
  23115.          joinliteral [<range>]
  23116. 2
  23117.  
  23118. 2
  23119. combines the lines in the specified range.  Normally, spaces are inserted and double space appears after periods and colons, but 'joinliteral' (abbreviates to 'joinl') supresses this and joins the lines as is.  <range> defaults to the two lines surrounding the insertion point.
  23120. 38
  23121. 5
  23122. 4
  23123. 3
  23124. 2
  23125. Syntax:  fill [<range>] [@ c]
  23126. 2
  23127.  
  23128. 2
  23129. combines the specified lines as in join and then splits them so that no line is more than c characters (except in cases of pathological lines with very long words).  c defaults to 70.  <range> defaults to the single line preceding the insertion point.
  23130. 38
  23131. 5
  23132. 4
  23133. 6
  23134. 2
  23135. Syntax:  m*ove [<range>] to <ins>
  23136. 2
  23137.  
  23138. 2
  23139. Moves the range of lines to place specified by <ins>.
  23140. 2
  23141. If <ins> happens to be the current insertion point, the insertion point is moved to the end of the freshly moved lines.  If the range of lines contains the insertion point, the insertion point is carried over to the range's new location.
  23142. 2
  23143.  
  23144. 2
  23145. See `help insert' for a list of possibilities for <ins>.
  23146. 38
  23147. 5
  23148. 4
  23149. 7
  23150. 2
  23151. Syntax:  c*opy [<range>] to <ins>
  23152. 2
  23153.  
  23154. 2
  23155. Copies the specified range of lines to place given by <ins>.
  23156. 2
  23157. If <ins> happens to be the current insertion point, the insertion 
  23158. 2
  23159. point moves to the end of the inserted lines.
  23160. 2
  23161.  
  23162. 2
  23163. See `help insert' for a list of possibilities for <ins>.
  23164. 38
  23165. 5
  23166. 4
  23167. 3
  23168. 2
  23169. Syntax:  w*hat
  23170. 2
  23171.  
  23172. 2
  23173. Prints information about the editing session.
  23174. 38
  23175. 5
  23176. 4
  23177. 3
  23178. 2
  23179. Syntax:  abort
  23180. 2
  23181.  
  23182. 2
  23183. Abandons this editing session and any changes.
  23184. 38
  23185. 5
  23186. 4
  23187. 2
  23188. 2
  23189. *forward*
  23190. 2
  23191. quit
  23192. 38
  23193. 5
  23194. 4
  23195. 2
  23196. 2
  23197. *forward*
  23198. 2
  23199. quit
  23200. 38
  23201. 5
  23202. 4
  23203. 20
  23204. 2
  23205. Most editor commands act upon a particular range of lines.
  23206. 2
  23207. Essentially, one needs to specify a first line and a last line.
  23208. 2
  23209. Line numbers may be given in any of the following forms
  23210. 2
  23211.   
  23212. 2
  23213.   n      (i.e., the nth line of text)
  23214. 2
  23215.   n^     n-th line after/below  the current insertion point
  23216. 2
  23217.   n_     n-th line before/above the current insertion point
  23218. 2
  23219.   n$     n-th line before the end.
  23220. 2
  23221.  
  23222. 2
  23223. In the latter three, n defaults to 1, so that `^' by itself refers to the line below the current (i.e., the line that gets `^' printed before it), and likewise for `_' while `$' refers to the last line.  Note that the usage depends on whether you are specifying a line or an insertion point (space between lines). `^5' is the space above/before line 5, while `5^' is the fifth line after/below the current insertion point.
  23224. 2
  23225.  
  23226. 2
  23227. Ranges of lines may be specified in any of the
  23228. 2
  23229. following ways:
  23230. 2
  23231.  
  23232. 2
  23233.   <line>                  just that line
  23234. 2
  23235.   from <line> to <line>   what it says; the following two forms are equivalent:
  23236. 2
  23237.   <line>-<line>            
  23238. 2
  23239.   <line> <line>
  23240. 2
  23241.  
  23242. 2
  23243. With the `from l to l' form, either the from or the to can be left off and it will default to whatever is usual for that command (usually a line above or below the insertion point).  Actually I was thinking of punting the `from'/`to' specifications entirely because they're so verbose.  Opinions?
  23244. 38
  23245. 5
  23246. 4
  23247. 2
  23248. 2
  23249. *forward*
  23250. 2
  23251. also-to
  23252. 38
  23253. 5
  23254. 5
  23255. 38
  23256. 5
  23257. 5
  23258. 38
  23259. 4
  23260. 4
  23261. 1
  23262. 2
  23263. Editor Help
  23264. 38
  23265. 5
  23266. 0
  23267. 0
  23268. 38
  23269. 5
  23270. 4
  23271. 2
  23272. 0
  23273. 20847
  23274. 0
  23275. 743668277
  23276. 2
  23277. 1
  23278. #46
  23279. Generic Mail Recipient
  23280.  
  23281. 144
  23282. 38
  23283. -1
  23284. -1
  23285. -1
  23286. 1
  23287. 36
  23288. 43
  23289. 33
  23290. set_aliases
  23291. 38
  23292. 173
  23293. -1
  23294. look_self
  23295. 38
  23296. 173
  23297. -1
  23298. is_writable_by
  23299. 38
  23300. 173
  23301. -1
  23302. is_readable_by
  23303. 38
  23304. 173
  23305. -1
  23306. is_usable_by
  23307. 38
  23308. 165
  23309. -1
  23310. mail_notify
  23311. 38
  23312. 173
  23313. -1
  23314. mail_forward
  23315. 38
  23316. 173
  23317. -1
  23318. moderator_forward
  23319. 38
  23320. 173
  23321. -1
  23322. add_forward
  23323. 38
  23324. 173
  23325. -1
  23326. delete_forward
  23327. 38
  23328. 173
  23329. -1
  23330. add_notify
  23331. 38
  23332. 173
  23333. -1
  23334. delete_notify
  23335. 38
  23336. 173
  23337. -1
  23338. receive_message
  23339. 38
  23340. 173
  23341. -1
  23342. ok
  23343. 38
  23344. 173
  23345. -1
  23346. ok_write
  23347. 38
  23348. 173
  23349. -1
  23350. parse_message_seq from_msg_seq %from_msg_seq to_msg_seq %to_msg_seq subject_msg_seq body_msg_seq display_seq_headers display_seq_full messages_in_seq list_rmm new_message_num length_num_le length_date_le length_all_msgs exists_num_eq
  23351. 38
  23352. 173
  23353. -1
  23354. length_date_gt
  23355. 38
  23356. 173
  23357. -1
  23358. rm_message_seq
  23359. 38
  23360. 173
  23361. -1
  23362. undo_rmm expunge_rmm renumber
  23363. 38
  23364. 173
  23365. -1
  23366. own_messages_filter
  23367. 38
  23368. 173
  23369. -1
  23370. messages
  23371. 38
  23372. 173
  23373. -1
  23374. date_sort
  23375. 38
  23376. 173
  23377. -1
  23378. _fix_last_msg_date
  23379. 38
  23380. 173
  23381. -1
  23382. moderator_notify
  23383. 38
  23384. 173
  23385. -1
  23386. msg_summary_line
  23387. 38
  23388. 173
  23389. -1
  23390. __check
  23391. 38
  23392. 173
  23393. -1
  23394. __fix
  23395. 2
  23396. 173
  23397. -1
  23398. init_for_core
  23399. 2
  23400. 173
  23401. -1
  23402. initialize
  23403. 2
  23404. 173
  23405. -1
  23406. mail_name
  23407. 38
  23408. 173
  23409. -1
  23410. mail_names
  23411. 38
  23412. 173
  23413. -1
  23414. expire_old_messages
  23415. 2
  23416. 173
  23417. -1
  23418. moveto
  23419. 38
  23420. 173
  23421. -1
  23422. 14
  23423. moderator_notify
  23424. last_msg_date
  23425. messages_going
  23426. moderated
  23427. moderator_forward
  23428. writers
  23429. readers
  23430. mail_notify
  23431. mail_forward
  23432. expire_period
  23433. last_used_time
  23434. messages
  23435. rmm_own_msgs
  23436. guests_can_send_here
  23437. 18
  23438. 4
  23439. 0
  23440. 38
  23441. 5
  23442. 0
  23443. 0
  23444. 38
  23445. 1
  23446. 4
  23447. 0
  23448. 38
  23449. 0
  23450. 4
  23451. 0
  23452. 38
  23453. 5
  23454. 2
  23455. %n (%#) can't send to moderated list %t (%[#t]) directly.
  23456. 38
  23457. 5
  23458. 4
  23459. 0
  23460. 38
  23461. 5
  23462. 4
  23463. 0
  23464. 38
  23465. 5
  23466. 4
  23467. 0
  23468. 38
  23469. 1
  23470. 2
  23471. %t (%[#t]) is a generic recipient.
  23472. 38
  23473. 1
  23474. 0
  23475. 2592000
  23476. 38
  23477. 5
  23478. 0
  23479. 0
  23480. 38
  23481. 1
  23482. 4
  23483. 0
  23484. 38
  23485. 0
  23486. 0
  23487. 0
  23488. 38
  23489. 5
  23490. 0
  23491. 0
  23492. 38
  23493. 5
  23494. 5
  23495. 38
  23496. 4
  23497. 4
  23498. 1
  23499. 2
  23500. Generic Mail Recipient
  23501. 38
  23502. 1
  23503. 2
  23504. This can either be a mailing list or a mail folder, depending on what mood you're in...
  23505. 38
  23506. 5
  23507. 4
  23508. 2
  23509. 0
  23510. 17791
  23511. 0
  23512. 743668049
  23513. 2
  23514. 1
  23515. #47
  23516. Mail Distribution Center
  23517.  
  23518. 16
  23519. 38
  23520. -1
  23521. 31
  23522. -1
  23523. 1
  23524. -1
  23525. 46
  23526. 46
  23527. resolve_addr
  23528. 38
  23529. 173
  23530. -1
  23531. sends_to
  23532. 38
  23533. 173
  23534. -1
  23535. send_message
  23536. 38
  23537. 173
  23538. -1
  23539. raw_send
  23540. 2
  23541. 173
  23542. -1
  23543. mail_forward mail_notify
  23544. 38
  23545. 173
  23546. -1
  23547. touch
  23548. 38
  23549. 173
  23550. -1
  23551. look_self
  23552. 38
  23553. 173
  23554. -1
  23555. accept
  23556. 38
  23557. 173
  23558. -1
  23559. check_names
  23560. 38
  23561. 173
  23562. -1
  23563. match
  23564. 38
  23565. 173
  23566. -1
  23567. match_recipient
  23568. 38
  23569. 173
  23570. -1
  23571. match_failed
  23572. 38
  23573. 173
  23574. -1
  23575. make_message
  23576. 38
  23577. 173
  23578. -1
  23579. name
  23580. 38
  23581. 173
  23582. -1
  23583. name_list
  23584. 38
  23585. 173
  23586. -1
  23587. parse_address_field
  23588. 38
  23589. 173
  23590. -1
  23591. display_seq_full
  23592. 2
  23593. 173
  23594. -1
  23595. display_seq_headers
  23596. 2
  23597. 173
  23598. -1
  23599. rm_message_seq
  23600. 2
  23601. 165
  23602. -1
  23603. undo_rmm
  23604. 2
  23605. 173
  23606. -1
  23607. expunge_rmm list_rmm
  23608. 2
  23609. 173
  23610. -1
  23611. renumber
  23612. 2
  23613. 173
  23614. -1
  23615. msg_summary_line
  23616. 38
  23617. 173
  23618. -1
  23619. msg_summary_line(slow)
  23620. 38
  23621. 173
  23622. -1
  23623. parse_message_seq
  23624. 2
  23625. 173
  23626. -1
  23627. _parse_from _parse_to
  23628. 38
  23629. 173
  23630. -1
  23631. _parse_date
  23632. 38
  23633. 173
  23634. -1
  23635. new_message_num
  23636. 2
  23637. 173
  23638. -1
  23639. length_all_msgs
  23640. 2
  23641. 173
  23642. -1
  23643. length_date_le
  23644. 2
  23645. 173
  23646. -1
  23647. length_date_gt
  23648. 2
  23649. 173
  23650. -1
  23651. length_num_le
  23652. 2
  23653. 173
  23654. -1
  23655. exists_num_eq
  23656. 2
  23657. 173
  23658. -1
  23659. from_msg_seq
  23660. 2
  23661. 173
  23662. -1
  23663. %from_msg_seq
  23664. 2
  23665. 173
  23666. -1
  23667. to_msg_seq
  23668. 2
  23669. 173
  23670. -1
  23671. %to_msg_seq
  23672. 2
  23673. 173
  23674. -1
  23675. subject_msg_seq
  23676. 2
  23677. 173
  23678. -1
  23679. body_msg_seq
  23680. 2
  23681. 173
  23682. -1
  23683. messages_in_seq
  23684. 2
  23685. 173
  23686. -1
  23687. __convert_new
  23688. 2
  23689. 173
  23690. -1
  23691. to_text
  23692. 38
  23693. 173
  23694. -1
  23695. is_readable_by is_writable_by is_usable_by
  23696. 38
  23697. 173
  23698. -1
  23699. raw_send(new)
  23700. 2
  23701. 169
  23702. -1
  23703. reserved_pattern
  23704. 38
  23705. 173
  23706. -1
  23707. is_recipient
  23708. 38
  23709. 165
  23710. -1
  23711. 3
  23712. options
  23713. reserved_patterns
  23714. total_recipients
  23715. 7
  23716. 4
  23717. 11
  23718. 2
  23719. include
  23720. 2
  23721. noinclude
  23722. 2
  23723. all
  23724. 2
  23725. sender
  23726. 2
  23727. nosubject
  23728. 2
  23729. expert
  23730. 2
  23731. enter
  23732. 2
  23733. sticky
  23734. 2
  23735. @mail
  23736. 2
  23737. manymsgs
  23738. 2
  23739. replyto
  23740. 38
  23741. 5
  23742. 4
  23743. 2
  23744. 4
  23745. 2
  23746. 2
  23747. ^Petition:%|^Ballot:%|^P:%|^B:
  23748. 1
  23749. 33842
  23750. 4
  23751. 2
  23752. 2
  23753. ^Dispute:%|^D:
  23754. 1
  23755. 34809
  23756. 38
  23757. 1
  23758. 4
  23759. 10
  23760. 0
  23761. 24051
  23762. 0
  23763. 1399
  23764. 0
  23765. 313
  23766. 0
  23767. 90
  23768. 0
  23769. 46
  23770. 0
  23771. 12
  23772. 0
  23773. 15
  23774. 0
  23775. 6
  23776. 0
  23777. 8
  23778. 0
  23779. 55
  23780. 38
  23781. 5
  23782. 5
  23783. 38
  23784. 4
  23785. 4
  23786. 2
  23787. 2
  23788. Mail Distribution Center
  23789. 2
  23790. Postmaster
  23791. 38
  23792. 5
  23793. 4
  23794. 5
  23795. 2
  23796. This is the database of mailing-list/mail-folder objects.
  23797. 2
  23798. The basic procedure for creating a new list/folder is to create a child of $mail_recipient (Generic Mail Recipient) assign it a suitable name&aliases, set a suitable .mail_forward/.mail_notify (or create suitable :mail_forward() and :mail_notify() verbs) and then teleport it here.
  23799. 2
  23800.  
  23801. 2
  23802. Avaliable aliases:
  23803. 2
  23804.  
  23805. 38
  23806. 5
  23807. 4
  23808. 2
  23809. 0
  23810. 53082
  23811. 0
  23812. 743668038
  23813. 2
  23814. 1
  23815. #48
  23816. Mail Room
  23817.  
  23818. 16
  23819. 38
  23820. -1
  23821. -1
  23822. -1
  23823. 51
  23824. -1
  23825. -1
  23826. 24
  23827. working_on
  23828. 38
  23829. 165
  23830. -1
  23831. parse_invoke
  23832. 38
  23833. 173
  23834. -1
  23835. init_session
  23836. 38
  23837. 173
  23838. -1
  23839. pri*nt
  23840. 38
  23841. 25
  23842. -1
  23843. message_with_headers
  23844. 38
  23845. 173
  23846. -1
  23847. subj*ect:
  23848. 38
  23849. 89
  23850. -2
  23851. set_subject
  23852. 38
  23853. 173
  23854. -1
  23855. to*:
  23856. 38
  23857. 89
  23858. -2
  23859. also*-to: cc*:
  23860. 38
  23861. 89
  23862. -2
  23863. parse_recipients
  23864. 38
  23865. 173
  23866. -1
  23867. recipient_names
  23868. 38
  23869. 173
  23870. -1
  23871. make_message
  23872. 38
  23873. 173
  23874. -1
  23875. name_list
  23876. 38
  23877. 173
  23878. -1
  23879. parse_msg_headers
  23880. 38
  23881. 173
  23882. -1
  23883. check_answer_flags
  23884. 38
  23885. 173
  23886. -1
  23887. reply-to*: replyto*:
  23888. 38
  23889. 89
  23890. -2
  23891. send
  23892. 2
  23893. 9
  23894. -1
  23895. who
  23896. 38
  23897. 29
  23898. -1
  23899. showlists
  23900. 38
  23901. 25
  23902. -1
  23903. subsc*ribe
  23904. 38
  23905. 89
  23906. 1
  23907. unsubsc*ribe
  23908. 38
  23909. 89
  23910. 5
  23911. parse_msg_headers(slow)
  23912. 38
  23913. 173
  23914. -1
  23915. retain_session_on_exit
  23916. 38
  23917. 173
  23918. -1
  23919. no_littering_msg
  23920. 38
  23921. 173
  23922. -1
  23923. 4
  23924. replytos
  23925. recipients
  23926. subjects
  23927. sending
  23928. 42
  23929. 4
  23930. 0
  23931. 38
  23932. 0
  23933. 4
  23934. 0
  23935. 38
  23936. 0
  23937. 4
  23938. 0
  23939. 38
  23940. 0
  23941. 4
  23942. 0
  23943. 38
  23944. 0
  23945. 4
  23946. 0
  23947. 38
  23948. 1
  23949. 4
  23950. 0
  23951. 38
  23952. 1
  23953. 4
  23954. 2
  23955. 4
  23956. 12
  23957. 2
  23958. say
  23959. 2
  23960. emote
  23961. 2
  23962. lis*t
  23963. 2
  23964. ins*ert
  23965. 2
  23966. n*ext,p*rev
  23967. 2
  23968. enter
  23969. 2
  23970. del*ete
  23971. 2
  23972. f*ind
  23973. 2
  23974. s*ubst
  23975. 2
  23976. m*ove,c*opy
  23977. 2
  23978. join*l
  23979. 2
  23980. fill
  23981. 4
  23982. 11
  23983. 2
  23984. w*hat
  23985. 2
  23986. subj*ect
  23987. 2
  23988. to
  23989. 2
  23990. also-to
  23991. 2
  23992. reply-to
  23993. 2
  23994. showlists,unsubscribe
  23995. 2
  23996. who
  23997. 2
  23998. pri*nt
  23999. 2
  24000. send
  24001. 2
  24002. abort
  24003. 2
  24004. q*uit,done,pause
  24005. 38
  24006. 5
  24007. 1
  24008. 45
  24009. 38
  24010. 5
  24011. 2
  24012. Message body is empty.
  24013. 38
  24014. 5
  24015. 4
  24016. 8
  24017. 4
  24018. 2
  24019. 2
  24020. subj*ect
  24021. 2
  24022. [<text>]
  24023. 4
  24024. 2
  24025. 2
  24026. to
  24027. 2
  24028. [<rcpt>..]
  24029. 4
  24030. 2
  24031. 2
  24032. also-to
  24033. 2
  24034. [<rcpt>..]
  24035. 4
  24036. 2
  24037. 2
  24038. reply-to
  24039. 2
  24040. [<rcpt>..]
  24041. 4
  24042. 2
  24043. 2
  24044. who
  24045. 2
  24046. [<rcpt>..]
  24047. 4
  24048. 2
  24049. 2
  24050. pri*nt
  24051. 2
  24052.  
  24053. 4
  24054. 2
  24055. 2
  24056. send
  24057. 2
  24058.  
  24059. 4
  24060. 2
  24061. 2
  24062. showlists,unsubscribe
  24063. 2
  24064.  
  24065. 38
  24066. 5
  24067. 0
  24068. 0
  24069. 38
  24070. 1
  24071. 0
  24072. 1
  24073. 38
  24074. 5
  24075. 2
  24076. You need to either SEND it or ABORT it before you can start another message.
  24077. 38
  24078. 5
  24079. 4
  24080. 8
  24081. 4
  24082. 2
  24083. 2
  24084. sending
  24085. 0
  24086. 0
  24087. 4
  24088. 2
  24089. 2
  24090. replytos
  24091. 4
  24092. 0
  24093. 4
  24094. 2
  24095. 2
  24096. recipients
  24097. 4
  24098. 0
  24099. 4
  24100. 2
  24101. 2
  24102. subjects
  24103. 2
  24104.  
  24105. 4
  24106. 2
  24107. 2
  24108. texts
  24109. 4
  24110. 0
  24111. 4
  24112. 2
  24113. 2
  24114. changes
  24115. 0
  24116. 0
  24117. 4
  24118. 2
  24119. 2
  24120. inserting
  24121. 0
  24122. 1
  24123. 4
  24124. 2
  24125. 2
  24126. readable
  24127. 0
  24128. 0
  24129. 38
  24130. 1
  24131. 2
  24132. %N flattens out into a largish 29 cent postage stamp and floats away.
  24133. 38
  24134. 5
  24135. 2
  24136. A largish 29 cent postage stamp floats into the room and fattens up into %n.
  24137. 38
  24138. 5
  24139. 4
  24140. 4
  24141. 2
  24142. Saving your message so that you can finish it later.
  24143. 2
  24144. To come back, give the `@send' command with no arguments.
  24145. 2
  24146. Please come back and SEND or ABORT if you don't intend to be working on this
  24147. 2
  24148. message in the immediate future.  Keep Our MOO Clean!  No Littering!
  24149. 38
  24150. 5
  24151. 5
  24152. 38
  24153. 5
  24154. 5
  24155. 38
  24156. 5
  24157. 2
  24158. You're not editing anything!
  24159. 38
  24160. 5
  24161. 4
  24162. 0
  24163. 38
  24164. 0
  24165. 4
  24166. 0
  24167. 38
  24168. 1
  24169. 4
  24170. 0
  24171. 38
  24172. 0
  24173. 4
  24174. 0
  24175. 38
  24176. 0
  24177. 4
  24178. 0
  24179. 38
  24180. 1
  24181. 2
  24182. %L [mailing]
  24183. 38
  24184. 5
  24185. 5
  24186. 38
  24187. 5
  24188. 5
  24189. 38
  24190. 5
  24191. 5
  24192. 38
  24193. 5
  24194. 5
  24195. 38
  24196. 5
  24197. 5
  24198. 38
  24199. 5
  24200. 5
  24201. 38
  24202. 5
  24203. 4
  24204. 0
  24205. 38
  24206. 4
  24207. 1
  24208. -1
  24209. 38
  24210. 5
  24211. 0
  24212. 1248352381
  24213. 38
  24214. 5
  24215. 5
  24216. 38
  24217. 4
  24218. 5
  24219. 38
  24220. 5
  24221. 5
  24222. 38
  24223. 5
  24224. 5
  24225. 38
  24226. 4
  24227. 4
  24228. 1
  24229. 2
  24230. Mail Room
  24231. 38
  24232. 5
  24233. 5
  24234. 38
  24235. 5
  24236. 4
  24237. 2
  24238. 0
  24239. 26737
  24240. 0
  24241. 743667582
  24242. 2
  24243. 1
  24244. #49
  24245. Note Editor
  24246.  
  24247. 16
  24248. 38
  24249. -1
  24250. -1
  24251. -1
  24252. 51
  24253. -1
  24254. 48
  24255. 11
  24256. e*dit
  24257. 38
  24258. 25
  24259. -1
  24260. save
  24261. 38
  24262. 25
  24263. -1
  24264. init_session
  24265. 38
  24266. 173
  24267. -1
  24268. working_on
  24269. 38
  24270. 173
  24271. -1
  24272. parse_invoke
  24273. 38
  24274. 173
  24275. -1
  24276. note_text
  24277. 2
  24278. 165
  24279. -1
  24280. set_note_text
  24281. 2
  24282. 165
  24283. -1
  24284. note_match_failed
  24285. 38
  24286. 173
  24287. -1
  24288. w*hat
  24289. 38
  24290. 9
  24291. -1
  24292. mode
  24293. 38
  24294. 25
  24295. -1
  24296. local_editing_info
  24297. 38
  24298. 173
  24299. -1
  24300. 2
  24301. strmode
  24302. objects
  24303. 40
  24304. 4
  24305. 0
  24306. 38
  24307. 1
  24308. 4
  24309. 0
  24310. 38
  24311. 5
  24312. 4
  24313. 0
  24314. 38
  24315. 1
  24316. 4
  24317. 0
  24318. 38
  24319. 1
  24320. 4
  24321. 2
  24322. 4
  24323. 12
  24324. 2
  24325. say
  24326. 2
  24327. emote
  24328. 2
  24329. lis*t
  24330. 2
  24331. ins*ert
  24332. 2
  24333. n*ext,p*rev
  24334. 2
  24335. enter
  24336. 2
  24337. del*ete
  24338. 2
  24339. f*ind
  24340. 2
  24341. s*ubst
  24342. 2
  24343. m*ove,c*opy
  24344. 2
  24345. join*l
  24346. 2
  24347. fill
  24348. 4
  24349. 6
  24350. 2
  24351. w*hat
  24352. 2
  24353. mode
  24354. 2
  24355. e*dit
  24356. 2
  24357. save
  24358. 2
  24359. abort
  24360. 2
  24361. q*uit,done,pause
  24362. 38
  24363. 5
  24364. 1
  24365. 45
  24366. 38
  24367. 5
  24368. 2
  24369. Note is devoid of text.
  24370. 38
  24371. 5
  24372. 4
  24373. 3
  24374. 4
  24375. 2
  24376. 2
  24377. e*dit
  24378. 2
  24379. <note>
  24380. 4
  24381. 2
  24382. 2
  24383. save
  24384. 2
  24385. [<note>]
  24386. 4
  24387. 2
  24388. 2
  24389. mode
  24390. 2
  24391. [string|list]
  24392. 38
  24393. 5
  24394. 0
  24395. 0
  24396. 38
  24397. 1
  24398. 5
  24399. 38
  24400. 5
  24401. 2
  24402. You need to ABORT or SAVE this note before editing any other.
  24403. 38
  24404. 5
  24405. 4
  24406. 6
  24407. 4
  24408. 2
  24409. 2
  24410. strmode
  24411. 0
  24412. 0
  24413. 4
  24414. 2
  24415. 2
  24416. objects
  24417. 0
  24418. 0
  24419. 4
  24420. 2
  24421. 2
  24422. texts
  24423. 0
  24424. 0
  24425. 4
  24426. 2
  24427. 2
  24428. changes
  24429. 0
  24430. 0
  24431. 4
  24432. 2
  24433. 2
  24434. inserting
  24435. 0
  24436. 1
  24437. 4
  24438. 2
  24439. 2
  24440. readable
  24441. 0
  24442. 0
  24443. 38
  24444. 1
  24445. 2
  24446. A small swarm of 3x5 index cards arrives, engulfs %n, and carries %o away.
  24447. 38
  24448. 5
  24449. 2
  24450. A small swarm of 3x5 index cards blows in and disperses, revealing %n.
  24451. 38
  24452. 5
  24453. 4
  24454. 3
  24455. 2
  24456. Partially edited text will be here when you get back.
  24457. 2
  24458. To return, give the `@notedit' command with no arguments.
  24459. 2
  24460. Please come back and SAVE or ABORT if you don't intend to be working on this text in the immediate future.  Keep Our MOO Clean!  No Littering!
  24461. 38
  24462. 5
  24463. 2
  24464. Note has not been modified since the last save.
  24465. 38
  24466. 5
  24467. 2
  24468. There are changes.
  24469. 38
  24470. 5
  24471. 2
  24472. Use the EDIT command to select a note.
  24473. 38
  24474. 5
  24475. 4
  24476. 0
  24477. 38
  24478. 0
  24479. 4
  24480. 0
  24481. 38
  24482. 1
  24483. 4
  24484. 0
  24485. 38
  24486. 0
  24487. 4
  24488. 0
  24489. 38
  24490. 0
  24491. 4
  24492. 0
  24493. 38
  24494. 1
  24495. 2
  24496. %L [editing notes]
  24497. 38
  24498. 5
  24499. 5
  24500. 38
  24501. 5
  24502. 5
  24503. 38
  24504. 5
  24505. 5
  24506. 38
  24507. 5
  24508. 5
  24509. 38
  24510. 5
  24511. 5
  24512. 38
  24513. 5
  24514. 5
  24515. 38
  24516. 5
  24517. 4
  24518. 0
  24519. 38
  24520. 4
  24521. 1
  24522. -1
  24523. 38
  24524. 5
  24525. 0
  24526. 632280717
  24527. 38
  24528. 5
  24529. 4
  24530. 0
  24531. 38
  24532. 4
  24533. 5
  24534. 38
  24535. 5
  24536. 5
  24537. 38
  24538. 5
  24539. 5
  24540. 38
  24541. 4
  24542. 4
  24543. 2
  24544. 2
  24545. Note Editor
  24546. 2
  24547. nedit
  24548. 38
  24549. 5
  24550. 5
  24551. 38
  24552. 5
  24553. 4
  24554. 2
  24555. 0
  24556. 20431
  24557. 0
  24558. 743667477
  24559. 2
  24560. 1
  24561. #50
  24562. Verb Editor
  24563.  
  24564. 16
  24565. 38
  24566. -1
  24567. -1
  24568. -1
  24569. 51
  24570. -1
  24571. 49
  24572. 10
  24573. e*dit
  24574. 38
  24575. 25
  24576. -1
  24577. com*pile
  24578. 38
  24579. 73
  24580. -2
  24581. working_on
  24582. 38
  24583. 173
  24584. -1
  24585. init_session
  24586. 38
  24587. 173
  24588. -1
  24589. parse_invoke
  24590. 38
  24591. 173
  24592. -1
  24593. fetch_verb_code
  24594. 2
  24595. 165
  24596. -1
  24597. set_verb_code
  24598. 2
  24599. 165
  24600. -1
  24601. local_editing_info
  24602. 2
  24603. 173
  24604. -1
  24605. verb_name
  24606. 2
  24607. 165
  24608. -1
  24609. verb_args
  24610. 2
  24611. 165
  24612. -1
  24613. 2
  24614. objects
  24615. verbnames
  24616. 40
  24617. 4
  24618. 1
  24619. 1
  24620. 348
  24621. 38
  24622. 0
  24623. 4
  24624. 1
  24625. 2
  24626. 8
  24627. 38
  24628. 0
  24629. 4
  24630. 1
  24631. 0
  24632. 0
  24633. 38
  24634. 1
  24635. 4
  24636. 1
  24637. 0
  24638. -1463915969
  24639. 38
  24640. 1
  24641. 4
  24642. 2
  24643. 4
  24644. 12
  24645. 2
  24646. say
  24647. 2
  24648. emote
  24649. 2
  24650. lis*t
  24651. 2
  24652. ins*ert
  24653. 2
  24654. n*ext,p*rev
  24655. 2
  24656. enter
  24657. 2
  24658. del*ete
  24659. 2
  24660. f*ind
  24661. 2
  24662. s*ubst
  24663. 2
  24664. m*ove,c*opy
  24665. 2
  24666. join*l
  24667. 2
  24668. fill
  24669. 4
  24670. 5
  24671. 2
  24672. w*hat
  24673. 2
  24674. e*dit
  24675. 2
  24676. com*pile
  24677. 2
  24678. abort
  24679. 2
  24680. q*uit,done,pause
  24681. 38
  24682. 5
  24683. 1
  24684. 45
  24685. 38
  24686. 5
  24687. 2
  24688. Verb body is empty.
  24689. 38
  24690. 5
  24691. 4
  24692. 2
  24693. 4
  24694. 2
  24695. 2
  24696. e*dit
  24697. 2
  24698. <obj>:<verb>
  24699. 4
  24700. 2
  24701. 2
  24702. com*pile
  24703. 2
  24704. [as <obj>:<verb>]
  24705. 38
  24706. 5
  24707. 0
  24708. 0
  24709. 38
  24710. 1
  24711. 5
  24712. 38
  24713. 5
  24714. 2
  24715. You need to either COMPILE or ABORT this verb before you can start on another.
  24716. 38
  24717. 5
  24718. 4
  24719. 6
  24720. 4
  24721. 2
  24722. 2
  24723. objects
  24724. 0
  24725. 0
  24726. 4
  24727. 2
  24728. 2
  24729. verbnames
  24730. 0
  24731. 0
  24732. 4
  24733. 2
  24734. 2
  24735. texts
  24736. 0
  24737. 0
  24738. 4
  24739. 2
  24740. 2
  24741. changes
  24742. 0
  24743. 0
  24744. 4
  24745. 2
  24746. 2
  24747. inserting
  24748. 0
  24749. 1
  24750. 4
  24751. 2
  24752. 2
  24753. readable
  24754. 0
  24755. 0
  24756. 38
  24757. 1
  24758. 2
  24759. You hear the bips of keyclick, the sliding of mice and the hum of computers in the distance as %n fades slowly out of view, heading towards them.
  24760. 38
  24761. 5
  24762. 2
  24763. There are the light bips of keyclick and the sliding of mice as %n fades into view, shoving %r away from the console, which promptly fades away.
  24764. 38
  24765. 5
  24766. 4
  24767. 3
  24768. 2
  24769. Keeping your verb for later work.  
  24770. 2
  24771. To return, give the `@edit' command with no arguments.
  24772. 2
  24773. Please come back and COMPILE or ABORT if you don't intend to be working on this verb in the immediate future.  Keep Our MOO Clean!  No Littering!
  24774. 38
  24775. 5
  24776. 2
  24777. The verb has no pending changes.
  24778. 38
  24779. 5
  24780. 2
  24781. You have changed the verb since last successful compile.
  24782. 38
  24783. 5
  24784. 2
  24785. First, you have to select a verb to edit with the EDIT command.
  24786. 38
  24787. 5
  24788. 4
  24789. 1
  24790. 4
  24791. 14
  24792. 2
  24793. if (this.location.exits == {})
  24794. 2
  24795.     player:tell(this.name, " has no place to go.");
  24796. 2
  24797. else
  24798. 2
  24799.   if (this.floortask != 0)
  24800. 2
  24801.     kill_task(this.floortask);
  24802. 2
  24803.     this.floortask = 0;
  24804. 2
  24805.   endif
  24806. 2
  24807.   e = this.location.exits()[1];
  24808. 2
  24809.   if (e:accepts(this))
  24810. 2
  24811.     this.prior_location = this.location;
  24812. 2
  24813.     this.location:announce_all_but({this}, this.name, " scampers out.");
  24814. 2
  24815.     e:use();
  24816. 2
  24817.   endif
  24818. 2
  24819. endif
  24820. 38
  24821. 0
  24822. 4
  24823. 1
  24824. 1
  24825. 2
  24826. 38
  24827. 1
  24828. 4
  24829. 1
  24830. 0
  24831. 1
  24832. 38
  24833. 0
  24834. 4
  24835. 1
  24836. 0
  24837. 15
  24838. 38
  24839. 0
  24840. 4
  24841. 1
  24842. 1
  24843. 82
  24844. 38
  24845. 1
  24846. 2
  24847. %L [editing verbs]
  24848. 38
  24849. 5
  24850. 5
  24851. 38
  24852. 5
  24853. 5
  24854. 38
  24855. 5
  24856. 5
  24857. 38
  24858. 5
  24859. 5
  24860. 38
  24861. 5
  24862. 5
  24863. 38
  24864. 5
  24865. 5
  24866. 38
  24867. 5
  24868. 4
  24869. 0
  24870. 38
  24871. 4
  24872. 1
  24873. -1
  24874. 38
  24875. 5
  24876. 0
  24877. 933881578
  24878. 38
  24879. 5
  24880. 4
  24881. 0
  24882. 38
  24883. 4
  24884. 5
  24885. 38
  24886. 5
  24887. 5
  24888. 38
  24889. 5
  24890. 5
  24891. 38
  24892. 4
  24893. 4
  24894. 4
  24895. 2
  24896. Verb Editor
  24897. 2
  24898. vedit
  24899. 2
  24900. verbedit
  24901. 2
  24902. verb edit
  24903. 38
  24904. 5
  24905. 5
  24906. 38
  24907. 5
  24908. 4
  24909. 2
  24910. 0
  24911. 19758
  24912. 0
  24913. 743666857
  24914. 2
  24915. 1
  24916. #51
  24917. Generic Editor
  24918.  
  24919. 144
  24920. 38
  24921. -1
  24922. -1
  24923. -1
  24924. 3
  24925. 50
  24926. 11
  24927. 65
  24928. say
  24929. 38
  24930. 93
  24931. -2
  24932. emote
  24933. 38
  24934. 93
  24935. -2
  24936. enter
  24937. 38
  24938. 25
  24939. -1
  24940. lis*t view
  24941. 38
  24942. 89
  24943. -2
  24944. ins*ert n*ext p*revious .
  24945. 38
  24946. 25
  24947. -1
  24948. del*ete
  24949. 38
  24950. 89
  24951. -2
  24952. f*ind
  24953. 38
  24954. 93
  24955. -2
  24956. s*ubst
  24957. 38
  24958. 93
  24959. -2
  24960. m*ove c*opy
  24961. 38
  24962. 89
  24963. -2
  24964. join*literal
  24965. 38
  24966. 89
  24967. -2
  24968. fill
  24969. 38
  24970. 89
  24971. -2
  24972. pub*lish perish unpub*lish depub*lish
  24973. 38
  24974. 9
  24975. -1
  24976. w*hat
  24977. 38
  24978. 13
  24979. -1
  24980. abort
  24981. 38
  24982. 9
  24983. -1
  24984. done q*uit pause
  24985. 38
  24986. 13
  24987. -1
  24988. huh2
  24989. 2
  24990. 173
  24991. -1
  24992. insertion
  24993. 38
  24994. 173
  24995. -1
  24996. set_insertion
  24997. 38
  24998. 173
  24999. -1
  25000. changed retain_session_on_exit
  25001. 38
  25002. 173
  25003. -1
  25004. set_changed
  25005. 38
  25006. 173
  25007. -1
  25008. origin
  25009. 38
  25010. 173
  25011. -1
  25012. set_origin
  25013. 38
  25014. 173
  25015. -1
  25016. readable
  25017. 38
  25018. 173
  25019. -1
  25020. set_readable
  25021. 38
  25022. 173
  25023. -1
  25024. text
  25025. 38
  25026. 165
  25027. -1
  25028. load
  25029. 38
  25030. 173
  25031. -1
  25032. working_on
  25033. 38
  25034. 173
  25035. -1
  25036. ok
  25037. 38
  25038. 173
  25039. -1
  25040. loaded
  25041. 38
  25042. 173
  25043. -1
  25044. list_line
  25045. 38
  25046. 173
  25047. -1
  25048. insert_line
  25049. 38
  25050. 173
  25051. -1
  25052. append_line
  25053. 38
  25054. 173
  25055. -1
  25056. join_lines
  25057. 38
  25058. 173
  25059. -1
  25060. parse_number
  25061. 38
  25062. 173
  25063. -1
  25064. parse_range
  25065. 38
  25066. 173
  25067. -1
  25068. parse_insert
  25069. 38
  25070. 173
  25071. -1
  25072. parse_subst
  25073. 38
  25074. 173
  25075. -1
  25076. invoke
  25077. 38
  25078. 173
  25079. -1
  25080. suck_in
  25081. 38
  25082. 173
  25083. -1
  25084. new_session
  25085. 2
  25086. 173
  25087. -1
  25088. kill_session
  25089. 2
  25090. 173
  25091. -1
  25092. reset_session
  25093. 2
  25094. 173
  25095. -1
  25096. kill_all_sessions
  25097. 2
  25098. 173
  25099. -1
  25100. accept
  25101. 38
  25102. 173
  25103. -1
  25104. enterfunc
  25105. 38
  25106. 173
  25107. -1
  25108. exitfunc
  25109. 38
  25110. 173
  25111. -1
  25112. @flush
  25113. 38
  25114. 105
  25115. -2
  25116. @stateprop
  25117. 38
  25118. 153
  25119. 11
  25120. @rmstateprop
  25121. 38
  25122. 153
  25123. 5
  25124. initialize
  25125. 38
  25126. 173
  25127. -1
  25128. init_for_core
  25129. 2
  25130. 173
  25131. -1
  25132. set_stateprops
  25133. 38
  25134. 165
  25135. -1
  25136. description
  25137. 38
  25138. 173
  25139. -1
  25140. commands_info
  25141. 38
  25142. 173
  25143. -1
  25144. match_object
  25145. 38
  25146. 173
  25147. -1
  25148. who_location_msg
  25149. 38
  25150. 165
  25151. -1
  25152. nothing_loaded_msg no_text_msg change_msg no_change_msg no_littering_msg depart_msg return_msg previous_session_msg
  25153. 38
  25154. 173
  25155. -1
  25156. announce announce_all announce_all_but tell_contents
  25157. 38
  25158. 173
  25159. -1
  25160. fill_string
  25161. 38
  25162. 173
  25163. -1
  25164. here_huh
  25165. 38
  25166. 173
  25167. -1
  25168. match
  25169. 2
  25170. 173
  25171. -1
  25172. get_room
  25173. 38
  25174. 173
  25175. -1
  25176. invoke_local_editor
  25177. 2
  25178. 173
  25179. -1
  25180. _stateprop_length
  25181. 2
  25182. 173
  25183. -1
  25184. print
  25185. 2
  25186. 9
  25187. -1
  25188. 21
  25189. readable
  25190. times
  25191. commands2
  25192. help
  25193. no_text_msg
  25194. commands
  25195. invoke_task
  25196. exit_on_abort
  25197. previous_session_msg
  25198. stateprops
  25199. depart_msg
  25200. return_msg
  25201. no_littering_msg
  25202. no_change_msg
  25203. change_msg
  25204. nothing_loaded_msg
  25205. texts
  25206. active
  25207. changes
  25208. inserting
  25209. original
  25210. 38
  25211. 4
  25212. 0
  25213. 38
  25214. 1
  25215. 4
  25216. 0
  25217. 38
  25218. 1
  25219. 4
  25220. 2
  25221. 4
  25222. 11
  25223. 2
  25224. say
  25225. 2
  25226. emote
  25227. 2
  25228. lis*t
  25229. 2
  25230. ins*ert
  25231. 2
  25232. n*ext,p*rev
  25233. 2
  25234. del*ete
  25235. 2
  25236. f*ind
  25237. 2
  25238. s*ubst
  25239. 2
  25240. m*ove,c*opy
  25241. 2
  25242. join*l
  25243. 2
  25244. fill
  25245. 4
  25246. 3
  25247. 2
  25248. w*hat
  25249. 2
  25250. abort
  25251. 2
  25252. q*uit,done,pause
  25253. 38
  25254. 5
  25255. 1
  25256. 45
  25257. 38
  25258. 5
  25259. 2
  25260. There are no lines of text.
  25261. 38
  25262. 5
  25263. 4
  25264. 15
  25265. 4
  25266. 2
  25267. 2
  25268. say
  25269. 2
  25270. <text>
  25271. 4
  25272. 2
  25273. 2
  25274. emote
  25275. 2
  25276. <text>
  25277. 4
  25278. 2
  25279. 2
  25280. lis*t
  25281. 2
  25282. [<range>] [nonum]
  25283. 4
  25284. 2
  25285. 2
  25286. ins*ert
  25287. 2
  25288. [<ins>] ["<text>]
  25289. 4
  25290. 2
  25291. 2
  25292. n*ext,p*rev
  25293. 2
  25294. [n] ["<text>]
  25295. 4
  25296. 2
  25297. 2
  25298. del*ete
  25299. 2
  25300. [<range>]
  25301. 4
  25302. 2
  25303. 2
  25304. f*ind
  25305. 2
  25306. /<str>[/[c][<range>]]
  25307. 4
  25308. 2
  25309. 2
  25310. s*ubst
  25311. 2
  25312. /<str1>/<str2>[/[g][c][<range>]]
  25313. 4
  25314. 2
  25315. 2
  25316. m*ove,c*opy
  25317. 2
  25318. [<range>] to <ins>
  25319. 4
  25320. 2
  25321. 2
  25322. join*l
  25323. 2
  25324. [<range>]
  25325. 4
  25326. 2
  25327. 2
  25328. fill
  25329. 2
  25330. [<range>] [@<col>]
  25331. 4
  25332. 2
  25333. 2
  25334. w*hat
  25335. 2
  25336.  
  25337. 4
  25338. 2
  25339. 2
  25340. abort
  25341. 2
  25342.  
  25343. 4
  25344. 2
  25345. 2
  25346. q*uit,done,pause
  25347. 2
  25348.  
  25349. 4
  25350. 2
  25351. 2
  25352. enter
  25353. 2
  25354.  
  25355. 38
  25356. 5
  25357. 0
  25358. 0
  25359. 38
  25360. 1
  25361. 0
  25362. 0
  25363. 38
  25364. 5
  25365. 2
  25366.  
  25367. 38
  25368. 5
  25369. 4
  25370. 4
  25371. 4
  25372. 2
  25373. 2
  25374. texts
  25375. 0
  25376. 0
  25377. 4
  25378. 2
  25379. 2
  25380. changes
  25381. 0
  25382. 0
  25383. 4
  25384. 2
  25385. 2
  25386. inserting
  25387. 0
  25388. 1
  25389. 4
  25390. 2
  25391. 2
  25392. readable
  25393. 0
  25394. 0
  25395. 38
  25396. 1
  25397. 2
  25398. %N heads off to the Generic Editing Room.
  25399. 38
  25400. 5
  25401. 2
  25402. %N comes back from the Generic Editing Room.
  25403. 38
  25404. 5
  25405. 2
  25406. Keeping your [whatever] for later work.  Since this the Generic Editor, you have to do your own :set_changed(0) so that we'll know to get rid of whatever it you're working on when you leave.  Please don't litter... especially in the Generic Editor.
  25407. 38
  25408. 5
  25409. 2
  25410. There have been no changes since the last save.
  25411. 38
  25412. 5
  25413. 2
  25414. Text has been altered since the last save.
  25415. 38
  25416. 5
  25417. 2
  25418. You're not currently editing anything.
  25419. 38
  25420. 5
  25421. 4
  25422. 0
  25423. 38
  25424. 0
  25425. 4
  25426. 0
  25427. 38
  25428. 1
  25429. 4
  25430. 0
  25431. 38
  25432. 0
  25433. 4
  25434. 0
  25435. 38
  25436. 0
  25437. 4
  25438. 0
  25439. 38
  25440. 1
  25441. 2
  25442. %L [editing]
  25443. 38
  25444. 5
  25445. 5
  25446. 38
  25447. 5
  25448. 5
  25449. 38
  25450. 5
  25451. 5
  25452. 38
  25453. 5
  25454. 5
  25455. 38
  25456. 5
  25457. 5
  25458. 38
  25459. 5
  25460. 5
  25461. 38
  25462. 5
  25463. 4
  25464. 0
  25465. 38
  25466. 4
  25467. 1
  25468. -1
  25469. 38
  25470. 5
  25471. 0
  25472. 1260718963
  25473. 38
  25474. 5
  25475. 5
  25476. 38
  25477. 4
  25478. 5
  25479. 38
  25480. 5
  25481. 5
  25482. 38
  25483. 5
  25484. 5
  25485. 38
  25486. 4
  25487. 4
  25488. 3
  25489. 2
  25490. Generic Editor
  25491. 2
  25492. gedit
  25493. 2
  25494. edit
  25495. 38
  25496. 5
  25497. 4
  25498. 0
  25499. 38
  25500. 5
  25501. 4
  25502. 2
  25503. 0
  25504. 51030
  25505. 0
  25506. 743666822
  25507. 2
  25508. 1
  25509. #52
  25510. matching utilities
  25511.  
  25512. 16
  25513. 38
  25514. -1
  25515. -1
  25516. -1
  25517. 1
  25518. -1
  25519. 54
  25520. 6
  25521. match
  25522. 38
  25523. 173
  25524. -1
  25525. match_nth
  25526. 38
  25527. 173
  25528. -1
  25529. match_verb
  25530. 2
  25531. 173
  25532. -1
  25533. match_list
  25534. 38
  25535. 173
  25536. -1
  25537. parse_ordinal_reference parse_ordref
  25538. 38
  25539. 173
  25540. -1
  25541. parse_possessive_reference
  25542. 38
  25543. 173
  25544. -1
  25545. 3
  25546. ordn
  25547. ordw
  25548. ordinal_regexp
  25549. 7
  25550. 4
  25551. 10
  25552. 2
  25553. first
  25554. 2
  25555. second
  25556. 2
  25557. third
  25558. 2
  25559. fourth
  25560. 2
  25561. fifth
  25562. 2
  25563. sixth
  25564. 2
  25565. seventh
  25566. 2
  25567. eighth
  25568. 2
  25569. ninth
  25570. 2
  25571. tenth
  25572. 38
  25573. 5
  25574. 4
  25575. 10
  25576. 2
  25577. 1st
  25578. 2
  25579. 2nd
  25580. 2
  25581. 3rd
  25582. 2
  25583. 4th
  25584. 2
  25585. 5th
  25586. 2
  25587. 6th
  25588. 2
  25589. 7th
  25590. 2
  25591. 8th
  25592. 2
  25593. 9th
  25594. 2
  25595. 10th
  25596. 38
  25597. 5
  25598. 2
  25599. %<%(first%|second%|third%|fourth%|fifth%|sixth%|seventh%|eighth%|ninth%|tenth%|1st%|2nd%|3rd%|4th%|5th%|6th%|7th%|8th%|9th%|10th%)%>
  25600. 38
  25601. 5
  25602. 5
  25603. 38
  25604. 4
  25605. 4
  25606. 1
  25607. 2
  25608. matching utilities
  25609. 38
  25610. 5
  25611. 5
  25612. 38
  25613. 5
  25614. 4
  25615. 2
  25616. 0
  25617. 3940
  25618. 0
  25619. 743626040
  25620. 2
  25621. 1
  25622. #53
  25623. object utilities
  25624.  
  25625. 16
  25626. 2
  25627. -1
  25628. -1
  25629. -1
  25630. 1
  25631. -1
  25632. 44
  25633. 24
  25634. has_property
  25635. 2
  25636. 165
  25637. -1
  25638. all_properties
  25639. 2
  25640. 165
  25641. -1
  25642. has_verb
  25643. 2
  25644. 165
  25645. -1
  25646. has_callable_verb
  25647. 2
  25648. 165
  25649. -1
  25650. all_verbs
  25651. 2
  25652. 165
  25653. -1
  25654. match_verb
  25655. 2
  25656. 165
  25657. -1
  25658. isa
  25659. 38
  25660. 173
  25661. -1
  25662. ancestors
  25663. 38
  25664. 173
  25665. -1
  25666. descendants descendents
  25667. 38
  25668. 173
  25669. -1
  25670. descendants_suspended descendents_suspended
  25671. 2
  25672. 173
  25673. -1
  25674. ordered_descendants
  25675. 38
  25676. 173
  25677. -1
  25678. branches
  25679. 38
  25680. 173
  25681. -1
  25682. branches_suspended
  25683. 2
  25684. 173
  25685. -1
  25686. leaves
  25687. 38
  25688. 173
  25689. -1
  25690. leaves_suspended
  25691. 2
  25692. 173
  25693. -1
  25694. contains
  25695. 38
  25696. 173
  25697. -1
  25698. all_contents
  25699. 38
  25700. 173
  25701. -1
  25702. findable_properties
  25703. 2
  25704. 173
  25705. -1
  25706. owned_properties
  25707. 2
  25708. 173
  25709. -1
  25710. property_conflicts
  25711. 2
  25712. 165
  25713. -1
  25714. descendants_with_property_suspended
  25715. 2
  25716. 165
  25717. -1
  25718. locations
  25719. 2
  25720. 173
  25721. -1
  25722. all_properties_suspended
  25723. 2
  25724. 165
  25725. -1
  25726. connected
  25727. 38
  25728. 165
  25729. -1
  25730. 0
  25731. 4
  25732. 5
  25733. 2
  25734. 4
  25735. 4
  25736. 1
  25737. 2
  25738. object utilities
  25739. 2
  25740. 5
  25741. 4
  25742. 26
  25743. 2
  25744. These routines are useful for finding out information about individual objects.
  25745. 2
  25746.  
  25747. 2
  25748. Examining everything an object has defined on it:
  25749. 2
  25750.   all_verbs          (object) => like it says
  25751. 2
  25752.   all_properties     (object) => likewise
  25753. 2
  25754.   findable_properties(object) => tests to see if caller can "find" them
  25755. 2
  25756.   owned_properties   (object[, owner]) => tests for ownership
  25757. 2
  25758.  
  25759. 2
  25760. Investigating inheritance:
  25761. 2
  25762.   ancestors(object[,object...]) => all ancestors
  25763. 2
  25764.   descendants      (object)     => all descendants
  25765. 2
  25766.   ordered_descendants(object)   => descendants, in a different order
  25767. 2
  25768.   leaves           (object)     => descendants with no children
  25769. 2
  25770.   branches         (object)     => descendants with children 
  25771. 2
  25772.   isa        (object,class) => true iff object is a descendant of class (or ==)
  25773. 2
  25774.  
  25775. 2
  25776. Considering containment:
  25777. 2
  25778.   contains      (obj1, obj2) => Does obj1 contain obj2 (nested)?
  25779. 2
  25780.   all_contents      (object) => return all the (nested) contents of object
  25781. 2
  25782.  
  25783. 2
  25784. Verifying verbs and properties:
  25785. 2
  25786.   has_property(object,pname) => false/true   according as object.(pname) exists
  25787. 2
  25788.   has_verb    (object,vname) => false/{#obj} according as object:(vname) exists
  25789. 2
  25790.   has_callable_verb          => same, but verb must be callable from a program
  25791. 2
  25792.   match_verb  (object,vname) => false/{location, newvname}
  25793. 2
  25794.                                (identify location and usable name of verb)
  25795. 2
  25796. 5
  25797. 4
  25798. 2
  25799. 0
  25800. 14022
  25801. 0
  25802. 743619833
  25803. 2
  25804. 1
  25805. #54
  25806. lock utilities
  25807.  
  25808. 16
  25809. 2
  25810. -1
  25811. -1
  25812. -1
  25813. 1
  25814. -1
  25815. 28
  25816. 11
  25817. init_scanner
  25818. 2
  25819. 173
  25820. -1
  25821. scan_token
  25822. 2
  25823. 173
  25824. -1
  25825. canonicalize_spaces
  25826. 2
  25827. 173
  25828. -1
  25829. parse_keyexp
  25830. 2
  25831. 173
  25832. -1
  25833. parse_E
  25834. 2
  25835. 173
  25836. -1
  25837. parse_A
  25838. 2
  25839. 173
  25840. -1
  25841. eval_key
  25842. 2
  25843. 173
  25844. -1
  25845. match_object
  25846. 2
  25847. 173
  25848. -1
  25849. unparse_key
  25850. 2
  25851. 173
  25852. -1
  25853. eval_key_new
  25854. 2
  25855. 173
  25856. -1
  25857. parse_A_new
  25858. 2
  25859. 173
  25860. -1
  25861. 4
  25862. player
  25863. input_index
  25864. input_length
  25865. input_string
  25866. 8
  25867. 1
  25868. 147
  25869. 2
  25870. 5
  25871. 0
  25872. 3
  25873. 2
  25874. 5
  25875. 0
  25876. 2
  25877. 2
  25878. 5
  25879. 2
  25880. me
  25881. 2
  25882. 5
  25883. 5
  25884. 2
  25885. 4
  25886. 4
  25887. 1
  25888. 2
  25889. lock utilities
  25890. 2
  25891. 5
  25892. 5
  25893. 2
  25894. 5
  25895. 4
  25896. 2
  25897. 0
  25898. 9518
  25899. 0
  25900. 743619830
  25901. 2
  25902. 1
  25903. #55
  25904. generic letter
  25905.  
  25906. 144
  25907. 2
  25908. -1
  25909. -1
  25910. -1
  25911. 9
  25912. -1
  25913. 88
  25914. 3
  25915. burn
  25916. 2
  25917. 41
  25918. -1
  25919. burn_succeeded_msg oburn_succeeded_msg burn_failed_msg oburn_failed_msg
  25920. 2
  25921. 173
  25922. -1
  25923. do_burn
  25924. 2
  25925. 165
  25926. -1
  25927. 4
  25928. oburn_succeeded_msg
  25929. oburn_failed_msg
  25930. burn_failed_msg
  25931. burn_succeeded_msg
  25932. 19
  25933. 2
  25934. stares at %t; %[tps] bursts into flame and disappears, leaving no ash.
  25935. 2
  25936. 5
  25937. 0
  25938. 0
  25939. 2
  25940. 5
  25941. 2
  25942. %T might be damp.  In any case, %[tps] won't burn.
  25943. 2
  25944. 5
  25945. 2
  25946. %T burns with a smokeless flame and leaves no ash.
  25947. 2
  25948. 5
  25949. 5
  25950. 2
  25951. 5
  25952. 5
  25953. 38
  25954. 4
  25955. 5
  25956. 38
  25957. 5
  25958. 5
  25959. 2
  25960. 5
  25961. 5
  25962. 2
  25963. 5
  25964. 5
  25965. 2
  25966. 5
  25967. 5
  25968. 2
  25969. 5
  25970. 5
  25971. 38
  25972. 5
  25973. 5
  25974. 38
  25975. 5
  25976. 5
  25977. 38
  25978. 5
  25979. 2
  25980. This is a private letter.
  25981. 38
  25982. 5
  25983. 5
  25984. 38
  25985. 4
  25986. 4
  25987. 1
  25988. 2
  25989. generic letter
  25990. 38
  25991. 5
  25992. 2
  25993. Some writing on the letter explains that you should 'read letter', and when you've finished, 'burn letter'.
  25994. 38
  25995. 5
  25996. 4
  25997. 2
  25998. 0
  25999. 1793
  26000. 0
  26001. 743619821
  26002. 2
  26003. 1
  26004. #56
  26005. list utilities
  26006.  
  26007. 16
  26008. 38
  26009. -1
  26010. -1
  26011. -1
  26012. 1
  26013. -1
  26014. 5
  26015. 30
  26016. make
  26017. 38
  26018. 173
  26019. -1
  26020. range
  26021. 38
  26022. 173
  26023. -1
  26024. map_prop*erty
  26025. 2
  26026. 173
  26027. -1
  26028. map_verb
  26029. 2
  26030. 173
  26031. -1
  26032. map_arg
  26033. 2
  26034. 173
  26035. -1
  26036. map_builtin
  26037. 2
  26038. 173
  26039. -1
  26040. find_insert
  26041. 38
  26042. 173
  26043. -1
  26044. remove_duplicates
  26045. 38
  26046. 173
  26047. -1
  26048. arrayset
  26049. 38
  26050. 173
  26051. -1
  26052. setremove_all
  26053. 38
  26054. 173
  26055. -1
  26056. append
  26057. 38
  26058. 173
  26059. -1
  26060. reverse
  26061. 38
  26062. 173
  26063. -1
  26064. _reverse
  26065. 38
  26066. 173
  26067. -1
  26068. compress
  26069. 38
  26070. 173
  26071. -1
  26072. sort
  26073. 38
  26074. 173
  26075. -1
  26076. sort_suspended
  26077. 2
  26078. 173
  26079. -1
  26080. slice
  26081. 38
  26082. 173
  26083. -1
  26084. assoc
  26085. 38
  26086. 165
  26087. -1
  26088. iassoc
  26089. 38
  26090. 165
  26091. -1
  26092. iassoc_suspended
  26093. 2
  26094. 165
  26095. -1
  26096. assoc_prefix
  26097. 38
  26098. 173
  26099. -1
  26100. iassoc_prefix
  26101. 38
  26102. 173
  26103. -1
  26104. iassoc_sorted
  26105. 38
  26106. 173
  26107. -1
  26108. sort_alist
  26109. 38
  26110. 173
  26111. -1
  26112. sort_alist_suspended
  26113. 2
  26114. 173
  26115. -1
  26116. randomly_permute
  26117. 38
  26118. 173
  26119. -1
  26120. count
  26121. 2
  26122. 173
  26123. -1
  26124. flatten
  26125. 38
  26126. 173
  26127. -1
  26128. longest shortest
  26129. 38
  26130. 173
  26131. -1
  26132. check_nonstring_tell_lines
  26133. 38
  26134. 173
  26135. -1
  26136. 1
  26137. nonstring_tell_lines
  26138. 5
  26139. 4
  26140. 282
  26141. 4
  26142. 4
  26143. 4
  26144. 5
  26145. 1
  26146. 54875
  26147. 2
  26148. tell_lines
  26149. 1
  26150. 2487
  26151. 1
  26152. 6
  26153. 1
  26154. 54875
  26155. 4
  26156. 5
  26157. 1
  26158. 48928
  26159. 2
  26160. secure
  26161. 1
  26162. 30246
  26163. 1
  26164. 29557
  26165. 1
  26166. 54875
  26167. 4
  26168. 5
  26169. 1
  26170. 48928
  26171. 2
  26172. arm
  26173. 1
  26174. 30246
  26175. 1
  26176. 29557
  26177. 1
  26178. 54875
  26179. 4
  26180. 5
  26181. 1
  26182. 48928
  26183. 2
  26184. press
  26185. 1
  26186. 30246
  26187. 1
  26188. 29557
  26189. 1
  26190. 54875
  26191. 4
  26192. 4
  26193. 4
  26194. 5
  26195. 1
  26196. 46432
  26197. 2
  26198. tell_lines
  26199. 1
  26200. 2487
  26201. 1
  26202. 6
  26203. 1
  26204. 46432
  26205. 4
  26206. 5
  26207. 1
  26208. -1
  26209. 2
  26210.  
  26211. 1
  26212. 46432
  26213. 1
  26214. -1
  26215. 1
  26216. 46432
  26217. 4
  26218. 5
  26219. 1
  26220. 46432
  26221. 2
  26222. eval_cmd_string
  26223. 1
  26224. 46432
  26225. 1
  26226. 217
  26227. 1
  26228. 46432
  26229. 4
  26230. 5
  26231. 1
  26232. 46432
  26233. 2
  26234. eval
  26235. 1
  26236. 46432
  26237. 1
  26238. 217
  26239. 1
  26240. 46432
  26241. 4
  26242. 4
  26243. 4
  26244. 5
  26245. 1
  26246. 52775
  26247. 2
  26248. tell_lines
  26249. 1
  26250. 2487
  26251. 1
  26252. 6
  26253. 1
  26254. 52775
  26255. 4
  26256. 5
  26257. 1
  26258. -1
  26259. 2
  26260.  
  26261. 1
  26262. 52775
  26263. 1
  26264. -1
  26265. 1
  26266. 52775
  26267. 4
  26268. 5
  26269. 1
  26270. 52775
  26271. 2
  26272. eval_cmd_string
  26273. 1
  26274. 52775
  26275. 1
  26276. 217
  26277. 1
  26278. 52775
  26279. 4
  26280. 5
  26281. 1
  26282. 52775
  26283. 2
  26284. eval
  26285. 1
  26286. 52775
  26287. 1
  26288. 217
  26289. 1
  26290. 52775
  26291. 4
  26292. 3
  26293. 4
  26294. 5
  26295. 1
  26296. 30246
  26297. 2
  26298. tell_lines
  26299. 1
  26300. 2487
  26301. 1
  26302. 6
  26303. 1
  26304. 30246
  26305. 4
  26306. 5
  26307. 1
  26308. 41114
  26309. 2
  26310. look_self
  26311. 1
  26312. 53118
  26313. 1
  26314. 53931
  26315. 1
  26316. 30246
  26317. 4
  26318. 5
  26319. 1
  26320. 41114
  26321. 2
  26322. look
  26323. 1
  26324. 4292
  26325. 1
  26326. 11825
  26327. 1
  26328. 30246
  26329. 4
  26330. 2
  26331. 4
  26332. 5
  26333. 1
  26334. 52775
  26335. 2
  26336. tell_lines
  26337. 1
  26338. 2487
  26339. 1
  26340. 6
  26341. 1
  26342. 52775
  26343. 4
  26344. 5
  26345. 1
  26346. 52775
  26347. 2
  26348. confunc
  26349. 1
  26350. 52775
  26351. 1
  26352. 52775
  26353. 1
  26354. 52775
  26355. 4
  26356. 4
  26357. 4
  26358. 5
  26359. 1
  26360. 1449
  26361. 2
  26362. tell_lines
  26363. 1
  26364. 2487
  26365. 1
  26366. 6
  26367. 1
  26368. 1449
  26369. 4
  26370. 5
  26371. 1
  26372. -1
  26373. 2
  26374.  
  26375. 1
  26376. 1449
  26377. 1
  26378. -1
  26379. 1
  26380. 1449
  26381. 4
  26382. 5
  26383. 1
  26384. 1449
  26385. 2
  26386. eval_cmd_string
  26387. 1
  26388. 1449
  26389. 1
  26390. 217
  26391. 1
  26392. 1449
  26393. 4
  26394. 5
  26395. 1
  26396. 1449
  26397. 2
  26398. eval
  26399. 1
  26400. 1449
  26401. 1
  26402. 217
  26403. 1
  26404. 1449
  26405. 4
  26406. 4
  26407. 4
  26408. 5
  26409. 1
  26410. 51902
  26411. 2
  26412. tell_lines
  26413. 1
  26414. 2487
  26415. 1
  26416. 6
  26417. 1
  26418. 51902
  26419. 4
  26420. 5
  26421. 1
  26422. 53151
  26423. 2
  26424. secure
  26425. 1
  26426. 30246
  26427. 1
  26428. 29557
  26429. 1
  26430. 51902
  26431. 4
  26432. 5
  26433. 1
  26434. 53151
  26435. 2
  26436. arm
  26437. 1
  26438. 30246
  26439. 1
  26440. 29557
  26441. 1
  26442. 51902
  26443. 4
  26444. 5
  26445. 1
  26446. 53151
  26447. 2
  26448. press
  26449. 1
  26450. 30246
  26451. 1
  26452. 29557
  26453. 1
  26454. 51902
  26455. 4
  26456. 6
  26457. 4
  26458. 5
  26459. 1
  26460. 56294
  26461. 2
  26462. tell_lines
  26463. 1
  26464. 2487
  26465. 1
  26466. 6
  26467. 1
  26468. 8270
  26469. 4
  26470. 5
  26471. 1
  26472. 56294
  26473. 2
  26474. receive_page
  26475. 1
  26476. 2487
  26477. 1
  26478. 6
  26479. 1
  26480. 8270
  26481. 4
  26482. 5
  26483. 1
  26484. 56294
  26485. 2
  26486. receive_page
  26487. 1
  26488. 47
  26489. 1
  26490. 3133
  26491. 1
  26492. 8270
  26493. 4
  26494. 5
  26495. 1
  26496. 56294
  26497. 2
  26498. receive_page
  26499. 1
  26500. 2487
  26501. 1
  26502. 7069
  26503. 1
  26504. 8270
  26505. 4
  26506. 5
  26507. 1
  26508. 56294
  26509. 2
  26510. page
  26511. 1
  26512. 24442
  26513. 1
  26514. 5803
  26515. 1
  26516. 8270
  26517. 4
  26518. 5
  26519. 1
  26520. 8270
  26521. 2
  26522. call
  26523. 1
  26524. 56294
  26525. 1
  26526. 7680
  26527. 1
  26528. 8270
  26529. 4
  26530. 6
  26531. 4
  26532. 5
  26533. 1
  26534. 56429
  26535. 2
  26536. tell_lines
  26537. 1
  26538. 2487
  26539. 1
  26540. 6
  26541. 1
  26542. 56429
  26543. 4
  26544. 5
  26545. 1
  26546. 36284
  26547. 2
  26548. @dox
  26549. 1
  26550. 19845
  26551. 1
  26552. 36284
  26553. 1
  26554. 56429
  26555. 4
  26556. 5
  26557. 1
  26558. 56429
  26559. 2
  26560. my_huh
  26561. 1
  26562. 56429
  26563. 1
  26564. 6
  26565. 1
  26566. 56429
  26567. 4
  26568. 5
  26569. 1
  26570. 56429
  26571. 2
  26572. my_huh
  26573. 1
  26574. 78
  26575. 1
  26576. 7069
  26577. 1
  26578. 56429
  26579. 4
  26580. 5
  26581. 1
  26582. 219
  26583. 2
  26584. do_huh
  26585. 1
  26586. 56429
  26587. 1
  26588. 219
  26589. 1
  26590. 56429
  26591. 4
  26592. 5
  26593. 1
  26594. 26477
  26595. 2
  26596. @dox
  26597. 1
  26598. 56429
  26599. 1
  26600. 1
  26601. 1
  26602. 56429
  26603. 4
  26604. 2
  26605. 4
  26606. 5
  26607. 1
  26608. 56824
  26609. 2
  26610. tell_lines
  26611. 1
  26612. 2487
  26613. 1
  26614. 6
  26615. 1
  26616. 56824
  26617. 4
  26618. 5
  26619. 1
  26620. 36826
  26621. 2
  26622. secure
  26623. 1
  26624. 30246
  26625. 1
  26626. 29557
  26627. 1
  26628. 56824
  26629. 4
  26630. 4
  26631. 4
  26632. 5
  26633. 1
  26634. 52407
  26635. 2
  26636. tell_lines
  26637. 1
  26638. 2487
  26639. 1
  26640. 6
  26641. 1
  26642. 52407
  26643. 4
  26644. 5
  26645. 1
  26646. 187
  26647. 2
  26648. secure
  26649. 1
  26650. 30246
  26651. 1
  26652. 29557
  26653. 1
  26654. 52407
  26655. 4
  26656. 5
  26657. 1
  26658. 187
  26659. 2
  26660. arm
  26661. 1
  26662. 30246
  26663. 1
  26664. 29557
  26665. 1
  26666. 52407
  26667. 4
  26668. 5
  26669. 1
  26670. 187
  26671. 2
  26672. press
  26673. 1
  26674. 30246
  26675. 1
  26676. 29557
  26677. 1
  26678. 52407
  26679. 4
  26680. 8
  26681. 4
  26682. 5
  26683. 1
  26684. 48961
  26685. 2
  26686. tell_lines
  26687. 1
  26688. 2487
  26689. 1
  26690. 6
  26691. 1
  26692. 48961
  26693. 4
  26694. 5
  26695. 1
  26696. 36284
  26697. 2
  26698. @inspect
  26699. 1
  26700. 19845
  26701. 1
  26702. 36284
  26703. 1
  26704. 48961
  26705. 4
  26706. 5
  26707. 1
  26708. 48961
  26709. 2
  26710. my_huh
  26711. 1
  26712. 48961
  26713. 1
  26714. 6
  26715. 1
  26716. 48961
  26717. 4
  26718. 5
  26719. 1
  26720. 48961
  26721. 2
  26722. my_huh
  26723. 1
  26724. 78
  26725. 1
  26726. 7069
  26727. 1
  26728. 48961
  26729. 4
  26730. 5
  26731. 1
  26732. 48961
  26733. 2
  26734. my_huh
  26735. 1
  26736. 24442
  26737. 1
  26738. 26026
  26739. 1
  26740. 48961
  26741. 4
  26742. 5
  26743. 1
  26744. 48961
  26745. 2
  26746. my_huh
  26747. 1
  26748. 57140
  26749. 1
  26750. 49900
  26751. 1
  26752. 48961
  26753. 4
  26754. 5
  26755. 1
  26756. 219
  26757. 2
  26758. do_huh
  26759. 1
  26760. 48961
  26761. 1
  26762. 219
  26763. 1
  26764. 48961
  26765. 4
  26766. 5
  26767. 1
  26768. 39357
  26769. 2
  26770. @inspect
  26771. 1
  26772. 48961
  26773. 1
  26774. 1
  26775. 1
  26776. 48961
  26777. 4
  26778. 4
  26779. 4
  26780. 5
  26781. 1
  26782. 50290
  26783. 2
  26784. tell_lines
  26785. 1
  26786. 2487
  26787. 1
  26788. 6
  26789. 1
  26790. 50290
  26791. 4
  26792. 5
  26793. 1
  26794. 30744
  26795. 2
  26796. secure
  26797. 1
  26798. 30246
  26799. 1
  26800. 29557
  26801. 1
  26802. 50290
  26803. 4
  26804. 5
  26805. 1
  26806. 30744
  26807. 2
  26808. arm
  26809. 1
  26810. 30246
  26811. 1
  26812. 29557
  26813. 1
  26814. 50290
  26815. 4
  26816. 5
  26817. 1
  26818. 30744
  26819. 2
  26820. press
  26821. 1
  26822. 30246
  26823. 1
  26824. 29557
  26825. 1
  26826. 50290
  26827. 4
  26828. 7
  26829. 4
  26830. 5
  26831. 1
  26832. 54099
  26833. 2
  26834. tell_lines
  26835. 1
  26836. 2487
  26837. 1
  26838. 6
  26839. 1
  26840. 54099
  26841. 4
  26842. 5
  26843. 1
  26844. 30054
  26845. 2
  26846. secure
  26847. 1
  26848. 30246
  26849. 1
  26850. 29557
  26851. 1
  26852. 54099
  26853. 4
  26854. 5
  26855. 1
  26856. 30054
  26857. 2
  26858. arm
  26859. 1
  26860. 30246
  26861. 1
  26862. 29557
  26863. 1
  26864. 54099
  26865. 4
  26866. 5
  26867. 1
  26868. 30054
  26869. 2
  26870. say_parse
  26871. 1
  26872. 30246
  26873. 1
  26874. 29557
  26875. 1
  26876. 54099
  26877. 4
  26878. 5
  26879. 1
  26880. 30054
  26881. 2
  26882. announce
  26883. 1
  26884. 30246
  26885. 1
  26886. 29557
  26887. 1
  26888. 54099
  26889. 4
  26890. 5
  26891. 1
  26892. 54099
  26893. 2
  26894. say
  26895. 1
  26896. 57140
  26897. 1
  26898. 49900
  26899. 1
  26900. 54099
  26901. 4
  26902. 5
  26903. 1
  26904. 54099
  26905. 2
  26906. say
  26907. 1
  26908. 19845
  26909. 1
  26910. 5409
  26911. 1
  26912. 54099
  26913. 4
  26914. 9
  26915. 4
  26916. 5
  26917. 1
  26918. 53471
  26919. 2
  26920. tell_lines
  26921. 1
  26922. 2487
  26923. 1
  26924. 6
  26925. 1
  26926. 53471
  26927. 4
  26928. 5
  26929. 1
  26930. 53914
  26931. 2
  26932. secure
  26933. 1
  26934. 30246
  26935. 1
  26936. 29557
  26937. 1
  26938. 53471
  26939. 4
  26940. 5
  26941. 1
  26942. 53914
  26943. 2
  26944. arm
  26945. 1
  26946. 30246
  26947. 1
  26948. 29557
  26949. 1
  26950. 53471
  26951. 4
  26952. 5
  26953. 1
  26954. 53914
  26955. 2
  26956. say_parse
  26957. 1
  26958. 30246
  26959. 1
  26960. 29557
  26961. 1
  26962. 53471
  26963. 4
  26964. 5
  26965. 1
  26966. 53914
  26967. 2
  26968. announce
  26969. 1
  26970. 30246
  26971. 1
  26972. 29557
  26973. 1
  26974. 53471
  26975. 4
  26976. 5
  26977. 1
  26978. 53914
  26979. 2
  26980. say
  26981. 1
  26982. 2
  26983. 1
  26984. 3
  26985. 1
  26986. 53471
  26987. 4
  26988. 5
  26989. 1
  26990. 53914
  26991. 2
  26992. say
  26993. 1
  26994. 48961
  26995. 1
  26996. 39357
  26997. 1
  26998. 53471
  26999. 4
  27000. 5
  27001. 1
  27002. 53471
  27003. 2
  27004. say
  27005. 1
  27006. 57140
  27007. 1
  27008. 49900
  27009. 1
  27010. 53471
  27011. 4
  27012. 5
  27013. 1
  27014. 53471
  27015. 2
  27016. say
  27017. 1
  27018. 19845
  27019. 1
  27020. 5409
  27021. 1
  27022. 53471
  27023. 4
  27024. 6
  27025. 4
  27026. 5
  27027. 1
  27028. 51626
  27029. 2
  27030. tell_lines
  27031. 1
  27032. 2487
  27033. 1
  27034. 6
  27035. 1
  27036. 52739
  27037. 4
  27038. 5
  27039. 1
  27040. 51626
  27041. 2
  27042. receive_page
  27043. 1
  27044. 2487
  27045. 1
  27046. 6
  27047. 1
  27048. 52739
  27049. 4
  27050. 5
  27051. 1
  27052. 51626
  27053. 2
  27054. receive_page
  27055. 1
  27056. 47
  27057. 1
  27058. 3133
  27059. 1
  27060. 52739
  27061. 4
  27062. 5
  27063. 1
  27064. 51626
  27065. 2
  27066. receive_page
  27067. 1
  27068. 2487
  27069. 1
  27070. 7069
  27071. 1
  27072. 52739
  27073. 4
  27074. 5
  27075. 1
  27076. 51626
  27077. 2
  27078. page
  27079. 1
  27080. 24442
  27081. 1
  27082. 5803
  27083. 1
  27084. 52739
  27085. 4
  27086. 5
  27087. 1
  27088. 52739
  27089. 2
  27090. call
  27091. 1
  27092. 56294
  27093. 1
  27094. 7680
  27095. 1
  27096. 52739
  27097. 4
  27098. 4
  27099. 4
  27100. 5
  27101. 1
  27102. 19845
  27103. 2
  27104. tell_lines
  27105. 1
  27106. 2487
  27107. 1
  27108. 6
  27109. 1
  27110. 19845
  27111. 4
  27112. 5
  27113. 1
  27114. -1
  27115. 2
  27116.  
  27117. 1
  27118. 19845
  27119. 1
  27120. -1
  27121. 1
  27122. 19845
  27123. 4
  27124. 5
  27125. 1
  27126. 19845
  27127. 2
  27128. eval_cmd_string
  27129. 1
  27130. 19845
  27131. 1
  27132. 217
  27133. 1
  27134. 19845
  27135. 4
  27136. 5
  27137. 1
  27138. 19845
  27139. 2
  27140. eval
  27141. 1
  27142. 19845
  27143. 1
  27144. 19845
  27145. 1
  27146. 19845
  27147. 4
  27148. 9
  27149. 4
  27150. 5
  27151. 1
  27152. 50459
  27153. 2
  27154. tell_lines
  27155. 1
  27156. 2487
  27157. 1
  27158. 6
  27159. 1
  27160. 50459
  27161. 4
  27162. 5
  27163. 1
  27164. 54488
  27165. 2
  27166. look_self
  27167. 1
  27168. 50459
  27169. 1
  27170. 54488
  27171. 1
  27172. 50459
  27173. 4
  27174. 5
  27175. 1
  27176. 54488
  27177. 2
  27178. cell_enterfunc
  27179. 1
  27180. 19845
  27181. 1
  27182. 53993
  27183. 1
  27184. 50459
  27185. 4
  27186. 5
  27187. 1
  27188. 54488
  27189. 2
  27190. cell_enterfunc
  27191. 1
  27192. 19845
  27193. 1
  27194. 35120
  27195. 1
  27196. 50459
  27197. 4
  27198. 5
  27199. 1
  27200. 54488
  27201. 2
  27202. cell_enterfunc
  27203. 1
  27204. 19845
  27205. 1
  27206. 7970
  27207. 1
  27208. 50459
  27209. 4
  27210. 5
  27211. 1
  27212. 54488
  27213. 2
  27214. cell_enterfunc
  27215. 1
  27216. 50459
  27217. 1
  27218. 54488
  27219. 1
  27220. 50459
  27221. 4
  27222. 5
  27223. 1
  27224. 54488
  27225. 2
  27226. place_object
  27227. 1
  27228. 19845
  27229. 1
  27230. 53993
  27231. 1
  27232. 50459
  27233. 4
  27234. 5
  27235. 1
  27236. 54488
  27237. 2
  27238. sw
  27239. 1
  27240. 19845
  27241. 1
  27242. 53993
  27243. 1
  27244. 50459
  27245. 4
  27246. 5
  27247. 1
  27248. 54488
  27249. 2
  27250. sw
  27251. 1
  27252. 19845
  27253. 1
  27254. 5804
  27255. 1
  27256. 50459
  27257. 4
  27258. 9
  27259. 4
  27260. 5
  27261. 1
  27262. 50459
  27263. 2
  27264. tell_lines
  27265. 1
  27266. 2487
  27267. 1
  27268. 6
  27269. 1
  27270. 50459
  27271. 4
  27272. 5
  27273. 1
  27274. 54488
  27275. 2
  27276. look_self
  27277. 1
  27278. 50459
  27279. 1
  27280. 54488
  27281. 1
  27282. 50459
  27283. 4
  27284. 5
  27285. 1
  27286. 54488
  27287. 2
  27288. cell_enterfunc
  27289. 1
  27290. 19845
  27291. 1
  27292. 53993
  27293. 1
  27294. 50459
  27295. 4
  27296. 5
  27297. 1
  27298. 54488
  27299. 2
  27300. cell_enterfunc
  27301. 1
  27302. 19845
  27303. 1
  27304. 35120
  27305. 1
  27306. 50459
  27307. 4
  27308. 5
  27309. 1
  27310. 54488
  27311. 2
  27312. cell_enterfunc
  27313. 1
  27314. 19845
  27315. 1
  27316. 7970
  27317. 1
  27318. 50459
  27319. 4
  27320. 5
  27321. 1
  27322. 54488
  27323. 2
  27324. cell_enterfunc
  27325. 1
  27326. 50459
  27327. 1
  27328. 54488
  27329. 1
  27330. 50459
  27331. 4
  27332. 5
  27333. 1
  27334. 54488
  27335. 2
  27336. place_object
  27337. 1
  27338. 19845
  27339. 1
  27340. 53993
  27341. 1
  27342. 50459
  27343. 4
  27344. 5
  27345. 1
  27346. 54488
  27347. 2
  27348. w
  27349. 1
  27350. 19845
  27351. 1
  27352. 53993
  27353. 1
  27354. 50459
  27355. 4
  27356. 5
  27357. 1
  27358. 54488
  27359. 2
  27360. w
  27361. 1
  27362. 19845
  27363. 1
  27364. 5804
  27365. 1
  27366. 50459
  27367. 4
  27368. 11
  27369. 4
  27370. 5
  27371. 1
  27372. 50636
  27373. 2
  27374. tell_lines
  27375. 1
  27376. 2487
  27377. 1
  27378. 6
  27379. 1
  27380. 50636
  27381. 4
  27382. 5
  27383. 1
  27384. 22566
  27385. 2
  27386. look_self
  27387. 1
  27388. 15
  27389. 1
  27390. 6792
  27391. 1
  27392. 50636
  27393. 4
  27394. 5
  27395. 1
  27396. 22566
  27397. 2
  27398. enterfunc
  27399. 1
  27400. 2
  27401. 1
  27402. 3
  27403. 1
  27404. 50636
  27405. 4
  27406. 5
  27407. 1
  27408. 22566
  27409. 2
  27410. enterfunc
  27411. 1
  27412. 2693
  27413. 1
  27414. 258
  27415. 1
  27416. 50636
  27417. 4
  27418. 5
  27419. 1
  27420. 22566
  27421. 2
  27422. enterfunc
  27423. 1
  27424. 50636
  27425. 1
  27426. 22566
  27427. 1
  27428. 50636
  27429. 4
  27430. 5
  27431. 1
  27432. 50636
  27433. 2
  27434. moveto
  27435. 1
  27436. 50636
  27437. 1
  27438. 1
  27439. 1
  27440. 50636
  27441. 4
  27442. 5
  27443. 1
  27444. 50636
  27445. 2
  27446. moveto
  27447. 1
  27448. 47
  27449. 1
  27450. 6
  27451. 1
  27452. 50636
  27453. 4
  27454. 5
  27455. 1
  27456. 50636
  27457. 2
  27458. moveto
  27459. 1
  27460. 47
  27461. 1
  27462. 3133
  27463. 1
  27464. 50636
  27465. 4
  27466. 5
  27467. 1
  27468. 50636
  27469. 2
  27470. moveto
  27471. 1
  27472. 78
  27473. 1
  27474. 7069
  27475. 1
  27476. 50636
  27477. 4
  27478. 5
  27479. 1
  27480. 50636
  27481. 2
  27482. moveto
  27483. 1
  27484. 3685
  27485. 1
  27486. 8855
  27487. 1
  27488. 50636
  27489. 4
  27490. 5
  27491. 1
  27492. 5443
  27493. 2
  27494. done
  27495. 1
  27496. 6336
  27497. 1
  27498. 5400
  27499. 1
  27500. 50636
  27501. 4
  27502. 7
  27503. 4
  27504. 5
  27505. 1
  27506. 34107
  27507. 2
  27508. tell_lines
  27509. 1
  27510. 2487
  27511. 1
  27512. 6
  27513. 1
  27514. 34107
  27515. 4
  27516. 5
  27517. 1
  27518. 7944
  27519. 2
  27520. secure
  27521. 1
  27522. 30246
  27523. 1
  27524. 29557
  27525. 1
  27526. 34107
  27527. 4
  27528. 5
  27529. 1
  27530. 7944
  27531. 2
  27532. arm
  27533. 1
  27534. 30246
  27535. 1
  27536. 29557
  27537. 1
  27538. 34107
  27539. 4
  27540. 5
  27541. 1
  27542. 7944
  27543. 2
  27544. say_parse
  27545. 1
  27546. 30246
  27547. 1
  27548. 29557
  27549. 1
  27550. 34107
  27551. 4
  27552. 5
  27553. 1
  27554. 7944
  27555. 2
  27556. announce
  27557. 1
  27558. 30246
  27559. 1
  27560. 29557
  27561. 1
  27562. 34107
  27563. 4
  27564. 5
  27565. 1
  27566. 7944
  27567. 2
  27568. say
  27569. 1
  27570. 2
  27571. 1
  27572. 3
  27573. 1
  27574. 34107
  27575. 4
  27576. 5
  27577. 1
  27578. 34107
  27579. 2
  27580. say
  27581. 1
  27582. 31783
  27583. 1
  27584. 4803
  27585. 1
  27586. 34107
  27587. 4
  27588. 2
  27589. 4
  27590. 5
  27591. 1
  27592. 48961
  27593. 2
  27594. tell_lines
  27595. 1
  27596. 2487
  27597. 1
  27598. 6
  27599. 1
  27600. 48961
  27601. 4
  27602. 5
  27603. 1
  27604. 2934
  27605. 2
  27606. secure
  27607. 1
  27608. 30246
  27609. 1
  27610. 29557
  27611. 1
  27612. 48961
  27613. 4
  27614. 6
  27615. 4
  27616. 5
  27617. 1
  27618. 56824
  27619. 2
  27620. tell_lines
  27621. 1
  27622. 2487
  27623. 1
  27624. 6
  27625. 1
  27626. 56824
  27627. 4
  27628. 5
  27629. 1
  27630. 36826
  27631. 2
  27632. secure
  27633. 1
  27634. 30246
  27635. 1
  27636. 29557
  27637. 1
  27638. 56824
  27639. 4
  27640. 5
  27641. 1
  27642. 36826
  27643. 2
  27644. arm
  27645. 1
  27646. 30246
  27647. 1
  27648. 29557
  27649. 1
  27650. 56824
  27651. 4
  27652. 5
  27653. 1
  27654. 36826
  27655. 2
  27656. say_parse
  27657. 1
  27658. 30246
  27659. 1
  27660. 29557
  27661. 1
  27662. 56824
  27663. 4
  27664. 5
  27665. 1
  27666. 36826
  27667. 2
  27668. announce
  27669. 1
  27670. 30246
  27671. 1
  27672. 29557
  27673. 1
  27674. 56824
  27675. 4
  27676. 5
  27677. 1
  27678. 56824
  27679. 2
  27680. say
  27681. 1
  27682. 57140
  27683. 1
  27684. 49900
  27685. 1
  27686. 56824
  27687. 4
  27688. 8
  27689. 4
  27690. 5
  27691. 1
  27692. 48961
  27693. 2
  27694. tell_lines
  27695. 1
  27696. 2487
  27697. 1
  27698. 6
  27699. 1
  27700. 48961
  27701. 4
  27702. 5
  27703. 1
  27704. 49519
  27705. 2
  27706. secure
  27707. 1
  27708. 30246
  27709. 1
  27710. 29557
  27711. 1
  27712. 48961
  27713. 4
  27714. 5
  27715. 1
  27716. 49519
  27717. 2
  27718. arm
  27719. 1
  27720. 30246
  27721. 1
  27722. 29557
  27723. 1
  27724. 48961
  27725. 4
  27726. 5
  27727. 1
  27728. 49519
  27729. 2
  27730. say_parse
  27731. 1
  27732. 30246
  27733. 1
  27734. 29557
  27735. 1
  27736. 48961
  27737. 4
  27738. 5
  27739. 1
  27740. 49519
  27741. 2
  27742. announce
  27743. 1
  27744. 30246
  27745. 1
  27746. 29557
  27747. 1
  27748. 48961
  27749. 4
  27750. 5
  27751. 1
  27752. 49519
  27753. 2
  27754. announce
  27755. 1
  27756. 48961
  27757. 1
  27758. 39357
  27759. 1
  27760. 48961
  27761. 4
  27762. 5
  27763. 1
  27764. 48961
  27765. 2
  27766. say
  27767. 1
  27768. 57140
  27769. 1
  27770. 49900
  27771. 1
  27772. 48961
  27773. 4
  27774. 5
  27775. 1
  27776. 48961
  27777. 2
  27778. say
  27779. 1
  27780. 19845
  27781. 1
  27782. 5409
  27783. 1
  27784. 48961
  27785. 4
  27786. 7
  27787. 4
  27788. 5
  27789. 1
  27790. 56872
  27791. 2
  27792. tell_lines
  27793. 1
  27794. 2487
  27795. 1
  27796. 6
  27797. 1
  27798. 56872
  27799. 4
  27800. 5
  27801. 1
  27802. 39439
  27803. 2
  27804. secure
  27805. 1
  27806. 30246
  27807. 1
  27808. 29557
  27809. 1
  27810. 56872
  27811. 4
  27812. 5
  27813. 1
  27814. 39439
  27815. 2
  27816. arm
  27817. 1
  27818. 30246
  27819. 1
  27820. 29557
  27821. 1
  27822. 56872
  27823. 4
  27824. 5
  27825. 1
  27826. 39439
  27827. 2
  27828. say_parse
  27829. 1
  27830. 30246
  27831. 1
  27832. 29557
  27833. 1
  27834. 56872
  27835. 4
  27836. 5
  27837. 1
  27838. 39439
  27839. 2
  27840. announce
  27841. 1
  27842. 30246
  27843. 1
  27844. 29557
  27845. 1
  27846. 56872
  27847. 4
  27848. 5
  27849. 1
  27850. 39439
  27851. 2
  27852. say
  27853. 1
  27854. 2
  27855. 1
  27856. 3
  27857. 1
  27858. 56872
  27859. 4
  27860. 5
  27861. 1
  27862. 56872
  27863. 2
  27864. say
  27865. 1
  27866. 31783
  27867. 1
  27868. 4803
  27869. 1
  27870. 56872
  27871. 4
  27872. 4
  27873. 4
  27874. 5
  27875. 1
  27876. 57014
  27877. 2
  27878. tell_lines
  27879. 1
  27880. 2487
  27881. 1
  27882. 6
  27883. 1
  27884. 57014
  27885. 4
  27886. 5
  27887. 1
  27888. 55869
  27889. 2
  27890. secure
  27891. 1
  27892. 30246
  27893. 1
  27894. 29557
  27895. 1
  27896. 57014
  27897. 4
  27898. 5
  27899. 1
  27900. 55869
  27901. 2
  27902. arm
  27903. 1
  27904. 30246
  27905. 1
  27906. 29557
  27907. 1
  27908. 57014
  27909. 4
  27910. 5
  27911. 1
  27912. 55869
  27913. 2
  27914. press
  27915. 1
  27916. 30246
  27917. 1
  27918. 29557
  27919. 1
  27920. 57014
  27921. 4
  27922. 3
  27923. 4
  27924. 5
  27925. 1
  27926. 52775
  27927. 2
  27928. tell_lines
  27929. 1
  27930. 2487
  27931. 1
  27932. 6
  27933. 1
  27934. 52775
  27935. 4
  27936. 5
  27937. 1
  27938. 25465
  27939. 2
  27940. look_self
  27941. 1
  27942. 2612
  27943. 1
  27944. 13131
  27945. 1
  27946. 52775
  27947. 4
  27948. 5
  27949. 1
  27950. 5443
  27951. 2
  27952. l
  27953. 1
  27954. 2
  27955. 1
  27956. 3
  27957. 1
  27958. 52775
  27959. 4
  27960. 6
  27961. 4
  27962. 5
  27963. 1
  27964. 56819
  27965. 2
  27966. tell_lines
  27967. 1
  27968. 2487
  27969. 1
  27970. 6
  27971. 1
  27972. 56819
  27973. 4
  27974. 5
  27975. 1
  27976. 52619
  27977. 2
  27978. secure
  27979. 1
  27980. 30246
  27981. 1
  27982. 29557
  27983. 1
  27984. 56819
  27985. 4
  27986. 5
  27987. 1
  27988. 52619
  27989. 2
  27990. arm
  27991. 1
  27992. 30246
  27993. 1
  27994. 29557
  27995. 1
  27996. 56819
  27997. 4
  27998. 5
  27999. 1
  28000. 52619
  28001. 2
  28002. say_parse
  28003. 1
  28004. 30246
  28005. 1
  28006. 29557
  28007. 1
  28008. 56819
  28009. 4
  28010. 5
  28011. 1
  28012. 52619
  28013. 2
  28014. announce
  28015. 1
  28016. 30246
  28017. 1
  28018. 29557
  28019. 1
  28020. 56819
  28021. 4
  28022. 5
  28023. 1
  28024. 56819
  28025. 2
  28026. say
  28027. 1
  28028. 57140
  28029. 1
  28030. 49900
  28031. 1
  28032. 56819
  28033. 4
  28034. 6
  28035. 4
  28036. 5
  28037. 1
  28038. 56244
  28039. 2
  28040. tell_lines
  28041. 1
  28042. 2487
  28043. 1
  28044. 6
  28045. 1
  28046. 56244
  28047. 4
  28048. 5
  28049. 1
  28050. 22110
  28051. 2
  28052. secure
  28053. 1
  28054. 30246
  28055. 1
  28056. 29557
  28057. 1
  28058. 56244
  28059. 4
  28060. 5
  28061. 1
  28062. 22110
  28063. 2
  28064. arm
  28065. 1
  28066. 30246
  28067. 1
  28068. 29557
  28069. 1
  28070. 56244
  28071. 4
  28072. 5
  28073. 1
  28074. 22110
  28075. 2
  28076. say_parse
  28077. 1
  28078. 30246
  28079. 1
  28080. 29557
  28081. 1
  28082. 56244
  28083. 4
  28084. 5
  28085. 1
  28086. 22110
  28087. 2
  28088. announce
  28089. 1
  28090. 30246
  28091. 1
  28092. 29557
  28093. 1
  28094. 56244
  28095. 4
  28096. 5
  28097. 1
  28098. 22110
  28099. 2
  28100. say
  28101. 1
  28102. 2
  28103. 1
  28104. 3
  28105. 1
  28106. 56244
  28107. 4
  28108. 9
  28109. 4
  28110. 5
  28111. 1
  28112. 56429
  28113. 2
  28114. tell_lines
  28115. 1
  28116. 2487
  28117. 1
  28118. 6
  28119. 1
  28120. 43852
  28121. 4
  28122. 5
  28123. 1
  28124. 56429
  28125. 2
  28126. receive_page
  28127. 1
  28128. 2487
  28129. 1
  28130. 6
  28131. 1
  28132. 43852
  28133. 4
  28134. 5
  28135. 1
  28136. 56429
  28137. 2
  28138. receive_page
  28139. 1
  28140. 47
  28141. 1
  28142. 3133
  28143. 1
  28144. 43852
  28145. 4
  28146. 5
  28147. 1
  28148. 56429
  28149. 2
  28150. receive_page
  28151. 1
  28152. 2487
  28153. 1
  28154. 7069
  28155. 1
  28156. 43852
  28157. 4
  28158. 5
  28159. 1
  28160. 56429
  28161. 2
  28162. page
  28163. 1
  28164. 24442
  28165. 1
  28166. 5803
  28167. 1
  28168. 43852
  28169. 4
  28170. 5
  28171. 1
  28172. 43852
  28173. 2
  28174. call
  28175. 1
  28176. 41057
  28177. 1
  28178. 7680
  28179. 1
  28180. 43852
  28181. 4
  28182. 5
  28183. 1
  28184. 43852
  28185. 2
  28186. do
  28187. 1
  28188. 78
  28189. 1
  28190. 7680
  28191. 1
  28192. 56429
  28193. 4
  28194. 5
  28195. 1
  28196. 43852
  28197. 2
  28198. do
  28199. 1
  28200. 41057
  28201. 1
  28202. 7608
  28203. 1
  28204. 56429
  28205. 4
  28206. 5
  28207. 1
  28208. 43852
  28209. 2
  28210. command
  28211. 1
  28212. 78
  28213. 1
  28214. 7680
  28215. 1
  28216. 56429
  28217. 4
  28218. 4
  28219. 4
  28220. 5
  28221. 1
  28222. 56815
  28223. 2
  28224. tell_lines
  28225. 1
  28226. 2487
  28227. 1
  28228. 6
  28229. 1
  28230. 56815
  28231. 4
  28232. 5
  28233. 1
  28234. 54413
  28235. 2
  28236. secure
  28237. 1
  28238. 30246
  28239. 1
  28240. 29557
  28241. 1
  28242. 56815
  28243. 4
  28244. 5
  28245. 1
  28246. 54413
  28247. 2
  28248. arm
  28249. 1
  28250. 30246
  28251. 1
  28252. 29557
  28253. 1
  28254. 56815
  28255. 4
  28256. 5
  28257. 1
  28258. 54413
  28259. 2
  28260. press
  28261. 1
  28262. 30246
  28263. 1
  28264. 29557
  28265. 1
  28266. 56815
  28267. 4
  28268. 6
  28269. 4
  28270. 5
  28271. 1
  28272. 57122
  28273. 2
  28274. tell_lines
  28275. 1
  28276. 2487
  28277. 1
  28278. 6
  28279. 1
  28280. 57122
  28281. 4
  28282. 5
  28283. 1
  28284. 31891
  28285. 2
  28286. secure
  28287. 1
  28288. 30246
  28289. 1
  28290. 29557
  28291. 1
  28292. 57122
  28293. 4
  28294. 5
  28295. 1
  28296. 31891
  28297. 2
  28298. arm
  28299. 1
  28300. 30246
  28301. 1
  28302. 29557
  28303. 1
  28304. 57122
  28305. 4
  28306. 5
  28307. 1
  28308. 31891
  28309. 2
  28310. say_parse
  28311. 1
  28312. 30246
  28313. 1
  28314. 29557
  28315. 1
  28316. 57122
  28317. 4
  28318. 5
  28319. 1
  28320. 31891
  28321. 2
  28322. announce
  28323. 1
  28324. 30246
  28325. 1
  28326. 29557
  28327. 1
  28328. 57122
  28329. 4
  28330. 5
  28331. 1
  28332. 31891
  28333. 2
  28334. say
  28335. 1
  28336. 2
  28337. 1
  28338. 3
  28339. 1
  28340. 57122
  28341. 4
  28342. 7
  28343. 4
  28344. 5
  28345. 1
  28346. 56815
  28347. 2
  28348. tell_lines
  28349. 1
  28350. 2487
  28351. 1
  28352. 6
  28353. 1
  28354. 56815
  28355. 4
  28356. 5
  28357. 1
  28358. 54413
  28359. 2
  28360. secure
  28361. 1
  28362. 30246
  28363. 1
  28364. 29557
  28365. 1
  28366. 56815
  28367. 4
  28368. 5
  28369. 1
  28370. 54413
  28371. 2
  28372. arm
  28373. 1
  28374. 30246
  28375. 1
  28376. 29557
  28377. 1
  28378. 56815
  28379. 4
  28380. 5
  28381. 1
  28382. 54413
  28383. 2
  28384. say_parse
  28385. 1
  28386. 30246
  28387. 1
  28388. 29557
  28389. 1
  28390. 56815
  28391. 4
  28392. 5
  28393. 1
  28394. 54413
  28395. 2
  28396. announce
  28397. 1
  28398. 30246
  28399. 1
  28400. 29557
  28401. 1
  28402. 56815
  28403. 4
  28404. 5
  28405. 1
  28406. 56815
  28407. 2
  28408. say
  28409. 1
  28410. 57140
  28411. 1
  28412. 49900
  28413. 1
  28414. 56815
  28415. 4
  28416. 5
  28417. 1
  28418. 56815
  28419. 2
  28420. say
  28421. 1
  28422. 19845
  28423. 1
  28424. 5409
  28425. 1
  28426. 56815
  28427. 4
  28428. 9
  28429. 4
  28430. 5
  28431. 1
  28432. 57464
  28433. 2
  28434. tell_lines
  28435. 1
  28436. 2487
  28437. 1
  28438. 6
  28439. 1
  28440. 53121
  28441. 4
  28442. 5
  28443. 1
  28444. 57464
  28445. 2
  28446. receive_page
  28447. 1
  28448. 2487
  28449. 1
  28450. 6
  28451. 1
  28452. 53121
  28453. 4
  28454. 5
  28455. 1
  28456. 57464
  28457. 2
  28458. receive_page
  28459. 1
  28460. 47
  28461. 1
  28462. 3133
  28463. 1
  28464. 53121
  28465. 4
  28466. 5
  28467. 1
  28468. 57464
  28469. 2
  28470. receive_page
  28471. 1
  28472. 2487
  28473. 1
  28474. 7069
  28475. 1
  28476. 53121
  28477. 4
  28478. 5
  28479. 1
  28480. 57464
  28481. 2
  28482. page
  28483. 1
  28484. 24442
  28485. 1
  28486. 5803
  28487. 1
  28488. 53121
  28489. 4
  28490. 5
  28491. 1
  28492. 53121
  28493. 2
  28494. call
  28495. 1
  28496. 41057
  28497. 1
  28498. 7680
  28499. 1
  28500. 53121
  28501. 4
  28502. 5
  28503. 1
  28504. 53121
  28505. 2
  28506. do
  28507. 1
  28508. 78
  28509. 1
  28510. 7680
  28511. 1
  28512. 57464
  28513. 4
  28514. 5
  28515. 1
  28516. 53121
  28517. 2
  28518. do
  28519. 1
  28520. 41057
  28521. 1
  28522. 7608
  28523. 1
  28524. 57464
  28525. 4
  28526. 5
  28527. 1
  28528. 53121
  28529. 2
  28530. command
  28531. 1
  28532. 78
  28533. 1
  28534. 7680
  28535. 1
  28536. 57464
  28537. 4
  28538. 4
  28539. 4
  28540. 5
  28541. 1
  28542. 35203
  28543. 2
  28544. tell_lines
  28545. 1
  28546. 2487
  28547. 1
  28548. 6
  28549. 1
  28550. 35203
  28551. 4
  28552. 5
  28553. 1
  28554. 6946
  28555. 2
  28556. secure
  28557. 1
  28558. 30246
  28559. 1
  28560. 29557
  28561. 1
  28562. 35203
  28563. 4
  28564. 5
  28565. 1
  28566. 6946
  28567. 2
  28568. arm
  28569. 1
  28570. 30246
  28571. 1
  28572. 29557
  28573. 1
  28574. 35203
  28575. 4
  28576. 5
  28577. 1
  28578. 6946
  28579. 2
  28580. press
  28581. 1
  28582. 30246
  28583. 1
  28584. 29557
  28585. 1
  28586. 35203
  28587. 4
  28588. 5
  28589. 4
  28590. 5
  28591. 1
  28592. 24436
  28593. 2
  28594. tell_lines
  28595. 1
  28596. 2487
  28597. 1
  28598. 6
  28599. 1
  28600. 24436
  28601. 4
  28602. 5
  28603. 1
  28604. 6712
  28605. 2
  28606. key
  28607. 1
  28608. 30246
  28609. 1
  28610. 6712
  28611. 1
  28612. 24436
  28613. 4
  28614. 5
  28615. 1
  28616. -1
  28617. 2
  28618.  
  28619. 1
  28620. 24436
  28621. 1
  28622. -1
  28623. 1
  28624. 24436
  28625. 4
  28626. 5
  28627. 1
  28628. 24436
  28629. 2
  28630. eval_cmd_string
  28631. 1
  28632. 24436
  28633. 1
  28634. 217
  28635. 1
  28636. 24436
  28637. 4
  28638. 5
  28639. 1
  28640. 24436
  28641. 2
  28642. eval
  28643. 1
  28644. 24436
  28645. 1
  28646. 217
  28647. 1
  28648. 24436
  28649. 4
  28650. 2
  28651. 4
  28652. 5
  28653. 1
  28654. 24436
  28655. 2
  28656. tell_lines
  28657. 1
  28658. 2487
  28659. 1
  28660. 6
  28661. 1
  28662. 24436
  28663. 4
  28664. 5
  28665. 1
  28666. 6686
  28667. 2
  28668. key
  28669. 1
  28670. 30246
  28671. 1
  28672. 6686
  28673. 1
  28674. 24436
  28675. 4
  28676. 4
  28677. 4
  28678. 5
  28679. 1
  28680. 2957
  28681. 2
  28682. tell_lines
  28683. 1
  28684. 2487
  28685. 1
  28686. 6
  28687. 1
  28688. 2957
  28689. 4
  28690. 5
  28691. 1
  28692. -1
  28693. 2
  28694.  
  28695. 1
  28696. 2957
  28697. 1
  28698. -1
  28699. 1
  28700. 2957
  28701. 4
  28702. 5
  28703. 1
  28704. 2957
  28705. 2
  28706. eval_cmd_string
  28707. 1
  28708. 2957
  28709. 1
  28710. 217
  28711. 1
  28712. 2957
  28713. 4
  28714. 5
  28715. 1
  28716. 2957
  28717. 2
  28718. eval
  28719. 1
  28720. 2957
  28721. 1
  28722. 217
  28723. 1
  28724. 2957
  28725. 4
  28726. 7
  28727. 4
  28728. 5
  28729. 1
  28730. 50624
  28731. 2
  28732. tell_lines
  28733. 1
  28734. 2487
  28735. 1
  28736. 6
  28737. 1
  28738. 50624
  28739. 4
  28740. 5
  28741. 1
  28742. 40295
  28743. 2
  28744. secure
  28745. 1
  28746. 30246
  28747. 1
  28748. 29557
  28749. 1
  28750. 50624
  28751. 4
  28752. 5
  28753. 1
  28754. 40295
  28755. 2
  28756. arm
  28757. 1
  28758. 30246
  28759. 1
  28760. 29557
  28761. 1
  28762. 50624
  28763. 4
  28764. 5
  28765. 1
  28766. 40295
  28767. 2
  28768. say_parse
  28769. 1
  28770. 30246
  28771. 1
  28772. 29557
  28773. 1
  28774. 50624
  28775. 4
  28776. 5
  28777. 1
  28778. 40295
  28779. 2
  28780. announce
  28781. 1
  28782. 30246
  28783. 1
  28784. 29557
  28785. 1
  28786. 50624
  28787. 4
  28788. 5
  28789. 1
  28790. 40295
  28791. 2
  28792. say
  28793. 1
  28794. 2
  28795. 1
  28796. 3
  28797. 1
  28798. 50624
  28799. 4
  28800. 5
  28801. 1
  28802. 50624
  28803. 2
  28804. say
  28805. 1
  28806. 31783
  28807. 1
  28808. 4803
  28809. 1
  28810. 50624
  28811. 4
  28812. 4
  28813. 4
  28814. 5
  28815. 1
  28816. 53465
  28817. 2
  28818. tell_lines
  28819. 1
  28820. 2487
  28821. 1
  28822. 6
  28823. 1
  28824. 53465
  28825. 4
  28826. 5
  28827. 1
  28828. 5008
  28829. 2
  28830. secure
  28831. 1
  28832. 30246
  28833. 1
  28834. 29557
  28835. 1
  28836. 53465
  28837. 4
  28838. 5
  28839. 1
  28840. 5008
  28841. 2
  28842. arm
  28843. 1
  28844. 30246
  28845. 1
  28846. 29557
  28847. 1
  28848. 53465
  28849. 4
  28850. 5
  28851. 1
  28852. 5008
  28853. 2
  28854. press
  28855. 1
  28856. 30246
  28857. 1
  28858. 29557
  28859. 1
  28860. 53465
  28861. 4
  28862. 2
  28863. 4
  28864. 5
  28865. 1
  28866. 50459
  28867. 2
  28868. tell_lines
  28869. 1
  28870. 2487
  28871. 1
  28872. 6
  28873. 1
  28874. 50459
  28875. 4
  28876. 5
  28877. 1
  28878. 9200
  28879. 2
  28880. about
  28881. 1
  28882. 50459
  28883. 1
  28884. 9200
  28885. 1
  28886. 50459
  28887. 4
  28888. 4
  28889. 4
  28890. 5
  28891. 1
  28892. 46432
  28893. 2
  28894. tell_lines
  28895. 1
  28896. 2487
  28897. 1
  28898. 6
  28899. 1
  28900. 46432
  28901. 4
  28902. 5
  28903. 1
  28904. 11853
  28905. 2
  28906. secure
  28907. 1
  28908. 30246
  28909. 1
  28910. 29557
  28911. 1
  28912. 46432
  28913. 4
  28914. 5
  28915. 1
  28916. 11853
  28917. 2
  28918. arm
  28919. 1
  28920. 30246
  28921. 1
  28922. 29557
  28923. 1
  28924. 46432
  28925. 4
  28926. 5
  28927. 1
  28928. 11853
  28929. 2
  28930. press
  28931. 1
  28932. 30246
  28933. 1
  28934. 29557
  28935. 1
  28936. 46432
  28937. 4
  28938. 8
  28939. 4
  28940. 5
  28941. 1
  28942. 56968
  28943. 2
  28944. tell_lines
  28945. 1
  28946. 2487
  28947. 1
  28948. 6
  28949. 1
  28950. 56968
  28951. 4
  28952. 5
  28953. 1
  28954. 36284
  28955. 2
  28956. @dox
  28957. 1
  28958. 19845
  28959. 1
  28960. 36284
  28961. 1
  28962. 56968
  28963. 4
  28964. 5
  28965. 1
  28966. 56968
  28967. 2
  28968. my_huh
  28969. 1
  28970. 56968
  28971. 1
  28972. 6
  28973. 1
  28974. 56968
  28975. 4
  28976. 5
  28977. 1
  28978. 56968
  28979. 2
  28980. my_huh
  28981. 1
  28982. 78
  28983. 1
  28984. 7069
  28985. 1
  28986. 56968
  28987. 4
  28988. 5
  28989. 1
  28990. 56968
  28991. 2
  28992. my_huh
  28993. 1
  28994. 24442
  28995. 1
  28996. 26026
  28997. 1
  28998. 56968
  28999. 4
  29000. 5
  29001. 1
  29002. 56968
  29003. 2
  29004. my_huh
  29005. 1
  29006. 57140
  29007. 1
  29008. 49900
  29009. 1
  29010. 56968
  29011. 4
  29012. 5
  29013. 1
  29014. 219
  29015. 2
  29016. do_huh
  29017. 1
  29018. 56968
  29019. 1
  29020. 219
  29021. 1
  29022. 56968
  29023. 4
  29024. 5
  29025. 1
  29026. 56977
  29027. 2
  29028. @dox
  29029. 1
  29030. 56968
  29031. 1
  29032. 1
  29033. 1
  29034. 56968
  29035. 4
  29036. 7
  29037. 4
  29038. 5
  29039. 1
  29040. 54837
  29041. 2
  29042. tell_lines
  29043. 1
  29044. 2487
  29045. 1
  29046. 6
  29047. 1
  29048. 54837
  29049. 4
  29050. 5
  29051. 1
  29052. 38607
  29053. 2
  29054. secure
  29055. 1
  29056. 30246
  29057. 1
  29058. 29557
  29059. 1
  29060. 54837
  29061. 4
  29062. 5
  29063. 1
  29064. 38607
  29065. 2
  29066. arm
  29067. 1
  29068. 30246
  29069. 1
  29070. 29557
  29071. 1
  29072. 54837
  29073. 4
  29074. 5
  29075. 1
  29076. 38607
  29077. 2
  29078. say_parse
  29079. 1
  29080. 30246
  29081. 1
  29082. 29557
  29083. 1
  29084. 54837
  29085. 4
  29086. 5
  29087. 1
  29088. 38607
  29089. 2
  29090. announce
  29091. 1
  29092. 30246
  29093. 1
  29094. 29557
  29095. 1
  29096. 54837
  29097. 4
  29098. 5
  29099. 1
  29100. 38607
  29101. 2
  29102. say
  29103. 1
  29104. 2
  29105. 1
  29106. 3
  29107. 1
  29108. 54837
  29109. 4
  29110. 5
  29111. 1
  29112. 54837
  29113. 2
  29114. say
  29115. 1
  29116. 31783
  29117. 1
  29118. 4803
  29119. 1
  29120. 54837
  29121. 4
  29122. 7
  29123. 4
  29124. 5
  29125. 1
  29126. 53702
  29127. 2
  29128. tell_lines
  29129. 1
  29130. 2487
  29131. 1
  29132. 6
  29133. 1
  29134. 53702
  29135. 4
  29136. 5
  29137. 1
  29138. 42348
  29139. 2
  29140. secure
  29141. 1
  29142. 30246
  29143. 1
  29144. 29557
  29145. 1
  29146. 53702
  29147. 4
  29148. 5
  29149. 1
  29150. 42348
  29151. 2
  29152. arm
  29153. 1
  29154. 30246
  29155. 1
  29156. 29557
  29157. 1
  29158. 53702
  29159. 4
  29160. 5
  29161. 1
  29162. 42348
  29163. 2
  29164. say_parse
  29165. 1
  29166. 30246
  29167. 1
  29168. 29557
  29169. 1
  29170. 53702
  29171. 4
  29172. 5
  29173. 1
  29174. 42348
  29175. 2
  29176. announce
  29177. 1
  29178. 30246
  29179. 1
  29180. 29557
  29181. 1
  29182. 53702
  29183. 4
  29184. 5
  29185. 1
  29186. 42348
  29187. 2
  29188. announce
  29189. 1
  29190. 48961
  29191. 1
  29192. 39357
  29193. 1
  29194. 53702
  29195. 4
  29196. 5
  29197. 1
  29198. 53702
  29199. 2
  29200. say
  29201. 1
  29202. 57140
  29203. 1
  29204. 49900
  29205. 1
  29206. 53702
  29207. 4
  29208. 4
  29209. 4
  29210. 5
  29211. 1
  29212. 34107
  29213. 2
  29214. tell_lines
  29215. 1
  29216. 2487
  29217. 1
  29218. 6
  29219. 1
  29220. 34107
  29221. 4
  29222. 5
  29223. 1
  29224. 7944
  29225. 2
  29226. secure
  29227. 1
  29228. 30246
  29229. 1
  29230. 29557
  29231. 1
  29232. 34107
  29233. 4
  29234. 5
  29235. 1
  29236. 7944
  29237. 2
  29238. arm
  29239. 1
  29240. 30246
  29241. 1
  29242. 29557
  29243. 1
  29244. 34107
  29245. 4
  29246. 5
  29247. 1
  29248. 7944
  29249. 2
  29250. press
  29251. 1
  29252. 30246
  29253. 1
  29254. 29557
  29255. 1
  29256. 34107
  29257. 4
  29258. 4
  29259. 4
  29260. 5
  29261. 1
  29262. 50459
  29263. 2
  29264. tell_lines
  29265. 1
  29266. 2487
  29267. 1
  29268. 6
  29269. 1
  29270. 50459
  29271. 4
  29272. 5
  29273. 1
  29274. -1
  29275. 2
  29276.  
  29277. 1
  29278. 50459
  29279. 1
  29280. -1
  29281. 1
  29282. 50459
  29283. 4
  29284. 5
  29285. 1
  29286. 50459
  29287. 2
  29288. eval_cmd_string
  29289. 1
  29290. 50459
  29291. 1
  29292. 217
  29293. 1
  29294. 50459
  29295. 4
  29296. 5
  29297. 1
  29298. 50459
  29299. 2
  29300. eval
  29301. 1
  29302. 50459
  29303. 1
  29304. 217
  29305. 1
  29306. 50459
  29307. 4
  29308. 4
  29309. 4
  29310. 5
  29311. 1
  29312. 49397
  29313. 2
  29314. tell_lines
  29315. 1
  29316. 2487
  29317. 1
  29318. 6
  29319. 1
  29320. 50459
  29321. 4
  29322. 5
  29323. 1
  29324. -1
  29325. 2
  29326.  
  29327. 1
  29328. 50459
  29329. 1
  29330. -1
  29331. 1
  29332. 50459
  29333. 4
  29334. 5
  29335. 1
  29336. 50459
  29337. 2
  29338. eval_cmd_string
  29339. 1
  29340. 50459
  29341. 1
  29342. 217
  29343. 1
  29344. 50459
  29345. 4
  29346. 5
  29347. 1
  29348. 50459
  29349. 2
  29350. eval
  29351. 1
  29352. 50459
  29353. 1
  29354. 217
  29355. 1
  29356. 50459
  29357. 4
  29358. 2
  29359. 4
  29360. 5
  29361. 1
  29362. 30246
  29363. 2
  29364. tell_lines
  29365. 1
  29366. 2487
  29367. 1
  29368. 6
  29369. 1
  29370. 30246
  29371. 4
  29372. 5
  29373. 1
  29374. 30246
  29375. 2
  29376. debug
  29377. 1
  29378. 30246
  29379. 1
  29380. 30246
  29381. 1
  29382. 30246
  29383. 4
  29384. 2
  29385. 4
  29386. 5
  29387. 1
  29388. 54699
  29389. 2
  29390. tell_lines
  29391. 1
  29392. 2487
  29393. 1
  29394. 6
  29395. 1
  29396. 54699
  29397. 4
  29398. 5
  29399. 1
  29400. 54699
  29401. 2
  29402. sgrep
  29403. 1
  29404. 54699
  29405. 1
  29406. 54699
  29407. 1
  29408. 54699
  29409. 4
  29410. 7
  29411. 4
  29412. 5
  29413. 1
  29414. 57421
  29415. 2
  29416. tell_lines
  29417. 1
  29418. 2487
  29419. 1
  29420. 6
  29421. 1
  29422. 57421
  29423. 4
  29424. 5
  29425. 1
  29426. 51426
  29427. 2
  29428. secure
  29429. 1
  29430. 49551
  29431. 1
  29432. 29557
  29433. 1
  29434. 57421
  29435. 4
  29436. 5
  29437. 1
  29438. 51426
  29439. 2
  29440. arm
  29441. 1
  29442. 49551
  29443. 1
  29444. 29557
  29445. 1
  29446. 57421
  29447. 4
  29448. 5
  29449. 1
  29450. 51426
  29451. 2
  29452. say_parse
  29453. 1
  29454. 49551
  29455. 1
  29456. 29557
  29457. 1
  29458. 57421
  29459. 4
  29460. 5
  29461. 1
  29462. 51426
  29463. 2
  29464. announce
  29465. 1
  29466. 49551
  29467. 1
  29468. 29557
  29469. 1
  29470. 57421
  29471. 4
  29472. 5
  29473. 1
  29474. 57421
  29475. 2
  29476. say
  29477. 1
  29478. 57140
  29479. 1
  29480. 49900
  29481. 1
  29482. 57421
  29483. 4
  29484. 5
  29485. 1
  29486. 57421
  29487. 2
  29488. say
  29489. 1
  29490. 19845
  29491. 1
  29492. 5409
  29493. 1
  29494. 57421
  29495. 4
  29496. 2
  29497. 4
  29498. 5
  29499. 1
  29500. 56815
  29501. 2
  29502. tell_lines
  29503. 1
  29504. 2487
  29505. 1
  29506. 6
  29507. 1
  29508. 56815
  29509. 4
  29510. 5
  29511. 1
  29512. 56516
  29513. 2
  29514. secure
  29515. 1
  29516. 49551
  29517. 1
  29518. 29557
  29519. 1
  29520. 56815
  29521. 4
  29522. 6
  29523. 4
  29524. 5
  29525. 1
  29526. 55164
  29527. 2
  29528. tell_lines
  29529. 1
  29530. 2487
  29531. 1
  29532. 6
  29533. 1
  29534. 55164
  29535. 4
  29536. 5
  29537. 1
  29538. 54023
  29539. 2
  29540. secure
  29541. 1
  29542. 49551
  29543. 1
  29544. 29557
  29545. 1
  29546. 55164
  29547. 4
  29548. 5
  29549. 1
  29550. 54023
  29551. 2
  29552. arm
  29553. 1
  29554. 49551
  29555. 1
  29556. 29557
  29557. 1
  29558. 55164
  29559. 4
  29560. 5
  29561. 1
  29562. 54023
  29563. 2
  29564. say_parse
  29565. 1
  29566. 49551
  29567. 1
  29568. 29557
  29569. 1
  29570. 55164
  29571. 4
  29572. 5
  29573. 1
  29574. 54023
  29575. 2
  29576. announce
  29577. 1
  29578. 49551
  29579. 1
  29580. 29557
  29581. 1
  29582. 55164
  29583. 4
  29584. 5
  29585. 1
  29586. 55164
  29587. 2
  29588. say
  29589. 1
  29590. 57140
  29591. 1
  29592. 49900
  29593. 1
  29594. 55164
  29595. 4
  29596. 4
  29597. 4
  29598. 5
  29599. 1
  29600. 53502
  29601. 2
  29602. tell_lines
  29603. 1
  29604. 2487
  29605. 1
  29606. 6
  29607. 1
  29608. 53502
  29609. 4
  29610. 5
  29611. 1
  29612. 53245
  29613. 2
  29614. secure
  29615. 1
  29616. 49551
  29617. 1
  29618. 29557
  29619. 1
  29620. 53502
  29621. 4
  29622. 5
  29623. 1
  29624. 53245
  29625. 2
  29626. arm
  29627. 1
  29628. 49551
  29629. 1
  29630. 29557
  29631. 1
  29632. 53502
  29633. 4
  29634. 5
  29635. 1
  29636. 53245
  29637. 2
  29638. press
  29639. 1
  29640. 49551
  29641. 1
  29642. 29557
  29643. 1
  29644. 53502
  29645. 4
  29646. 4
  29647. 4
  29648. 5
  29649. 1
  29650. 53464
  29651. 2
  29652. tell_lines
  29653. 1
  29654. 2487
  29655. 1
  29656. 6
  29657. 1
  29658. 53464
  29659. 4
  29660. 5
  29661. 1
  29662. 30362
  29663. 2
  29664. secure
  29665. 1
  29666. 49551
  29667. 1
  29668. 29557
  29669. 1
  29670. 53464
  29671. 4
  29672. 5
  29673. 1
  29674. 30362
  29675. 2
  29676. arm
  29677. 1
  29678. 49551
  29679. 1
  29680. 29557
  29681. 1
  29682. 53464
  29683. 4
  29684. 5
  29685. 1
  29686. 30362
  29687. 2
  29688. press
  29689. 1
  29690. 49551
  29691. 1
  29692. 29557
  29693. 1
  29694. 53464
  29695. 4
  29696. 7
  29697. 4
  29698. 5
  29699. 1
  29700. 50064
  29701. 2
  29702. tell_lines
  29703. 1
  29704. 2487
  29705. 1
  29706. 6
  29707. 1
  29708. 50064
  29709. 4
  29710. 5
  29711. 1
  29712. 22709
  29713. 2
  29714. secure
  29715. 1
  29716. 49551
  29717. 1
  29718. 29557
  29719. 1
  29720. 50064
  29721. 4
  29722. 5
  29723. 1
  29724. 22709
  29725. 2
  29726. arm
  29727. 1
  29728. 49551
  29729. 1
  29730. 29557
  29731. 1
  29732. 50064
  29733. 4
  29734. 5
  29735. 1
  29736. 22709
  29737. 2
  29738. say_parse
  29739. 1
  29740. 49551
  29741. 1
  29742. 29557
  29743. 1
  29744. 50064
  29745. 4
  29746. 5
  29747. 1
  29748. 22709
  29749. 2
  29750. announce
  29751. 1
  29752. 49551
  29753. 1
  29754. 29557
  29755. 1
  29756. 50064
  29757. 4
  29758. 5
  29759. 1
  29760. 22709
  29761. 2
  29762. announce
  29763. 1
  29764. 48961
  29765. 1
  29766. 39357
  29767. 1
  29768. 50064
  29769. 4
  29770. 5
  29771. 1
  29772. 50064
  29773. 2
  29774. say
  29775. 1
  29776. 57140
  29777. 1
  29778. 49900
  29779. 1
  29780. 50064
  29781. 4
  29782. 7
  29783. 4
  29784. 5
  29785. 1
  29786. 34107
  29787. 2
  29788. tell_lines
  29789. 1
  29790. 2487
  29791. 1
  29792. 6
  29793. 1
  29794. 34107
  29795. 4
  29796. 5
  29797. 1
  29798. 7944
  29799. 2
  29800. secure
  29801. 1
  29802. 49551
  29803. 1
  29804. 29557
  29805. 1
  29806. 34107
  29807. 4
  29808. 5
  29809. 1
  29810. 7944
  29811. 2
  29812. arm
  29813. 1
  29814. 49551
  29815. 1
  29816. 29557
  29817. 1
  29818. 34107
  29819. 4
  29820. 5
  29821. 1
  29822. 7944
  29823. 2
  29824. say_parse
  29825. 1
  29826. 49551
  29827. 1
  29828. 29557
  29829. 1
  29830. 34107
  29831. 4
  29832. 5
  29833. 1
  29834. 7944
  29835. 2
  29836. announce
  29837. 1
  29838. 49551
  29839. 1
  29840. 29557
  29841. 1
  29842. 34107
  29843. 4
  29844. 5
  29845. 1
  29846. 7944
  29847. 2
  29848. say
  29849. 1
  29850. 2
  29851. 1
  29852. 3
  29853. 1
  29854. 34107
  29855. 4
  29856. 5
  29857. 1
  29858. 34107
  29859. 2
  29860. say
  29861. 1
  29862. 31783
  29863. 1
  29864. 4803
  29865. 1
  29866. 34107
  29867. 4
  29868. 3
  29869. 4
  29870. 5
  29871. 1
  29872. 30246
  29873. 2
  29874. tell_lines
  29875. 1
  29876. 2487
  29877. 1
  29878. 6
  29879. 1
  29880. 30246
  29881. 4
  29882. 5
  29883. 1
  29884. 53622
  29885. 2
  29886. look_self
  29887. 1
  29888. 15
  29889. 1
  29890. 6792
  29891. 1
  29892. 30246
  29893. 4
  29894. 5
  29895. 1
  29896. 53622
  29897. 2
  29898. look
  29899. 1
  29900. 2693
  29901. 1
  29902. 258
  29903. 1
  29904. 30246
  29905. 4
  29906. 4
  29907. 4
  29908. 5
  29909. 1
  29910. 50290
  29911. 2
  29912. tell_lines
  29913. 1
  29914. 2487
  29915. 1
  29916. 6
  29917. 1
  29918. 50290
  29919. 4
  29920. 5
  29921. 1
  29922. 53622
  29923. 2
  29924. look_self
  29925. 1
  29926. 15
  29927. 1
  29928. 6792
  29929. 1
  29930. 50290
  29931. 4
  29932. 5
  29933. 1
  29934. 27391
  29935. 2
  29936. l
  29937. 1
  29938. 2
  29939. 1
  29940. 3
  29941. 1
  29942. 50290
  29943. 4
  29944. 5
  29945. 1
  29946. 27391
  29947. 2
  29948. l
  29949. 1
  29950. 4290
  29951. 1
  29952. 6145
  29953. 1
  29954. 50290
  29955. 4
  29956. 4
  29957. 4
  29958. 5
  29959. 1
  29960. 54377
  29961. 2
  29962. tell_lines
  29963. 1
  29964. 2487
  29965. 1
  29966. 6
  29967. 1
  29968. 54377
  29969. 4
  29970. 5
  29971. 1
  29972. 53646
  29973. 2
  29974. secure
  29975. 1
  29976. 49551
  29977. 1
  29978. 29557
  29979. 1
  29980. 54377
  29981. 4
  29982. 5
  29983. 1
  29984. 53646
  29985. 2
  29986. arm
  29987. 1
  29988. 49551
  29989. 1
  29990. 29557
  29991. 1
  29992. 54377
  29993. 4
  29994. 5
  29995. 1
  29996. 53646
  29997. 2
  29998. press
  29999. 1
  30000. 49551
  30001. 1
  30002. 29557
  30003. 1
  30004. 54377
  30005. 4
  30006. 4
  30007. 4
  30008. 5
  30009. 1
  30010. 30246
  30011. 2
  30012. tell_lines
  30013. 1
  30014. 2487
  30015. 1
  30016. 6
  30017. 1
  30018. 30246
  30019. 4
  30020. 5
  30021. 1
  30022. 53756
  30023. 2
  30024. event_enterfunc
  30025. 1
  30026. 30246
  30027. 1
  30028. 53756
  30029. 1
  30030. 30246
  30031. 4
  30032. 5
  30033. 1
  30034. 54318
  30035. 2
  30036. invoke
  30037. 1
  30038. 30246
  30039. 1
  30040. 54318
  30041. 1
  30042. 30246
  30043. 4
  30044. 5
  30045. 1
  30046. 53622
  30047. 2
  30048. d
  30049. 1
  30050. 7003
  30051. 1
  30052. 16020
  30053. 1
  30054. 30246
  30055. 4
  30056. 8
  30057. 4
  30058. 5
  30059. 1
  30060. 46102
  30061. 2
  30062. tell_lines
  30063. 1
  30064. 2487
  30065. 1
  30066. 6
  30067. 1
  30068. 46102
  30069. 4
  30070. 5
  30071. 1
  30072. 26811
  30073. 2
  30074. look_self
  30075. 1
  30076. 46102
  30077. 1
  30078. 26811
  30079. 1
  30080. 46102
  30081. 4
  30082. 5
  30083. 1
  30084. 26811
  30085. 2
  30086. cell_enterfunc
  30087. 1
  30088. 19845
  30089. 1
  30090. 53993
  30091. 1
  30092. 46102
  30093. 4
  30094. 5
  30095. 1
  30096. 26811
  30097. 2
  30098. cell_enterfunc
  30099. 1
  30100. 19845
  30101. 1
  30102. 35120
  30103. 1
  30104. 46102
  30105. 4
  30106. 5
  30107. 1
  30108. 26811
  30109. 2
  30110. cell_enterfunc
  30111. 1
  30112. 19845
  30113. 1
  30114. 7970
  30115. 1
  30116. 46102
  30117. 4
  30118. 5
  30119. 1
  30120. 26811
  30121. 2
  30122. place_object
  30123. 1
  30124. 19845
  30125. 1
  30126. 53993
  30127. 1
  30128. 46102
  30129. 4
  30130. 5
  30131. 1
  30132. 26811
  30133. 2
  30134. n
  30135. 1
  30136. 19845
  30137. 1
  30138. 53993
  30139. 1
  30140. 46102
  30141. 4
  30142. 5
  30143. 1
  30144. 26811
  30145. 2
  30146. n
  30147. 1
  30148. 19845
  30149. 1
  30150. 5804
  30151. 1
  30152. 46102
  30153. 4
  30154. 16
  30155. 4
  30156. 5
  30157. 1
  30158. 46102
  30159. 2
  30160. tell_lines
  30161. 1
  30162. 2487
  30163. 1
  30164. 6
  30165. 1
  30166. 46102
  30167. 4
  30168. 5
  30169. 1
  30170. 26811
  30171. 2
  30172. look_self
  30173. 1
  30174. 46102
  30175. 1
  30176. 26811
  30177. 1
  30178. 46102
  30179. 4
  30180. 5
  30181. 1
  30182. 26811
  30183. 2
  30184. cell_enterfunc
  30185. 1
  30186. 19845
  30187. 1
  30188. 53993
  30189. 1
  30190. 46102
  30191. 4
  30192. 5
  30193. 1
  30194. 26811
  30195. 2
  30196. cell_enterfunc
  30197. 1
  30198. 19845
  30199. 1
  30200. 35120
  30201. 1
  30202. 46102
  30203. 4
  30204. 5
  30205. 1
  30206. 26811
  30207. 2
  30208. cell_enterfunc
  30209. 1
  30210. 19845
  30211. 1
  30212. 7970
  30213. 1
  30214. 46102
  30215. 4
  30216. 5
  30217. 1
  30218. 26811
  30219. 2
  30220. place_object
  30221. 1
  30222. 19845
  30223. 1
  30224. 53993
  30225. 1
  30226. 46102
  30227. 4
  30228. 5
  30229. 1
  30230. 26811
  30231. 2
  30232. enterfunc
  30233. 1
  30234. 19845
  30235. 1
  30236. 53993
  30237. 1
  30238. 46102
  30239. 4
  30240. 5
  30241. 1
  30242. 26811
  30243. 2
  30244. enterfunc
  30245. 1
  30246. 19845
  30247. 1
  30248. 7970
  30249. 1
  30250. 46102
  30251. 4
  30252. 5
  30253. 1
  30254. 46102
  30255. 2
  30256. moveto
  30257. 1
  30258. 46102
  30259. 1
  30260. 1
  30261. 1
  30262. 46102
  30263. 4
  30264. 5
  30265. 1
  30266. 46102
  30267. 2
  30268. moveto
  30269. 1
  30270. 47
  30271. 1
  30272. 6
  30273. 1
  30274. 46102
  30275. 4
  30276. 5
  30277. 1
  30278. 46102
  30279. 2
  30280. moveto
  30281. 1
  30282. 47
  30283. 1
  30284. 3133
  30285. 1
  30286. 46102
  30287. 4
  30288. 5
  30289. 1
  30290. 46102
  30291. 2
  30292. moveto
  30293. 1
  30294. 78
  30295. 1
  30296. 7069
  30297. 1
  30298. 46102
  30299. 4
  30300. 5
  30301. 1
  30302. 46102
  30303. 2
  30304. moveto
  30305. 1
  30306. 3685
  30307. 1
  30308. 8855
  30309. 1
  30310. 46102
  30311. 4
  30312. 5
  30313. 1
  30314. 46102
  30315. 2
  30316. teleport
  30317. 1
  30318. 47
  30319. 1
  30320. 3133
  30321. 1
  30322. 46102
  30323. 4
  30324. 5
  30325. 1
  30326. 46102
  30327. 2
  30328. teleport
  30329. 1
  30330. 3920
  30331. 1
  30332. 33337
  30333. 1
  30334. 46102
  30335. 4
  30336. 5
  30337. 1
  30338. 46102
  30339. 2
  30340. @go
  30341. 1
  30342. 47
  30343. 1
  30344. 3133
  30345. 1
  30346. 46102
  30347. 4
  30348. 7
  30349. 4
  30350. 5
  30351. 1
  30352. 56872
  30353. 2
  30354. tell_lines
  30355. 1
  30356. 2487
  30357. 1
  30358. 6
  30359. 1
  30360. 56872
  30361. 4
  30362. 5
  30363. 1
  30364. 39439
  30365. 2
  30366. secure
  30367. 1
  30368. 49551
  30369. 1
  30370. 29557
  30371. 1
  30372. 56872
  30373. 4
  30374. 5
  30375. 1
  30376. 39439
  30377. 2
  30378. arm
  30379. 1
  30380. 49551
  30381. 1
  30382. 29557
  30383. 1
  30384. 56872
  30385. 4
  30386. 5
  30387. 1
  30388. 39439
  30389. 2
  30390. say_parse
  30391. 1
  30392. 49551
  30393. 1
  30394. 29557
  30395. 1
  30396. 56872
  30397. 4
  30398. 5
  30399. 1
  30400. 39439
  30401. 2
  30402. announce
  30403. 1
  30404. 49551
  30405. 1
  30406. 29557
  30407. 1
  30408. 56872
  30409. 4
  30410. 5
  30411. 1
  30412. 39439
  30413. 2
  30414. say
  30415. 1
  30416. 2
  30417. 1
  30418. 3
  30419. 1
  30420. 56872
  30421. 4
  30422. 5
  30423. 1
  30424. 56872
  30425. 2
  30426. say
  30427. 1
  30428. 31783
  30429. 1
  30430. 4803
  30431. 1
  30432. 56872
  30433. 4
  30434. 2
  30435. 4
  30436. 5
  30437. 1
  30438. 53456
  30439. 2
  30440. tell_lines
  30441. 1
  30442. 2487
  30443. 1
  30444. 6
  30445. 1
  30446. 53456
  30447. 4
  30448. 5
  30449. 1
  30450. 35807
  30451. 2
  30452. secure
  30453. 1
  30454. 30246
  30455. 1
  30456. 16017
  30457. 1
  30458. 53456
  30459. 4
  30460. 4
  30461. 4
  30462. 5
  30463. 1
  30464. 2487
  30465. 2
  30466. tell_lines
  30467. 1
  30468. 2487
  30469. 1
  30470. 6
  30471. 1
  30472. 2487
  30473. 4
  30474. 5
  30475. 1
  30476. -1
  30477. 2
  30478.  
  30479. 1
  30480. 2487
  30481. 1
  30482. -1
  30483. 1
  30484. 2487
  30485. 4
  30486. 5
  30487. 1
  30488. 2487
  30489. 2
  30490. eval_cmd_string
  30491. 1
  30492. 2487
  30493. 1
  30494. 217
  30495. 1
  30496. 2487
  30497. 4
  30498. 5
  30499. 1
  30500. 2487
  30501. 2
  30502. eval
  30503. 1
  30504. 2487
  30505. 1
  30506. 217
  30507. 1
  30508. 2487
  30509. 4
  30510. 4
  30511. 4
  30512. 5
  30513. 1
  30514. 50432
  30515. 2
  30516. tell_lines
  30517. 1
  30518. 2487
  30519. 1
  30520. 6
  30521. 1
  30522. 50432
  30523. 4
  30524. 5
  30525. 1
  30526. 39785
  30527. 2
  30528. secure
  30529. 1
  30530. 49551
  30531. 1
  30532. 29557
  30533. 1
  30534. 50432
  30535. 4
  30536. 5
  30537. 1
  30538. 39785
  30539. 2
  30540. arm
  30541. 1
  30542. 49551
  30543. 1
  30544. 29557
  30545. 1
  30546. 50432
  30547. 4
  30548. 5
  30549. 1
  30550. 39785
  30551. 2
  30552. press
  30553. 1
  30554. 49551
  30555. 1
  30556. 29557
  30557. 1
  30558. 50432
  30559. 4
  30560. 2
  30561. 4
  30562. 5
  30563. 1
  30564. 55689
  30565. 2
  30566. tell_lines
  30567. 1
  30568. 2487
  30569. 1
  30570. 6
  30571. 1
  30572. 55689
  30573. 4
  30574. 5
  30575. 1
  30576. 39285
  30577. 2
  30578. secure
  30579. 1
  30580. 49551
  30581. 1
  30582. 29557
  30583. 1
  30584. 55689
  30585. 4
  30586. 6
  30587. 4
  30588. 5
  30589. 1
  30590. 56289
  30591. 2
  30592. tell_lines
  30593. 1
  30594. 2487
  30595. 1
  30596. 6
  30597. 1
  30598. 56289
  30599. 4
  30600. 5
  30601. 1
  30602. 44585
  30603. 2
  30604. secure
  30605. 1
  30606. 49551
  30607. 1
  30608. 29557
  30609. 1
  30610. 56289
  30611. 4
  30612. 5
  30613. 1
  30614. 44585
  30615. 2
  30616. arm
  30617. 1
  30618. 49551
  30619. 1
  30620. 29557
  30621. 1
  30622. 56289
  30623. 4
  30624. 5
  30625. 1
  30626. 44585
  30627. 2
  30628. say_parse
  30629. 1
  30630. 49551
  30631. 1
  30632. 29557
  30633. 1
  30634. 56289
  30635. 4
  30636. 5
  30637. 1
  30638. 44585
  30639. 2
  30640. announce
  30641. 1
  30642. 49551
  30643. 1
  30644. 29557
  30645. 1
  30646. 56289
  30647. 4
  30648. 5
  30649. 1
  30650. 56289
  30651. 2
  30652. say
  30653. 1
  30654. 57140
  30655. 1
  30656. 49900
  30657. 1
  30658. 56289
  30659. 4
  30660. 3
  30661. 4
  30662. 5
  30663. 1
  30664. 50636
  30665. 2
  30666. tell_lines
  30667. 1
  30668. 2487
  30669. 1
  30670. 6
  30671. 1
  30672. 50636
  30673. 4
  30674. 5
  30675. 1
  30676. 50636
  30677. 2
  30678. look_self
  30679. 1
  30680. 15
  30681. 1
  30682. 7069
  30683. 1
  30684. 50636
  30685. 4
  30686. 5
  30687. 1
  30688. 22929
  30689. 2
  30690. look
  30691. 1
  30692. 2693
  30693. 1
  30694. 258
  30695. 1
  30696. 50636
  30697. 4
  30698. 4
  30699. 4
  30700. 5
  30701. 1
  30702. 50636
  30703. 2
  30704. tell_lines
  30705. 1
  30706. 2487
  30707. 1
  30708. 6
  30709. 1
  30710. 50636
  30711. 4
  30712. 5
  30713. 1
  30714. 50636
  30715. 2
  30716. look_self
  30717. 1
  30718. 15
  30719. 1
  30720. 7069
  30721. 1
  30722. 50636
  30723. 4
  30724. 5
  30725. 1
  30726. 52044
  30727. 2
  30728. look
  30729. 1
  30730. 2
  30731. 1
  30732. 3
  30733. 1
  30734. 50636
  30735. 4
  30736. 5
  30737. 1
  30738. 52044
  30739. 2
  30740. look
  30741. 1
  30742. 4290
  30743. 1
  30744. 6145
  30745. 1
  30746. 50636
  30747. 4
  30748. 4
  30749. 4
  30750. 5
  30751. 1
  30752. 50636
  30753. 2
  30754. tell_lines
  30755. 1
  30756. 2487
  30757. 1
  30758. 6
  30759. 1
  30760. 50636
  30761. 4
  30762. 5
  30763. 1
  30764. 50636
  30765. 2
  30766. look_self
  30767. 1
  30768. 15
  30769. 1
  30770. 7069
  30771. 1
  30772. 50636
  30773. 4
  30774. 5
  30775. 1
  30776. 52044
  30777. 2
  30778. look
  30779. 1
  30780. 2
  30781. 1
  30782. 3
  30783. 1
  30784. 50636
  30785. 4
  30786. 5
  30787. 1
  30788. 52044
  30789. 2
  30790. look
  30791. 1
  30792. 4290
  30793. 1
  30794. 6145
  30795. 1
  30796. 50636
  30797. 4
  30798. 8
  30799. 4
  30800. 5
  30801. 1
  30802. 50051
  30803. 2
  30804. tell_lines
  30805. 1
  30806. 2487
  30807. 1
  30808. 6
  30809. 1
  30810. 50051
  30811. 4
  30812. 5
  30813. 1
  30814. 18807
  30815. 2
  30816. @peruse
  30817. 1
  30818. 31783
  30819. 1
  30820. 18807
  30821. 1
  30822. 50051
  30823. 4
  30824. 5
  30825. 1
  30826. 50051
  30827. 2
  30828. my_huh
  30829. 1
  30830. 50051
  30831. 1
  30832. 6
  30833. 1
  30834. 50051
  30835. 4
  30836. 5
  30837. 1
  30838. 50051
  30839. 2
  30840. my_huh
  30841. 1
  30842. 78
  30843. 1
  30844. 7069
  30845. 1
  30846. 50051
  30847. 4
  30848. 5
  30849. 1
  30850. 50051
  30851. 2
  30852. my_huh
  30853. 1
  30854. 24442
  30855. 1
  30856. 26026
  30857. 1
  30858. 50051
  30859. 4
  30860. 5
  30861. 1
  30862. 50051
  30863. 2
  30864. my_huh
  30865. 1
  30866. 57140
  30867. 1
  30868. 49900
  30869. 1
  30870. 50051
  30871. 4
  30872. 5
  30873. 1
  30874. 219
  30875. 2
  30876. do_huh
  30877. 1
  30878. 50051
  30879. 1
  30880. 219
  30881. 1
  30882. 50051
  30883. 4
  30884. 5
  30885. 1
  30886. 20242
  30887. 2
  30888. @peruse
  30889. 1
  30890. 50051
  30891. 1
  30892. 1
  30893. 1
  30894. 50051
  30895. 4
  30896. 4
  30897. 4
  30898. 5
  30899. 1
  30900. 53562
  30901. 2
  30902. tell_lines
  30903. 1
  30904. 2487
  30905. 1
  30906. 6
  30907. 1
  30908. 53562
  30909. 4
  30910. 5
  30911. 1
  30912. 50636
  30913. 2
  30914. look_self
  30915. 1
  30916. 15
  30917. 1
  30918. 7069
  30919. 1
  30920. 53562
  30921. 4
  30922. 5
  30923. 1
  30924. 29038
  30925. 2
  30926. special_look
  30927. 1
  30928. 31783
  30929. 1
  30930. 9805
  30931. 1
  30932. 53562
  30933. 4
  30934. 5
  30935. 1
  30936. 29038
  30937. 2
  30938. look
  30939. 1
  30940. 31783
  30941. 1
  30942. 9805
  30943. 1
  30944. 53562
  30945. 4
  30946. 4
  30947. 4
  30948. 5
  30949. 1
  30950. 50636
  30951. 2
  30952. tell_lines
  30953. 1
  30954. 2487
  30955. 1
  30956. 6
  30957. 1
  30958. 50636
  30959. 4
  30960. 5
  30961. 1
  30962. 50636
  30963. 2
  30964. look_self
  30965. 1
  30966. 15
  30967. 1
  30968. 7069
  30969. 1
  30970. 50636
  30971. 4
  30972. 5
  30973. 1
  30974. 29038
  30975. 2
  30976. special_look
  30977. 1
  30978. 31783
  30979. 1
  30980. 9805
  30981. 1
  30982. 50636
  30983. 4
  30984. 5
  30985. 1
  30986. 29038
  30987. 2
  30988. look
  30989. 1
  30990. 31783
  30991. 1
  30992. 9805
  30993. 1
  30994. 50636
  30995. 4
  30996. 4
  30997. 4
  30998. 5
  30999. 1
  31000. 50636
  31001. 2
  31002. tell_lines
  31003. 1
  31004. 2487
  31005. 1
  31006. 6
  31007. 1
  31008. 50636
  31009. 4
  31010. 5
  31011. 1
  31012. 50636
  31013. 2
  31014. look_self
  31015. 1
  31016. 15
  31017. 1
  31018. 7069
  31019. 1
  31020. 50636
  31021. 4
  31022. 5
  31023. 1
  31024. 52044
  31025. 2
  31026. look
  31027. 1
  31028. 2
  31029. 1
  31030. 3
  31031. 1
  31032. 50636
  31033. 4
  31034. 5
  31035. 1
  31036. 52044
  31037. 2
  31038. look
  31039. 1
  31040. 4290
  31041. 1
  31042. 6145
  31043. 1
  31044. 50636
  31045. 4
  31046. 4
  31047. 4
  31048. 5
  31049. 1
  31050. 50636
  31051. 2
  31052. tell_lines
  31053. 1
  31054. 2487
  31055. 1
  31056. 6
  31057. 1
  31058. 50636
  31059. 4
  31060. 5
  31061. 1
  31062. 50636
  31063. 2
  31064. look_self
  31065. 1
  31066. 15
  31067. 1
  31068. 7069
  31069. 1
  31070. 50636
  31071. 4
  31072. 5
  31073. 1
  31074. 29038
  31075. 2
  31076. special_look
  31077. 1
  31078. 31783
  31079. 1
  31080. 9805
  31081. 1
  31082. 50636
  31083. 4
  31084. 5
  31085. 1
  31086. 29038
  31087. 2
  31088. look
  31089. 1
  31090. 31783
  31091. 1
  31092. 9805
  31093. 1
  31094. 50636
  31095. 4
  31096. 4
  31097. 4
  31098. 5
  31099. 1
  31100. 50636
  31101. 2
  31102. tell_lines
  31103. 1
  31104. 2487
  31105. 1
  31106. 6
  31107. 1
  31108. 50636
  31109. 4
  31110. 5
  31111. 1
  31112. 50636
  31113. 2
  31114. look_self
  31115. 1
  31116. 15
  31117. 1
  31118. 7069
  31119. 1
  31120. 50636
  31121. 4
  31122. 5
  31123. 1
  31124. 29038
  31125. 2
  31126. special_look
  31127. 1
  31128. 31783
  31129. 1
  31130. 9805
  31131. 1
  31132. 50636
  31133. 4
  31134. 5
  31135. 1
  31136. 29038
  31137. 2
  31138. look
  31139. 1
  31140. 31783
  31141. 1
  31142. 9805
  31143. 1
  31144. 50636
  31145. 4
  31146. 4
  31147. 4
  31148. 5
  31149. 1
  31150. 50636
  31151. 2
  31152. tell_lines
  31153. 1
  31154. 2487
  31155. 1
  31156. 6
  31157. 1
  31158. 50636
  31159. 4
  31160. 5
  31161. 1
  31162. 50636
  31163. 2
  31164. look_self
  31165. 1
  31166. 15
  31167. 1
  31168. 7069
  31169. 1
  31170. 50636
  31171. 4
  31172. 5
  31173. 1
  31174. 52044
  31175. 2
  31176. look
  31177. 1
  31178. 2
  31179. 1
  31180. 3
  31181. 1
  31182. 50636
  31183. 4
  31184. 5
  31185. 1
  31186. 52044
  31187. 2
  31188. look
  31189. 1
  31190. 4290
  31191. 1
  31192. 6145
  31193. 1
  31194. 50636
  31195. 4
  31196. 7
  31197. 4
  31198. 5
  31199. 1
  31200. 54837
  31201. 2
  31202. tell_lines
  31203. 1
  31204. 2487
  31205. 1
  31206. 6
  31207. 1
  31208. 54837
  31209. 4
  31210. 5
  31211. 1
  31212. 38607
  31213. 2
  31214. secure
  31215. 1
  31216. 49551
  31217. 1
  31218. 29557
  31219. 1
  31220. 54837
  31221. 4
  31222. 5
  31223. 1
  31224. 38607
  31225. 2
  31226. arm
  31227. 1
  31228. 49551
  31229. 1
  31230. 29557
  31231. 1
  31232. 54837
  31233. 4
  31234. 5
  31235. 1
  31236. 38607
  31237. 2
  31238. say_parse
  31239. 1
  31240. 49551
  31241. 1
  31242. 29557
  31243. 1
  31244. 54837
  31245. 4
  31246. 5
  31247. 1
  31248. 38607
  31249. 2
  31250. announce
  31251. 1
  31252. 49551
  31253. 1
  31254. 29557
  31255. 1
  31256. 54837
  31257. 4
  31258. 5
  31259. 1
  31260. 38607
  31261. 2
  31262. say
  31263. 1
  31264. 2
  31265. 1
  31266. 3
  31267. 1
  31268. 54837
  31269. 4
  31270. 5
  31271. 1
  31272. 54837
  31273. 2
  31274. say
  31275. 1
  31276. 31783
  31277. 1
  31278. 4803
  31279. 1
  31280. 54837
  31281. 4
  31282. 4
  31283. 4
  31284. 5
  31285. 1
  31286. 56819
  31287. 2
  31288. tell_lines
  31289. 1
  31290. 2487
  31291. 1
  31292. 6
  31293. 1
  31294. 56819
  31295. 4
  31296. 5
  31297. 1
  31298. 48003
  31299. 2
  31300. secure
  31301. 1
  31302. 49551
  31303. 1
  31304. 29557
  31305. 1
  31306. 56819
  31307. 4
  31308. 5
  31309. 1
  31310. 48003
  31311. 2
  31312. arm
  31313. 1
  31314. 49551
  31315. 1
  31316. 29557
  31317. 1
  31318. 56819
  31319. 4
  31320. 5
  31321. 1
  31322. 48003
  31323. 2
  31324. press
  31325. 1
  31326. 49551
  31327. 1
  31328. 29557
  31329. 1
  31330. 56819
  31331. 4
  31332. 2
  31333. 4
  31334. 5
  31335. 1
  31336. 50636
  31337. 2
  31338. tell_lines
  31339. 1
  31340. 2487
  31341. 1
  31342. 6
  31343. 1
  31344. 50636
  31345. 4
  31346. 5
  31347. 1
  31348. 50636
  31349. 2
  31350. @refusals
  31351. 1
  31352. 50636
  31353. 1
  31354. 50636
  31355. 1
  31356. 50636
  31357. 4
  31358. 2
  31359. 4
  31360. 5
  31361. 1
  31362. 50636
  31363. 2
  31364. tell_lines
  31365. 1
  31366. 2487
  31367. 1
  31368. 6
  31369. 1
  31370. 50636
  31371. 4
  31372. 5
  31373. 1
  31374. 50636
  31375. 2
  31376. @refusals
  31377. 1
  31378. 50636
  31379. 1
  31380. 50636
  31381. 1
  31382. 50636
  31383. 4
  31384. 2
  31385. 4
  31386. 5
  31387. 1
  31388. 50636
  31389. 2
  31390. tell_lines
  31391. 1
  31392. 2487
  31393. 1
  31394. 6
  31395. 1
  31396. 50636
  31397. 4
  31398. 5
  31399. 1
  31400. 50636
  31401. 2
  31402. @refusals
  31403. 1
  31404. 50636
  31405. 1
  31406. 50636
  31407. 1
  31408. 50636
  31409. 4
  31410. 2
  31411. 4
  31412. 5
  31413. 1
  31414. 50636
  31415. 2
  31416. tell_lines
  31417. 1
  31418. 2487
  31419. 1
  31420. 6
  31421. 1
  31422. 50636
  31423. 4
  31424. 5
  31425. 1
  31426. 50636
  31427. 2
  31428. @refusals
  31429. 1
  31430. 50636
  31431. 1
  31432. 50636
  31433. 1
  31434. 50636
  31435. 4
  31436. 2
  31437. 4
  31438. 5
  31439. 1
  31440. 50636
  31441. 2
  31442. tell_lines
  31443. 1
  31444. 2487
  31445. 1
  31446. 6
  31447. 1
  31448. 50636
  31449. 4
  31450. 5
  31451. 1
  31452. 50636
  31453. 2
  31454. @refusals
  31455. 1
  31456. 50636
  31457. 1
  31458. 50636
  31459. 1
  31460. 50636
  31461. 4
  31462. 8
  31463. 4
  31464. 5
  31465. 1
  31466. 49551
  31467. 2
  31468. tell_lines
  31469. 1
  31470. 2487
  31471. 1
  31472. 6
  31473. 1
  31474. 49551
  31475. 4
  31476. 5
  31477. 1
  31478. 29557
  31479. 2
  31480. _darkness
  31481. 1
  31482. 49551
  31483. 1
  31484. 29557
  31485. 1
  31486. 49551
  31487. 4
  31488. 5
  31489. 1
  31490. 19233
  31491. 2
  31492. int_desc
  31493. 1
  31494. 49551
  31495. 1
  31496. 29557
  31497. 1
  31498. 49551
  31499. 4
  31500. 5
  31501. 1
  31502. 19233
  31503. 2
  31504. description
  31505. 1
  31506. 49551
  31507. 1
  31508. 29557
  31509. 1
  31510. 49551
  31511. 4
  31512. 5
  31513. 1
  31514. 19233
  31515. 2
  31516. sitting_description
  31517. 1
  31518. 31783
  31519. 1
  31520. 9805
  31521. 1
  31522. 49551
  31523. 4
  31524. 5
  31525. 1
  31526. 19233
  31527. 2
  31528. look_self
  31529. 1
  31530. 31783
  31531. 1
  31532. 9805
  31533. 1
  31534. 49551
  31535. 4
  31536. 5
  31537. 1
  31538. 19233
  31539. 2
  31540. look
  31541. 1
  31542. 31783
  31543. 1
  31544. 9805
  31545. 1
  31546. 49551
  31547. 4
  31548. 5
  31549. 1
  31550. 19233
  31551. 2
  31552. look
  31553. 1
  31554. 49551
  31555. 1
  31556. 29557
  31557. 1
  31558. 49551
  31559. 4
  31560. 7
  31561. 4
  31562. 5
  31563. 1
  31564. 56872
  31565. 2
  31566. tell_lines
  31567. 1
  31568. 2487
  31569. 1
  31570. 6
  31571. 1
  31572. 56872
  31573. 4
  31574. 5
  31575. 1
  31576. 39439
  31577. 2
  31578. secure
  31579. 1
  31580. 49551
  31581. 1
  31582. 29557
  31583. 1
  31584. 56872
  31585. 4
  31586. 5
  31587. 1
  31588. 39439
  31589. 2
  31590. arm
  31591. 1
  31592. 49551
  31593. 1
  31594. 29557
  31595. 1
  31596. 56872
  31597. 4
  31598. 5
  31599. 1
  31600. 39439
  31601. 2
  31602. say_parse
  31603. 1
  31604. 49551
  31605. 1
  31606. 29557
  31607. 1
  31608. 56872
  31609. 4
  31610. 5
  31611. 1
  31612. 39439
  31613. 2
  31614. announce
  31615. 1
  31616. 49551
  31617. 1
  31618. 29557
  31619. 1
  31620. 56872
  31621. 4
  31622. 5
  31623. 1
  31624. 39439
  31625. 2
  31626. say
  31627. 1
  31628. 2
  31629. 1
  31630. 3
  31631. 1
  31632. 56872
  31633. 4
  31634. 5
  31635. 1
  31636. 56872
  31637. 2
  31638. say
  31639. 1
  31640. 31783
  31641. 1
  31642. 4803
  31643. 1
  31644. 56872
  31645. 4
  31646. 7
  31647. 4
  31648. 5
  31649. 1
  31650. 53592
  31651. 2
  31652. tell_lines
  31653. 1
  31654. 2487
  31655. 1
  31656. 6
  31657. 1
  31658. 53592
  31659. 4
  31660. 5
  31661. 1
  31662. 35434
  31663. 2
  31664. secure
  31665. 1
  31666. 49551
  31667. 1
  31668. 29557
  31669. 1
  31670. 53592
  31671. 4
  31672. 5
  31673. 1
  31674. 35434
  31675. 2
  31676. arm
  31677. 1
  31678. 49551
  31679. 1
  31680. 29557
  31681. 1
  31682. 53592
  31683. 4
  31684. 5
  31685. 1
  31686. 35434
  31687. 2
  31688. say_parse
  31689. 1
  31690. 49551
  31691. 1
  31692. 29557
  31693. 1
  31694. 53592
  31695. 4
  31696. 5
  31697. 1
  31698. 35434
  31699. 2
  31700. announce
  31701. 1
  31702. 49551
  31703. 1
  31704. 29557
  31705. 1
  31706. 53592
  31707. 4
  31708. 5
  31709. 1
  31710. 53592
  31711. 2
  31712. say
  31713. 1
  31714. 57140
  31715. 1
  31716. 49900
  31717. 1
  31718. 53592
  31719. 4
  31720. 5
  31721. 1
  31722. 53592
  31723. 2
  31724. say
  31725. 1
  31726. 19845
  31727. 1
  31728. 5409
  31729. 1
  31730. 53592
  31731. 4
  31732. 10
  31733. 4
  31734. 5
  31735. 1
  31736. 53592
  31737. 2
  31738. tell_lines
  31739. 1
  31740. 2487
  31741. 1
  31742. 6
  31743. 1
  31744. 53592
  31745. 4
  31746. 5
  31747. 1
  31748. 16553
  31749. 2
  31750. secure
  31751. 1
  31752. 30246
  31753. 1
  31754. 16017
  31755. 1
  31756. 53592
  31757. 4
  31758. 5
  31759. 1
  31760. 16553
  31761. 2
  31762. arm
  31763. 1
  31764. 30246
  31765. 1
  31766. 16017
  31767. 1
  31768. 53592
  31769. 4
  31770. 5
  31771. 1
  31772. 16553
  31773. 2
  31774. say_parse
  31775. 1
  31776. 30246
  31777. 1
  31778. 16017
  31779. 1
  31780. 53592
  31781. 4
  31782. 5
  31783. 1
  31784. 16553
  31785. 2
  31786. announce_all
  31787. 1
  31788. 30246
  31789. 1
  31790. 16017
  31791. 1
  31792. 53592
  31793. 4
  31794. 5
  31795. 1
  31796. 16553
  31797. 2
  31798. tell
  31799. 1
  31800. 4290
  31801. 1
  31802. 6145
  31803. 1
  31804. 53592
  31805. 4
  31806. 5
  31807. 1
  31808. 35434
  31809. 2
  31810. announce
  31811. 1
  31812. 31783
  31813. 1
  31814. 9805
  31815. 1
  31816. 53592
  31817. 4
  31818. 5
  31819. 1
  31820. 35434
  31821. 2
  31822. announce
  31823. 1
  31824. 49551
  31825. 1
  31826. 29557
  31827. 1
  31828. 53592
  31829. 4
  31830. 5
  31831. 1
  31832. 53592
  31833. 2
  31834. say
  31835. 1
  31836. 57140
  31837. 1
  31838. 49900
  31839. 1
  31840. 53592
  31841. 4
  31842. 5
  31843. 1
  31844. 53592
  31845. 2
  31846. say
  31847. 1
  31848. 19845
  31849. 1
  31850. 5409
  31851. 1
  31852. 53592
  31853. 4
  31854. 7
  31855. 4
  31856. 5
  31857. 1
  31858. 53592
  31859. 2
  31860. tell_lines
  31861. 1
  31862. 2487
  31863. 1
  31864. 6
  31865. 1
  31866. 53592
  31867. 4
  31868. 5
  31869. 1
  31870. 35434
  31871. 2
  31872. secure
  31873. 1
  31874. 49551
  31875. 1
  31876. 29557
  31877. 1
  31878. 53592
  31879. 4
  31880. 5
  31881. 1
  31882. 35434
  31883. 2
  31884. arm
  31885. 1
  31886. 49551
  31887. 1
  31888. 29557
  31889. 1
  31890. 53592
  31891. 4
  31892. 5
  31893. 1
  31894. 35434
  31895. 2
  31896. say_parse
  31897. 1
  31898. 49551
  31899. 1
  31900. 29557
  31901. 1
  31902. 53592
  31903. 4
  31904. 5
  31905. 1
  31906. 35434
  31907. 2
  31908. announce
  31909. 1
  31910. 49551
  31911. 1
  31912. 29557
  31913. 1
  31914. 53592
  31915. 4
  31916. 5
  31917. 1
  31918. 53592
  31919. 2
  31920. say
  31921. 1
  31922. 57140
  31923. 1
  31924. 49900
  31925. 1
  31926. 53592
  31927. 4
  31928. 5
  31929. 1
  31930. 53592
  31931. 2
  31932. say
  31933. 1
  31934. 19845
  31935. 1
  31936. 5409
  31937. 1
  31938. 53592
  31939. 4
  31940. 2
  31941. 4
  31942. 5
  31943. 1
  31944. 53592
  31945. 2
  31946. tell_lines
  31947. 1
  31948. 2487
  31949. 1
  31950. 6
  31951. 1
  31952. 53592
  31953. 4
  31954. 5
  31955. 1
  31956. 35434
  31957. 2
  31958. secure
  31959. 1
  31960. 49551
  31961. 1
  31962. 29557
  31963. 1
  31964. 53592
  31965. 4
  31966. 6
  31967. 4
  31968. 5
  31969. 1
  31970. 57810
  31971. 2
  31972. tell_lines
  31973. 1
  31974. 2487
  31975. 1
  31976. 6
  31977. 1
  31978. 57810
  31979. 4
  31980. 5
  31981. 1
  31982. 25980
  31983. 2
  31984. secure
  31985. 1
  31986. 49551
  31987. 1
  31988. 29557
  31989. 1
  31990. 57810
  31991. 4
  31992. 5
  31993. 1
  31994. 25980
  31995. 2
  31996. arm
  31997. 1
  31998. 49551
  31999. 1
  32000. 29557
  32001. 1
  32002. 57810
  32003. 4
  32004. 5
  32005. 1
  32006. 25980
  32007. 2
  32008. say_parse
  32009. 1
  32010. 49551
  32011. 1
  32012. 29557
  32013. 1
  32014. 57810
  32015. 4
  32016. 5
  32017. 1
  32018. 25980
  32019. 2
  32020. announce
  32021. 1
  32022. 49551
  32023. 1
  32024. 29557
  32025. 1
  32026. 57810
  32027. 4
  32028. 5
  32029. 1
  32030. 25980
  32031. 2
  32032. say
  32033. 1
  32034. 2
  32035. 1
  32036. 3
  32037. 1
  32038. 57810
  32039. 4
  32040. 4
  32041. 4
  32042. 5
  32043. 1
  32044. 51011
  32045. 2
  32046. tell_lines
  32047. 1
  32048. 2487
  32049. 1
  32050. 6
  32051. 1
  32052. 51011
  32053. 4
  32054. 5
  32055. 1
  32056. 23829
  32057. 2
  32058. secure
  32059. 1
  32060. 49551
  32061. 1
  32062. 29557
  32063. 1
  32064. 51011
  32065. 4
  32066. 5
  32067. 1
  32068. 23829
  32069. 2
  32070. arm
  32071. 1
  32072. 49551
  32073. 1
  32074. 29557
  32075. 1
  32076. 51011
  32077. 4
  32078. 5
  32079. 1
  32080. 23829
  32081. 2
  32082. press
  32083. 1
  32084. 49551
  32085. 1
  32086. 29557
  32087. 1
  32088. 51011
  32089. 4
  32090. 6
  32091. 4
  32092. 5
  32093. 1
  32094. 57490
  32095. 2
  32096. tell_lines
  32097. 1
  32098. 2487
  32099. 1
  32100. 6
  32101. 1
  32102. 57490
  32103. 4
  32104. 5
  32105. 1
  32106. 40548
  32107. 2
  32108. secure
  32109. 1
  32110. 49551
  32111. 1
  32112. 29557
  32113. 1
  32114. 57490
  32115. 4
  32116. 5
  32117. 1
  32118. 40548
  32119. 2
  32120. arm
  32121. 1
  32122. 49551
  32123. 1
  32124. 29557
  32125. 1
  32126. 57490
  32127. 4
  32128. 5
  32129. 1
  32130. 40548
  32131. 2
  32132. say_parse
  32133. 1
  32134. 49551
  32135. 1
  32136. 29557
  32137. 1
  32138. 57490
  32139. 4
  32140. 5
  32141. 1
  32142. 40548
  32143. 2
  32144. announce
  32145. 1
  32146. 49551
  32147. 1
  32148. 29557
  32149. 1
  32150. 57490
  32151. 4
  32152. 5
  32153. 1
  32154. 57490
  32155. 2
  32156. say
  32157. 1
  32158. 57140
  32159. 1
  32160. 49900
  32161. 1
  32162. 57490
  32163. 4
  32164. 7
  32165. 4
  32166. 5
  32167. 1
  32168. 49397
  32169. 2
  32170. tell_lines
  32171. 1
  32172. 2487
  32173. 1
  32174. 6
  32175. 1
  32176. 49397
  32177. 4
  32178. 5
  32179. 1
  32180. 7832
  32181. 2
  32182. secure
  32183. 1
  32184. 49551
  32185. 1
  32186. 29557
  32187. 1
  32188. 49397
  32189. 4
  32190. 5
  32191. 1
  32192. 7832
  32193. 2
  32194. arm
  32195. 1
  32196. 49551
  32197. 1
  32198. 29557
  32199. 1
  32200. 49397
  32201. 4
  32202. 5
  32203. 1
  32204. 7832
  32205. 2
  32206. say_parse
  32207. 1
  32208. 49551
  32209. 1
  32210. 29557
  32211. 1
  32212. 49397
  32213. 4
  32214. 5
  32215. 1
  32216. 7832
  32217. 2
  32218. announce
  32219. 1
  32220. 49551
  32221. 1
  32222. 29557
  32223. 1
  32224. 49397
  32225. 4
  32226. 5
  32227. 1
  32228. 49397
  32229. 2
  32230. say
  32231. 1
  32232. 57140
  32233. 1
  32234. 49900
  32235. 1
  32236. 49397
  32237. 4
  32238. 5
  32239. 1
  32240. 49397
  32241. 2
  32242. say
  32243. 1
  32244. 19845
  32245. 1
  32246. 5409
  32247. 1
  32248. 49397
  32249. 4
  32250. 8
  32251. 4
  32252. 5
  32253. 1
  32254. 50823
  32255. 2
  32256. tell_lines
  32257. 1
  32258. 2487
  32259. 1
  32260. 6
  32261. 1
  32262. 50823
  32263. 4
  32264. 5
  32265. 1
  32266. 36284
  32267. 2
  32268. @inspect
  32269. 1
  32270. 19845
  32271. 1
  32272. 36284
  32273. 1
  32274. 50823
  32275. 4
  32276. 5
  32277. 1
  32278. 50823
  32279. 2
  32280. my_huh
  32281. 1
  32282. 50823
  32283. 1
  32284. 6
  32285. 1
  32286. 50823
  32287. 4
  32288. 5
  32289. 1
  32290. 50823
  32291. 2
  32292. my_huh
  32293. 1
  32294. 78
  32295. 1
  32296. 7069
  32297. 1
  32298. 50823
  32299. 4
  32300. 5
  32301. 1
  32302. 50823
  32303. 2
  32304. my_huh
  32305. 1
  32306. 24442
  32307. 1
  32308. 26026
  32309. 1
  32310. 50823
  32311. 4
  32312. 5
  32313. 1
  32314. 50823
  32315. 2
  32316. my_huh
  32317. 1
  32318. 57140
  32319. 1
  32320. 49900
  32321. 1
  32322. 50823
  32323. 4
  32324. 5
  32325. 1
  32326. 219
  32327. 2
  32328. do_huh
  32329. 1
  32330. 50823
  32331. 1
  32332. 219
  32333. 1
  32334. 50823
  32335. 4
  32336. 5
  32337. 1
  32338. 17
  32339. 2
  32340. @inspect
  32341. 1
  32342. 50823
  32343. 1
  32344. 1
  32345. 1
  32346. 50823
  32347. 4
  32348. 4
  32349. 4
  32350. 5
  32351. 1
  32352. 50636
  32353. 2
  32354. tell_lines
  32355. 1
  32356. 2487
  32357. 1
  32358. 6
  32359. 1
  32360. 50636
  32361. 4
  32362. 5
  32363. 1
  32364. 50636
  32365. 2
  32366. look_self
  32367. 1
  32368. 2
  32369. 1
  32370. 1
  32371. 1
  32372. 50636
  32373. 4
  32374. 5
  32375. 1
  32376. 50636
  32377. 2
  32378. look_self
  32379. 1
  32380. 2
  32381. 1
  32382. 6
  32383. 1
  32384. 50636
  32385. 4
  32386. 5
  32387. 1
  32388. 5443
  32389. 2
  32390. look
  32391. 1
  32392. 2
  32393. 1
  32394. 3
  32395. 1
  32396. 50636
  32397. 4
  32398. 7
  32399. 4
  32400. 5
  32401. 1
  32402. 50204
  32403. 2
  32404. tell_lines
  32405. 1
  32406. 2487
  32407. 1
  32408. 6
  32409. 1
  32410. 50204
  32411. 4
  32412. 5
  32413. 1
  32414. 25972
  32415. 2
  32416. secure
  32417. 1
  32418. 49551
  32419. 1
  32420. 29557
  32421. 1
  32422. 50204
  32423. 4
  32424. 5
  32425. 1
  32426. 25972
  32427. 2
  32428. arm
  32429. 1
  32430. 49551
  32431. 1
  32432. 29557
  32433. 1
  32434. 50204
  32435. 4
  32436. 5
  32437. 1
  32438. 25972
  32439. 2
  32440. say_parse
  32441. 1
  32442. 49551
  32443. 1
  32444. 29557
  32445. 1
  32446. 50204
  32447. 4
  32448. 5
  32449. 1
  32450. 25972
  32451. 2
  32452. announce
  32453. 1
  32454. 49551
  32455. 1
  32456. 29557
  32457. 1
  32458. 50204
  32459. 4
  32460. 5
  32461. 1
  32462. 25972
  32463. 2
  32464. say
  32465. 1
  32466. 2
  32467. 1
  32468. 3
  32469. 1
  32470. 50204
  32471. 4
  32472. 5
  32473. 1
  32474. 50204
  32475. 2
  32476. say
  32477. 1
  32478. 31783
  32479. 1
  32480. 4803
  32481. 1
  32482. 50204
  32483. 4
  32484. 7
  32485. 4
  32486. 5
  32487. 1
  32488. 54837
  32489. 2
  32490. tell_lines
  32491. 1
  32492. 2487
  32493. 1
  32494. 6
  32495. 1
  32496. 54837
  32497. 4
  32498. 5
  32499. 1
  32500. 38607
  32501. 2
  32502. secure
  32503. 1
  32504. 49551
  32505. 1
  32506. 29557
  32507. 1
  32508. 54837
  32509. 4
  32510. 5
  32511. 1
  32512. 38607
  32513. 2
  32514. arm
  32515. 1
  32516. 49551
  32517. 1
  32518. 29557
  32519. 1
  32520. 54837
  32521. 4
  32522. 5
  32523. 1
  32524. 38607
  32525. 2
  32526. say_parse
  32527. 1
  32528. 49551
  32529. 1
  32530. 29557
  32531. 1
  32532. 54837
  32533. 4
  32534. 5
  32535. 1
  32536. 38607
  32537. 2
  32538. announce
  32539. 1
  32540. 49551
  32541. 1
  32542. 29557
  32543. 1
  32544. 54837
  32545. 4
  32546. 5
  32547. 1
  32548. 38607
  32549. 2
  32550. say
  32551. 1
  32552. 2
  32553. 1
  32554. 3
  32555. 1
  32556. 54837
  32557. 4
  32558. 5
  32559. 1
  32560. 54837
  32561. 2
  32562. say
  32563. 1
  32564. 31783
  32565. 1
  32566. 4803
  32567. 1
  32568. 54837
  32569. 4
  32570. 7
  32571. 4
  32572. 5
  32573. 1
  32574. 50204
  32575. 2
  32576. tell_lines
  32577. 1
  32578. 2487
  32579. 1
  32580. 6
  32581. 1
  32582. 50204
  32583. 4
  32584. 5
  32585. 1
  32586. 25972
  32587. 2
  32588. secure
  32589. 1
  32590. 49551
  32591. 1
  32592. 29557
  32593. 1
  32594. 50204
  32595. 4
  32596. 5
  32597. 1
  32598. 25972
  32599. 2
  32600. arm
  32601. 1
  32602. 49551
  32603. 1
  32604. 29557
  32605. 1
  32606. 50204
  32607. 4
  32608. 5
  32609. 1
  32610. 25972
  32611. 2
  32612. say_parse
  32613. 1
  32614. 49551
  32615. 1
  32616. 29557
  32617. 1
  32618. 50204
  32619. 4
  32620. 5
  32621. 1
  32622. 25972
  32623. 2
  32624. announce
  32625. 1
  32626. 49551
  32627. 1
  32628. 29557
  32629. 1
  32630. 50204
  32631. 4
  32632. 5
  32633. 1
  32634. 25972
  32635. 2
  32636. say
  32637. 1
  32638. 2
  32639. 1
  32640. 3
  32641. 1
  32642. 50204
  32643. 4
  32644. 5
  32645. 1
  32646. 50204
  32647. 2
  32648. say
  32649. 1
  32650. 31783
  32651. 1
  32652. 4803
  32653. 1
  32654. 50204
  32655. 4
  32656. 6
  32657. 4
  32658. 5
  32659. 1
  32660. 51261
  32661. 2
  32662. tell_lines
  32663. 1
  32664. 2487
  32665. 1
  32666. 6
  32667. 1
  32668. 51261
  32669. 4
  32670. 5
  32671. 1
  32672. 51261
  32673. 2
  32674. look_self
  32675. 1
  32676. 15
  32677. 1
  32678. 7069
  32679. 1
  32680. 51261
  32681. 4
  32682. 5
  32683. 1
  32684. 51261
  32685. 2
  32686. look_self
  32687. 1
  32688. 57140
  32689. 1
  32690. 49900
  32691. 1
  32692. 51261
  32693. 4
  32694. 5
  32695. 1
  32696. 30711
  32697. 2
  32698. special_look
  32699. 1
  32700. 31783
  32701. 1
  32702. 9805
  32703. 1
  32704. 51261
  32705. 4
  32706. 5
  32707. 1
  32708. 30711
  32709. 2
  32710. l
  32711. 1
  32712. 31783
  32713. 1
  32714. 9805
  32715. 1
  32716. 51261
  32717. 4
  32718. 5
  32719. 1
  32720. 30711
  32721. 2
  32722. l
  32723. 1
  32724. 49551
  32725. 1
  32726. 29557
  32727. 1
  32728. 51261
  32729. 4
  32730. 6
  32731. 4
  32732. 5
  32733. 1
  32734. 51261
  32735. 2
  32736. tell_lines
  32737. 1
  32738. 2487
  32739. 1
  32740. 6
  32741. 1
  32742. 51261
  32743. 4
  32744. 5
  32745. 1
  32746. 51261
  32747. 2
  32748. look_self
  32749. 1
  32750. 15
  32751. 1
  32752. 7069
  32753. 1
  32754. 51261
  32755. 4
  32756. 5
  32757. 1
  32758. 51261
  32759. 2
  32760. look_self
  32761. 1
  32762. 57140
  32763. 1
  32764. 49900
  32765. 1
  32766. 51261
  32767. 4
  32768. 5
  32769. 1
  32770. 30711
  32771. 2
  32772. special_look
  32773. 1
  32774. 31783
  32775. 1
  32776. 9805
  32777. 1
  32778. 51261
  32779. 4
  32780. 5
  32781. 1
  32782. 30711
  32783. 2
  32784. l
  32785. 1
  32786. 31783
  32787. 1
  32788. 9805
  32789. 1
  32790. 51261
  32791. 4
  32792. 5
  32793. 1
  32794. 30711
  32795. 2
  32796. l
  32797. 1
  32798. 49551
  32799. 1
  32800. 29557
  32801. 1
  32802. 51261
  32803. 4
  32804. 6
  32805. 4
  32806. 5
  32807. 1
  32808. 51261
  32809. 2
  32810. tell_lines
  32811. 1
  32812. 2487
  32813. 1
  32814. 6
  32815. 1
  32816. 51261
  32817. 4
  32818. 5
  32819. 1
  32820. 51261
  32821. 2
  32822. look_self
  32823. 1
  32824. 15
  32825. 1
  32826. 7069
  32827. 1
  32828. 51261
  32829. 4
  32830. 5
  32831. 1
  32832. 51261
  32833. 2
  32834. look_self
  32835. 1
  32836. 57140
  32837. 1
  32838. 49900
  32839. 1
  32840. 51261
  32841. 4
  32842. 5
  32843. 1
  32844. 30711
  32845. 2
  32846. special_look
  32847. 1
  32848. 31783
  32849. 1
  32850. 9805
  32851. 1
  32852. 51261
  32853. 4
  32854. 5
  32855. 1
  32856. 30711
  32857. 2
  32858. l
  32859. 1
  32860. 31783
  32861. 1
  32862. 9805
  32863. 1
  32864. 51261
  32865. 4
  32866. 5
  32867. 1
  32868. 30711
  32869. 2
  32870. l
  32871. 1
  32872. 49551
  32873. 1
  32874. 29557
  32875. 1
  32876. 51261
  32877. 4
  32878. 6
  32879. 4
  32880. 5
  32881. 1
  32882. 57861
  32883. 2
  32884. tell_lines
  32885. 1
  32886. 2487
  32887. 1
  32888. 6
  32889. 1
  32890. 57861
  32891. 4
  32892. 5
  32893. 1
  32894. 51261
  32895. 2
  32896. look_self
  32897. 1
  32898. 15
  32899. 1
  32900. 7069
  32901. 1
  32902. 57861
  32903. 4
  32904. 5
  32905. 1
  32906. 51261
  32907. 2
  32908. look_self
  32909. 1
  32910. 57140
  32911. 1
  32912. 49900
  32913. 1
  32914. 57861
  32915. 4
  32916. 5
  32917. 1
  32918. 30711
  32919. 2
  32920. special_look
  32921. 1
  32922. 31783
  32923. 1
  32924. 9805
  32925. 1
  32926. 57861
  32927. 4
  32928. 5
  32929. 1
  32930. 30711
  32931. 2
  32932. l
  32933. 1
  32934. 31783
  32935. 1
  32936. 9805
  32937. 1
  32938. 57861
  32939. 4
  32940. 5
  32941. 1
  32942. 30711
  32943. 2
  32944. l
  32945. 1
  32946. 49551
  32947. 1
  32948. 29557
  32949. 1
  32950. 57861
  32951. 4
  32952. 6
  32953. 4
  32954. 5
  32955. 1
  32956. 51261
  32957. 2
  32958. tell_lines
  32959. 1
  32960. 2487
  32961. 1
  32962. 6
  32963. 1
  32964. 51261
  32965. 4
  32966. 5
  32967. 1
  32968. 51261
  32969. 2
  32970. look_self
  32971. 1
  32972. 15
  32973. 1
  32974. 7069
  32975. 1
  32976. 51261
  32977. 4
  32978. 5
  32979. 1
  32980. 51261
  32981. 2
  32982. look_self
  32983. 1
  32984. 57140
  32985. 1
  32986. 49900
  32987. 1
  32988. 51261
  32989. 4
  32990. 5
  32991. 1
  32992. 30711
  32993. 2
  32994. special_look
  32995. 1
  32996. 31783
  32997. 1
  32998. 9805
  32999. 1
  33000. 51261
  33001. 4
  33002. 5
  33003. 1
  33004. 30711
  33005. 2
  33006. l
  33007. 1
  33008. 31783
  33009. 1
  33010. 9805
  33011. 1
  33012. 51261
  33013. 4
  33014. 5
  33015. 1
  33016. 30711
  33017. 2
  33018. l
  33019. 1
  33020. 49551
  33021. 1
  33022. 29557
  33023. 1
  33024. 51261
  33025. 4
  33026. 4
  33027. 4
  33028. 5
  33029. 1
  33030. 51261
  33031. 2
  33032. tell_lines
  33033. 1
  33034. 2487
  33035. 1
  33036. 6
  33037. 1
  33038. 51261
  33039. 4
  33040. 5
  33041. 1
  33042. 51261
  33043. 2
  33044. look_self
  33045. 1
  33046. 15
  33047. 1
  33048. 7069
  33049. 1
  33050. 51261
  33051. 4
  33052. 5
  33053. 1
  33054. 51261
  33055. 2
  33056. look_self
  33057. 1
  33058. 57140
  33059. 1
  33060. 49900
  33061. 1
  33062. 51261
  33063. 4
  33064. 5
  33065. 1
  33066. 57659
  33067. 2
  33068. l
  33069. 1
  33070. 2
  33071. 1
  33072. 3
  33073. 1
  33074. 51261
  33075. 4
  33076. 4
  33077. 4
  33078. 5
  33079. 1
  33080. 50636
  33081. 2
  33082. tell_lines
  33083. 1
  33084. 2487
  33085. 1
  33086. 6
  33087. 1
  33088. 50636
  33089. 4
  33090. 5
  33091. 1
  33092. 51261
  33093. 2
  33094. look_self
  33095. 1
  33096. 15
  33097. 1
  33098. 7069
  33099. 1
  33100. 50636
  33101. 4
  33102. 5
  33103. 1
  33104. 51261
  33105. 2
  33106. look_self
  33107. 1
  33108. 57140
  33109. 1
  33110. 49900
  33111. 1
  33112. 50636
  33113. 4
  33114. 5
  33115. 1
  33116. 57659
  33117. 2
  33118. look
  33119. 1
  33120. 2
  33121. 1
  33122. 3
  33123. 1
  33124. 50636
  33125. 4
  33126. 4
  33127. 4
  33128. 5
  33129. 1
  33130. 51261
  33131. 2
  33132. tell_lines
  33133. 1
  33134. 2487
  33135. 1
  33136. 6
  33137. 1
  33138. 51261
  33139. 4
  33140. 5
  33141. 1
  33142. 51261
  33143. 2
  33144. look_self
  33145. 1
  33146. 15
  33147. 1
  33148. 7069
  33149. 1
  33150. 51261
  33151. 4
  33152. 5
  33153. 1
  33154. 51261
  33155. 2
  33156. look_self
  33157. 1
  33158. 57140
  33159. 1
  33160. 49900
  33161. 1
  33162. 51261
  33163. 4
  33164. 5
  33165. 1
  33166. 57659
  33167. 2
  33168. l
  33169. 1
  33170. 2
  33171. 1
  33172. 3
  33173. 1
  33174. 51261
  33175. 4
  33176. 4
  33177. 4
  33178. 5
  33179. 1
  33180. 50453
  33181. 2
  33182. tell_lines
  33183. 1
  33184. 2487
  33185. 1
  33186. 6
  33187. 1
  33188. 50453
  33189. 4
  33190. 5
  33191. 1
  33192. 51261
  33193. 2
  33194. look_self
  33195. 1
  33196. 15
  33197. 1
  33198. 7069
  33199. 1
  33200. 50453
  33201. 4
  33202. 5
  33203. 1
  33204. 51261
  33205. 2
  33206. look_self
  33207. 1
  33208. 57140
  33209. 1
  33210. 49900
  33211. 1
  33212. 50453
  33213. 4
  33214. 5
  33215. 1
  33216. 57659
  33217. 2
  33218. l
  33219. 1
  33220. 2
  33221. 1
  33222. 3
  33223. 1
  33224. 50453
  33225. 4
  33226. 4
  33227. 4
  33228. 5
  33229. 1
  33230. 50453
  33231. 2
  33232. tell_lines
  33233. 1
  33234. 2487
  33235. 1
  33236. 6
  33237. 1
  33238. 50453
  33239. 4
  33240. 5
  33241. 1
  33242. 51261
  33243. 2
  33244. look_self
  33245. 1
  33246. 15
  33247. 1
  33248. 7069
  33249. 1
  33250. 50453
  33251. 4
  33252. 5
  33253. 1
  33254. 51261
  33255. 2
  33256. look_self
  33257. 1
  33258. 57140
  33259. 1
  33260. 49900
  33261. 1
  33262. 50453
  33263. 4
  33264. 5
  33265. 1
  33266. 57659
  33267. 2
  33268. l
  33269. 1
  33270. 2
  33271. 1
  33272. 3
  33273. 1
  33274. 50453
  33275. 4
  33276. 4
  33277. 4
  33278. 5
  33279. 1
  33280. 51261
  33281. 2
  33282. tell_lines
  33283. 1
  33284. 2487
  33285. 1
  33286. 6
  33287. 1
  33288. 51261
  33289. 4
  33290. 5
  33291. 1
  33292. 51261
  33293. 2
  33294. look_self
  33295. 1
  33296. 15
  33297. 1
  33298. 7069
  33299. 1
  33300. 51261
  33301. 4
  33302. 5
  33303. 1
  33304. 51261
  33305. 2
  33306. look_self
  33307. 1
  33308. 57140
  33309. 1
  33310. 49900
  33311. 1
  33312. 51261
  33313. 4
  33314. 5
  33315. 1
  33316. 57659
  33317. 2
  33318. l
  33319. 1
  33320. 2
  33321. 1
  33322. 3
  33323. 1
  33324. 51261
  33325. 4
  33326. 4
  33327. 4
  33328. 5
  33329. 1
  33330. 51261
  33331. 2
  33332. tell_lines
  33333. 1
  33334. 2487
  33335. 1
  33336. 6
  33337. 1
  33338. 51261
  33339. 4
  33340. 5
  33341. 1
  33342. 51261
  33343. 2
  33344. look_self
  33345. 1
  33346. 15
  33347. 1
  33348. 7069
  33349. 1
  33350. 51261
  33351. 4
  33352. 5
  33353. 1
  33354. 51261
  33355. 2
  33356. look_self
  33357. 1
  33358. 57140
  33359. 1
  33360. 49900
  33361. 1
  33362. 51261
  33363. 4
  33364. 5
  33365. 1
  33366. 57659
  33367. 2
  33368. l
  33369. 1
  33370. 2
  33371. 1
  33372. 3
  33373. 1
  33374. 51261
  33375. 4
  33376. 4
  33377. 4
  33378. 5
  33379. 1
  33380. 50636
  33381. 2
  33382. tell_lines
  33383. 1
  33384. 2487
  33385. 1
  33386. 6
  33387. 1
  33388. 50636
  33389. 4
  33390. 5
  33391. 1
  33392. 51261
  33393. 2
  33394. look_self
  33395. 1
  33396. 15
  33397. 1
  33398. 7069
  33399. 1
  33400. 50636
  33401. 4
  33402. 5
  33403. 1
  33404. 51261
  33405. 2
  33406. look_self
  33407. 1
  33408. 57140
  33409. 1
  33410. 49900
  33411. 1
  33412. 50636
  33413. 4
  33414. 5
  33415. 1
  33416. 57659
  33417. 2
  33418. look
  33419. 1
  33420. 2
  33421. 1
  33422. 3
  33423. 1
  33424. 50636
  33425. 4
  33426. 4
  33427. 4
  33428. 5
  33429. 1
  33430. 51261
  33431. 2
  33432. tell_lines
  33433. 1
  33434. 2487
  33435. 1
  33436. 6
  33437. 1
  33438. 51261
  33439. 4
  33440. 5
  33441. 1
  33442. 51261
  33443. 2
  33444. look_self
  33445. 1
  33446. 15
  33447. 1
  33448. 7069
  33449. 1
  33450. 51261
  33451. 4
  33452. 5
  33453. 1
  33454. 51261
  33455. 2
  33456. look_self
  33457. 1
  33458. 57140
  33459. 1
  33460. 49900
  33461. 1
  33462. 51261
  33463. 4
  33464. 5
  33465. 1
  33466. 57659
  33467. 2
  33468. l
  33469. 1
  33470. 2
  33471. 1
  33472. 3
  33473. 1
  33474. 51261
  33475. 4
  33476. 4
  33477. 4
  33478. 5
  33479. 1
  33480. 50636
  33481. 2
  33482. tell_lines
  33483. 1
  33484. 2487
  33485. 1
  33486. 6
  33487. 1
  33488. 50636
  33489. 4
  33490. 5
  33491. 1
  33492. 51261
  33493. 2
  33494. look_self
  33495. 1
  33496. 15
  33497. 1
  33498. 7069
  33499. 1
  33500. 50636
  33501. 4
  33502. 5
  33503. 1
  33504. 51261
  33505. 2
  33506. look_self
  33507. 1
  33508. 57140
  33509. 1
  33510. 49900
  33511. 1
  33512. 50636
  33513. 4
  33514. 5
  33515. 1
  33516. 57659
  33517. 2
  33518. look
  33519. 1
  33520. 2
  33521. 1
  33522. 3
  33523. 1
  33524. 50636
  33525. 4
  33526. 4
  33527. 4
  33528. 5
  33529. 1
  33530. 51261
  33531. 2
  33532. tell_lines
  33533. 1
  33534. 2487
  33535. 1
  33536. 6
  33537. 1
  33538. 51261
  33539. 4
  33540. 5
  33541. 1
  33542. 51261
  33543. 2
  33544. look_self
  33545. 1
  33546. 15
  33547. 1
  33548. 7069
  33549. 1
  33550. 51261
  33551. 4
  33552. 5
  33553. 1
  33554. 51261
  33555. 2
  33556. look_self
  33557. 1
  33558. 57140
  33559. 1
  33560. 49900
  33561. 1
  33562. 51261
  33563. 4
  33564. 5
  33565. 1
  33566. 57659
  33567. 2
  33568. l
  33569. 1
  33570. 2
  33571. 1
  33572. 3
  33573. 1
  33574. 51261
  33575. 4
  33576. 6
  33577. 4
  33578. 5
  33579. 1
  33580. 57871
  33581. 2
  33582. tell_lines
  33583. 1
  33584. 2487
  33585. 1
  33586. 6
  33587. 1
  33588. 57871
  33589. 4
  33590. 5
  33591. 1
  33592. 25913
  33593. 2
  33594. secure
  33595. 1
  33596. 49551
  33597. 1
  33598. 29557
  33599. 1
  33600. 57871
  33601. 4
  33602. 5
  33603. 1
  33604. 25913
  33605. 2
  33606. arm
  33607. 1
  33608. 49551
  33609. 1
  33610. 29557
  33611. 1
  33612. 57871
  33613. 4
  33614. 5
  33615. 1
  33616. 25913
  33617. 2
  33618. say_parse
  33619. 1
  33620. 49551
  33621. 1
  33622. 29557
  33623. 1
  33624. 57871
  33625. 4
  33626. 5
  33627. 1
  33628. 25913
  33629. 2
  33630. announce
  33631. 1
  33632. 49551
  33633. 1
  33634. 29557
  33635. 1
  33636. 57871
  33637. 4
  33638. 5
  33639. 1
  33640. 25913
  33641. 2
  33642. say
  33643. 1
  33644. 2
  33645. 1
  33646. 3
  33647. 1
  33648. 57871
  33649. 4
  33650. 6
  33651. 4
  33652. 5
  33653. 1
  33654. 57871
  33655. 2
  33656. tell_lines
  33657. 1
  33658. 2487
  33659. 1
  33660. 6
  33661. 1
  33662. 57871
  33663. 4
  33664. 5
  33665. 1
  33666. 25913
  33667. 2
  33668. secure
  33669. 1
  33670. 49551
  33671. 1
  33672. 29557
  33673. 1
  33674. 57871
  33675. 4
  33676. 5
  33677. 1
  33678. 25913
  33679. 2
  33680. arm
  33681. 1
  33682. 49551
  33683. 1
  33684. 29557
  33685. 1
  33686. 57871
  33687. 4
  33688. 5
  33689. 1
  33690. 25913
  33691. 2
  33692. say_parse
  33693. 1
  33694. 49551
  33695. 1
  33696. 29557
  33697. 1
  33698. 57871
  33699. 4
  33700. 5
  33701. 1
  33702. 25913
  33703. 2
  33704. announce
  33705. 1
  33706. 49551
  33707. 1
  33708. 29557
  33709. 1
  33710. 57871
  33711. 4
  33712. 5
  33713. 1
  33714. 25913
  33715. 2
  33716. say
  33717. 1
  33718. 2
  33719. 1
  33720. 3
  33721. 1
  33722. 57871
  33723. 4
  33724. 8
  33725. 4
  33726. 5
  33727. 1
  33728. 54875
  33729. 2
  33730. tell_lines
  33731. 1
  33732. 2487
  33733. 1
  33734. 6
  33735. 1
  33736. 54875
  33737. 4
  33738. 5
  33739. 1
  33740. 18807
  33741. 2
  33742. @peruse
  33743. 1
  33744. 31783
  33745. 1
  33746. 18807
  33747. 1
  33748. 54875
  33749. 4
  33750. 5
  33751. 1
  33752. 54875
  33753. 2
  33754. my_huh
  33755. 1
  33756. 54875
  33757. 1
  33758. 6
  33759. 1
  33760. 54875
  33761. 4
  33762. 5
  33763. 1
  33764. 54875
  33765. 2
  33766. my_huh
  33767. 1
  33768. 78
  33769. 1
  33770. 7069
  33771. 1
  33772. 54875
  33773. 4
  33774. 5
  33775. 1
  33776. 54875
  33777. 2
  33778. my_huh
  33779. 1
  33780. 24442
  33781. 1
  33782. 26026
  33783. 1
  33784. 54875
  33785. 4
  33786. 5
  33787. 1
  33788. 54875
  33789. 2
  33790. my_huh
  33791. 1
  33792. 57140
  33793. 1
  33794. 49900
  33795. 1
  33796. 54875
  33797. 4
  33798. 5
  33799. 1
  33800. 219
  33801. 2
  33802. do_huh
  33803. 1
  33804. 54875
  33805. 1
  33806. 219
  33807. 1
  33808. 54875
  33809. 4
  33810. 5
  33811. 1
  33812. 17
  33813. 2
  33814. @peruse
  33815. 1
  33816. 54875
  33817. 1
  33818. 1
  33819. 1
  33820. 54875
  33821. 4
  33822. 8
  33823. 4
  33824. 5
  33825. 1
  33826. 53484
  33827. 2
  33828. tell_lines
  33829. 1
  33830. 2487
  33831. 1
  33832. 6
  33833. 1
  33834. 53484
  33835. 4
  33836. 5
  33837. 1
  33838. 39091
  33839. 2
  33840. secure
  33841. 1
  33842. 49551
  33843. 1
  33844. 29557
  33845. 1
  33846. 53484
  33847. 4
  33848. 5
  33849. 1
  33850. 39091
  33851. 2
  33852. arm
  33853. 1
  33854. 49551
  33855. 1
  33856. 29557
  33857. 1
  33858. 53484
  33859. 4
  33860. 5
  33861. 1
  33862. 39091
  33863. 2
  33864. say_parse
  33865. 1
  33866. 49551
  33867. 1
  33868. 29557
  33869. 1
  33870. 53484
  33871. 4
  33872. 5
  33873. 1
  33874. 39091
  33875. 2
  33876. announce
  33877. 1
  33878. 49551
  33879. 1
  33880. 29557
  33881. 1
  33882. 53484
  33883. 4
  33884. 5
  33885. 1
  33886. 39091
  33887. 2
  33888. announce
  33889. 1
  33890. 48961
  33891. 1
  33892. 39357
  33893. 1
  33894. 53484
  33895. 4
  33896. 5
  33897. 1
  33898. 53484
  33899. 2
  33900. say
  33901. 1
  33902. 57140
  33903. 1
  33904. 49900
  33905. 1
  33906. 53484
  33907. 4
  33908. 5
  33909. 1
  33910. 53484
  33911. 2
  33912. say
  33913. 1
  33914. 19845
  33915. 1
  33916. 5409
  33917. 1
  33918. 53484
  33919. 4
  33920. 8
  33921. 4
  33922. 5
  33923. 1
  33924. 53484
  33925. 2
  33926. tell_lines
  33927. 1
  33928. 2487
  33929. 1
  33930. 6
  33931. 1
  33932. 53484
  33933. 4
  33934. 5
  33935. 1
  33936. 36284
  33937. 2
  33938. @dox
  33939. 1
  33940. 19845
  33941. 1
  33942. 36284
  33943. 1
  33944. 53484
  33945. 4
  33946. 5
  33947. 1
  33948. 53484
  33949. 2
  33950. my_huh
  33951. 1
  33952. 53484
  33953. 1
  33954. 6
  33955. 1
  33956. 53484
  33957. 4
  33958. 5
  33959. 1
  33960. 53484
  33961. 2
  33962. my_huh
  33963. 1
  33964. 78
  33965. 1
  33966. 7069
  33967. 1
  33968. 53484
  33969. 4
  33970. 5
  33971. 1
  33972. 53484
  33973. 2
  33974. my_huh
  33975. 1
  33976. 24442
  33977. 1
  33978. 26026
  33979. 1
  33980. 53484
  33981. 4
  33982. 5
  33983. 1
  33984. 53484
  33985. 2
  33986. my_huh
  33987. 1
  33988. 57140
  33989. 1
  33990. 49900
  33991. 1
  33992. 53484
  33993. 4
  33994. 5
  33995. 1
  33996. 219
  33997. 2
  33998. do_huh
  33999. 1
  34000. 53484
  34001. 1
  34002. 219
  34003. 1
  34004. 53484
  34005. 4
  34006. 5
  34007. 1
  34008. 39091
  34009. 2
  34010. @dox
  34011. 1
  34012. 53484
  34013. 1
  34014. 1
  34015. 1
  34016. 53484
  34017. 4
  34018. 7
  34019. 4
  34020. 5
  34021. 1
  34022. 57421
  34023. 2
  34024. tell_lines
  34025. 1
  34026. 2487
  34027. 1
  34028. 6
  34029. 1
  34030. 57421
  34031. 4
  34032. 5
  34033. 1
  34034. 52633
  34035. 2
  34036. secure
  34037. 1
  34038. 49551
  34039. 1
  34040. 29557
  34041. 1
  34042. 57421
  34043. 4
  34044. 5
  34045. 1
  34046. 52633
  34047. 2
  34048. arm
  34049. 1
  34050. 49551
  34051. 1
  34052. 29557
  34053. 1
  34054. 57421
  34055. 4
  34056. 5
  34057. 1
  34058. 52633
  34059. 2
  34060. say_parse
  34061. 1
  34062. 49551
  34063. 1
  34064. 29557
  34065. 1
  34066. 57421
  34067. 4
  34068. 5
  34069. 1
  34070. 52633
  34071. 2
  34072. announce
  34073. 1
  34074. 49551
  34075. 1
  34076. 29557
  34077. 1
  34078. 57421
  34079. 4
  34080. 5
  34081. 1
  34082. 57421
  34083. 2
  34084. say
  34085. 1
  34086. 57140
  34087. 1
  34088. 49900
  34089. 1
  34090. 57421
  34091. 4
  34092. 5
  34093. 1
  34094. 57421
  34095. 2
  34096. say
  34097. 1
  34098. 19845
  34099. 1
  34100. 5409
  34101. 1
  34102. 57421
  34103. 4
  34104. 2
  34105. 4
  34106. 5
  34107. 1
  34108. 56673
  34109. 2
  34110. tell_lines
  34111. 1
  34112. 2487
  34113. 1
  34114. 6
  34115. 1
  34116. 56673
  34117. 4
  34118. 5
  34119. 1
  34120. 26640
  34121. 2
  34122. secure
  34123. 1
  34124. 30246
  34125. 1
  34126. 16017
  34127. 1
  34128. 56673
  34129. 4
  34130. 6
  34131. 4
  34132. 5
  34133. 1
  34134. 57919
  34135. 2
  34136. tell_lines
  34137. 1
  34138. 2487
  34139. 1
  34140. 6
  34141. 1
  34142. 57919
  34143. 4
  34144. 5
  34145. 1
  34146. 20584
  34147. 2
  34148. secure
  34149. 1
  34150. 49551
  34151. 1
  34152. 29557
  34153. 1
  34154. 57919
  34155. 4
  34156. 5
  34157. 1
  34158. 20584
  34159. 2
  34160. arm
  34161. 1
  34162. 49551
  34163. 1
  34164. 29557
  34165. 1
  34166. 57919
  34167. 4
  34168. 5
  34169. 1
  34170. 20584
  34171. 2
  34172. say_parse
  34173. 1
  34174. 49551
  34175. 1
  34176. 29557
  34177. 1
  34178. 57919
  34179. 4
  34180. 5
  34181. 1
  34182. 20584
  34183. 2
  34184. announce
  34185. 1
  34186. 49551
  34187. 1
  34188. 29557
  34189. 1
  34190. 57919
  34191. 4
  34192. 5
  34193. 1
  34194. 20584
  34195. 2
  34196. say
  34197. 1
  34198. 2
  34199. 1
  34200. 3
  34201. 1
  34202. 57919
  34203. 4
  34204. 2
  34205. 4
  34206. 5
  34207. 1
  34208. 57280
  34209. 2
  34210. tell_lines
  34211. 1
  34212. 2487
  34213. 1
  34214. 6
  34215. 1
  34216. 57280
  34217. 4
  34218. 5
  34219. 1
  34220. 57280
  34221. 2
  34222. who_has_quota
  34223. 1
  34224. 57280
  34225. 1
  34226. 21493
  34227. 1
  34228. 57280
  34229. 4
  34230. 2
  34231. 4
  34232. 5
  34233. 1
  34234. 57280
  34235. 2
  34236. tell_lines
  34237. 1
  34238. 2487
  34239. 1
  34240. 6
  34241. 1
  34242. 57280
  34243. 4
  34244. 5
  34245. 1
  34246. 57280
  34247. 2
  34248. who_has_quota
  34249. 1
  34250. 57280
  34251. 1
  34252. 21493
  34253. 1
  34254. 57280
  34255. 4
  34256. 4
  34257. 4
  34258. 5
  34259. 1
  34260. 57510
  34261. 2
  34262. tell_lines
  34263. 1
  34264. 2487
  34265. 1
  34266. 6
  34267. 1
  34268. 57510
  34269. 4
  34270. 5
  34271. 1
  34272. 53657
  34273. 2
  34274. secure
  34275. 1
  34276. 49551
  34277. 1
  34278. 29557
  34279. 1
  34280. 57510
  34281. 4
  34282. 5
  34283. 1
  34284. 53657
  34285. 2
  34286. arm
  34287. 1
  34288. 49551
  34289. 1
  34290. 29557
  34291. 1
  34292. 57510
  34293. 4
  34294. 5
  34295. 1
  34296. 53657
  34297. 2
  34298. press
  34299. 1
  34300. 49551
  34301. 1
  34302. 29557
  34303. 1
  34304. 57510
  34305. 4
  34306. 4
  34307. 4
  34308. 5
  34309. 1
  34310. 57014
  34311. 2
  34312. tell_lines
  34313. 1
  34314. 2487
  34315. 1
  34316. 6
  34317. 1
  34318. 57014
  34319. 4
  34320. 5
  34321. 1
  34322. 55869
  34323. 2
  34324. secure
  34325. 1
  34326. 49551
  34327. 1
  34328. 29557
  34329. 1
  34330. 57014
  34331. 4
  34332. 5
  34333. 1
  34334. 55869
  34335. 2
  34336. arm
  34337. 1
  34338. 49551
  34339. 1
  34340. 29557
  34341. 1
  34342. 57014
  34343. 4
  34344. 5
  34345. 1
  34346. 55869
  34347. 2
  34348. press
  34349. 1
  34350. 49551
  34351. 1
  34352. 29557
  34353. 1
  34354. 57014
  34355. 4
  34356. 7
  34357. 4
  34358. 5
  34359. 1
  34360. 53702
  34361. 2
  34362. tell_lines
  34363. 1
  34364. 2487
  34365. 1
  34366. 6
  34367. 1
  34368. 53702
  34369. 4
  34370. 5
  34371. 1
  34372. 42348
  34373. 2
  34374. secure
  34375. 1
  34376. 49551
  34377. 1
  34378. 29557
  34379. 1
  34380. 53702
  34381. 4
  34382. 5
  34383. 1
  34384. 42348
  34385. 2
  34386. arm
  34387. 1
  34388. 49551
  34389. 1
  34390. 29557
  34391. 1
  34392. 53702
  34393. 4
  34394. 5
  34395. 1
  34396. 42348
  34397. 2
  34398. say_parse
  34399. 1
  34400. 49551
  34401. 1
  34402. 29557
  34403. 1
  34404. 53702
  34405. 4
  34406. 5
  34407. 1
  34408. 42348
  34409. 2
  34410. announce
  34411. 1
  34412. 49551
  34413. 1
  34414. 29557
  34415. 1
  34416. 53702
  34417. 4
  34418. 5
  34419. 1
  34420. 42348
  34421. 2
  34422. announce
  34423. 1
  34424. 48961
  34425. 1
  34426. 39357
  34427. 1
  34428. 53702
  34429. 4
  34430. 5
  34431. 1
  34432. 53702
  34433. 2
  34434. say
  34435. 1
  34436. 57140
  34437. 1
  34438. 49900
  34439. 1
  34440. 53702
  34441. 4
  34442. 8
  34443. 4
  34444. 5
  34445. 1
  34446. 53484
  34447. 2
  34448. tell_lines
  34449. 1
  34450. 2487
  34451. 1
  34452. 6
  34453. 1
  34454. 53484
  34455. 4
  34456. 5
  34457. 1
  34458. 36284
  34459. 2
  34460. @dox
  34461. 1
  34462. 19845
  34463. 1
  34464. 36284
  34465. 1
  34466. 53484
  34467. 4
  34468. 5
  34469. 1
  34470. 53484
  34471. 2
  34472. my_huh
  34473. 1
  34474. 53484
  34475. 1
  34476. 6
  34477. 1
  34478. 53484
  34479. 4
  34480. 5
  34481. 1
  34482. 53484
  34483. 2
  34484. my_huh
  34485. 1
  34486. 78
  34487. 1
  34488. 7069
  34489. 1
  34490. 53484
  34491. 4
  34492. 5
  34493. 1
  34494. 53484
  34495. 2
  34496. my_huh
  34497. 1
  34498. 24442
  34499. 1
  34500. 26026
  34501. 1
  34502. 53484
  34503. 4
  34504. 5
  34505. 1
  34506. 53484
  34507. 2
  34508. my_huh
  34509. 1
  34510. 57140
  34511. 1
  34512. 49900
  34513. 1
  34514. 53484
  34515. 4
  34516. 5
  34517. 1
  34518. 219
  34519. 2
  34520. do_huh
  34521. 1
  34522. 53484
  34523. 1
  34524. 219
  34525. 1
  34526. 53484
  34527. 4
  34528. 5
  34529. 1
  34530. 39091
  34531. 2
  34532. @dox
  34533. 1
  34534. 53484
  34535. 1
  34536. 1
  34537. 1
  34538. 53484
  34539. 4
  34540. 7
  34541. 4
  34542. 5
  34543. 1
  34544. 57882
  34545. 2
  34546. tell_lines
  34547. 1
  34548. 2487
  34549. 1
  34550. 6
  34551. 1
  34552. 57882
  34553. 4
  34554. 5
  34555. 1
  34556. 57882
  34557. 2
  34558. receive_page
  34559. 1
  34560. 2487
  34561. 1
  34562. 6
  34563. 1
  34564. 57882
  34565. 4
  34566. 5
  34567. 1
  34568. 57882
  34569. 2
  34570. receive_page
  34571. 1
  34572. 47
  34573. 1
  34574. 3133
  34575. 1
  34576. 57882
  34577. 4
  34578. 5
  34579. 1
  34580. 57882
  34581. 2
  34582. receive_page
  34583. 1
  34584. 2487
  34585. 1
  34586. 7069
  34587. 1
  34588. 57882
  34589. 4
  34590. 5
  34591. 1
  34592. -1
  34593. 2
  34594.  
  34595. 1
  34596. 57882
  34597. 1
  34598. -1
  34599. 1
  34600. 57882
  34601. 4
  34602. 5
  34603. 1
  34604. 57882
  34605. 2
  34606. eval_cmd_string
  34607. 1
  34608. 57882
  34609. 1
  34610. 217
  34611. 1
  34612. 57882
  34613. 4
  34614. 5
  34615. 1
  34616. 57882
  34617. 2
  34618. eval
  34619. 1
  34620. 57882
  34621. 1
  34622. 217
  34623. 1
  34624. 57882
  34625. 4
  34626. 7
  34627. 4
  34628. 5
  34629. 1
  34630. 57882
  34631. 2
  34632. tell_lines
  34633. 1
  34634. 2487
  34635. 1
  34636. 6
  34637. 1
  34638. 57882
  34639. 4
  34640. 5
  34641. 1
  34642. 57882
  34643. 2
  34644. receive_page
  34645. 1
  34646. 2487
  34647. 1
  34648. 6
  34649. 1
  34650. 57882
  34651. 4
  34652. 5
  34653. 1
  34654. 57882
  34655. 2
  34656. receive_page
  34657. 1
  34658. 47
  34659. 1
  34660. 3133
  34661. 1
  34662. 57882
  34663. 4
  34664. 5
  34665. 1
  34666. 57882
  34667. 2
  34668. receive_page
  34669. 1
  34670. 2487
  34671. 1
  34672. 7069
  34673. 1
  34674. 57882
  34675. 4
  34676. 5
  34677. 1
  34678. -1
  34679. 2
  34680.  
  34681. 1
  34682. 57882
  34683. 1
  34684. -1
  34685. 1
  34686. 57882
  34687. 4
  34688. 5
  34689. 1
  34690. 57882
  34691. 2
  34692. eval_cmd_string
  34693. 1
  34694. 57882
  34695. 1
  34696. 217
  34697. 1
  34698. 57882
  34699. 4
  34700. 5
  34701. 1
  34702. 57882
  34703. 2
  34704. eval
  34705. 1
  34706. 57882
  34707. 1
  34708. 217
  34709. 1
  34710. 57882
  34711. 4
  34712. 4
  34713. 4
  34714. 5
  34715. 1
  34716. 13412
  34717. 2
  34718. tell_lines
  34719. 1
  34720. 2487
  34721. 1
  34722. 6
  34723. 1
  34724. 13412
  34725. 4
  34726. 5
  34727. 1
  34728. 42109
  34729. 2
  34730. do_events
  34731. 1
  34732. 13412
  34733. 1
  34734. 42109
  34735. 1
  34736. 13412
  34737. 4
  34738. 5
  34739. 1
  34740. 42109
  34741. 2
  34742. schedule_event
  34743. 1
  34744. 13412
  34745. 1
  34746. 42109
  34747. 1
  34748. 13412
  34749. 4
  34750. 5
  34751. 1
  34752. 42109
  34753. 2
  34754. start
  34755. 1
  34756. 13412
  34757. 1
  34758. 42109
  34759. 1
  34760. 13412
  34761. 4
  34762. 7
  34763. 4
  34764. 5
  34765. 1
  34766. 49551
  34767. 2
  34768. tell_lines
  34769. 1
  34770. 2487
  34771. 1
  34772. 6
  34773. 1
  34774. 55988
  34775. 4
  34776. 5
  34777. 1
  34778. 24380
  34779. 2
  34780. enterfunc
  34781. 1
  34782. 49551
  34783. 1
  34784. 29557
  34785. 1
  34786. 55988
  34787. 4
  34788. 5
  34789. 1
  34790. 55988
  34791. 2
  34792. moveto
  34793. 1
  34794. 55988
  34795. 1
  34796. 1
  34797. 1
  34798. 55988
  34799. 4
  34800. 5
  34801. 1
  34802. 55988
  34803. 2
  34804. moveto
  34805. 1
  34806. 47
  34807. 1
  34808. 6
  34809. 1
  34810. 55988
  34811. 4
  34812. 5
  34813. 1
  34814. 55988
  34815. 2
  34816. moveto
  34817. 1
  34818. 47
  34819. 1
  34820. 3133
  34821. 1
  34822. 55988
  34823. 4
  34824. 5
  34825. 1
  34826. 33355
  34827. 2
  34828. leave
  34829. 1
  34830. 4290
  34831. 1
  34832. 6145
  34833. 1
  34834. 55988
  34835. 4
  34836. 5
  34837. 1
  34838. 33355
  34839. 2
  34840. leave
  34841. 1
  34842. 24436
  34843. 1
  34844. 26152
  34845. 1
  34846. 55988
  34847. 4
  34848. 12
  34849. 4
  34850. 5
  34851. 1
  34852. 49551
  34853. 2
  34854. tell_lines
  34855. 1
  34856. 2487
  34857. 1
  34858. 6
  34859. 1
  34860. 56720
  34861. 4
  34862. 5
  34863. 1
  34864. 13507
  34865. 2
  34866. enterfunc
  34867. 1
  34868. 49551
  34869. 1
  34870. 29557
  34871. 1
  34872. 56720
  34873. 4
  34874. 5
  34875. 1
  34876. 13507
  34877. 2
  34878. enterfunc
  34879. 1
  34880. 50053
  34881. 1
  34882. 13507
  34883. 1
  34884. 56720
  34885. 4
  34886. 5
  34887. 1
  34888. 56720
  34889. 2
  34890. moveto
  34891. 1
  34892. 56720
  34893. 1
  34894. 1
  34895. 1
  34896. 56720
  34897. 4
  34898. 5
  34899. 1
  34900. 56720
  34901. 2
  34902. moveto
  34903. 1
  34904. 47
  34905. 1
  34906. 6
  34907. 1
  34908. 56720
  34909. 4
  34910. 5
  34911. 1
  34912. 56720
  34913. 2
  34914. moveto
  34915. 1
  34916. 47
  34917. 1
  34918. 3133
  34919. 1
  34920. 56720
  34921. 4
  34922. 5
  34923. 1
  34924. 56720
  34925. 2
  34926. moveto
  34927. 1
  34928. 78
  34929. 1
  34930. 7069
  34931. 1
  34932. 56720
  34933. 4
  34934. 5
  34935. 1
  34936. 56720
  34937. 2
  34938. moveto
  34939. 1
  34940. 3685
  34941. 1
  34942. 8855
  34943. 1
  34944. 56720
  34945. 4
  34946. 5
  34947. 1
  34948. 56720
  34949. 2
  34950. moveto
  34951. 1
  34952. 57140
  34953. 1
  34954. 49900
  34955. 1
  34956. 56720
  34957. 4
  34958. 5
  34959. 1
  34960. 56720
  34961. 2
  34962. moveto
  34963. 1
  34964. 19845
  34965. 1
  34966. 5409
  34967. 1
  34968. 56720
  34969. 4
  34970. 5
  34971. 1
  34972. 11001
  34973. 2
  34974. out
  34975. 1
  34976. 4290
  34977. 1
  34978. 6145
  34979. 1
  34980. 56720
  34981. 4
  34982. 5
  34983. 1
  34984. 11001
  34985. 2
  34986. out
  34987. 1
  34988. 24436
  34989. 1
  34990. 26152
  34991. 1
  34992. 56720
  34993. 4
  34994. 7
  34995. 4
  34996. 5
  34997. 1
  34998. 49551
  34999. 2
  35000. tell_lines
  35001. 1
  35002. 2487
  35003. 1
  35004. 6
  35005. 1
  35006. 55988
  35007. 4
  35008. 5
  35009. 1
  35010. 24380
  35011. 2
  35012. enterfunc
  35013. 1
  35014. 49551
  35015. 1
  35016. 29557
  35017. 1
  35018. 55988
  35019. 4
  35020. 5
  35021. 1
  35022. 55988
  35023. 2
  35024. moveto
  35025. 1
  35026. 55988
  35027. 1
  35028. 1
  35029. 1
  35030. 55988
  35031. 4
  35032. 5
  35033. 1
  35034. 55988
  35035. 2
  35036. moveto
  35037. 1
  35038. 47
  35039. 1
  35040. 6
  35041. 1
  35042. 55988
  35043. 4
  35044. 5
  35045. 1
  35046. 55988
  35047. 2
  35048. moveto
  35049. 1
  35050. 47
  35051. 1
  35052. 3133
  35053. 1
  35054. 55988
  35055. 4
  35056. 5
  35057. 1
  35058. 56183
  35059. 2
  35060. leave
  35061. 1
  35062. 4290
  35063. 1
  35064. 6145
  35065. 1
  35066. 55988
  35067. 4
  35068. 5
  35069. 1
  35070. 56183
  35071. 2
  35072. leave
  35073. 1
  35074. 24436
  35075. 1
  35076. 26152
  35077. 1
  35078. 55988
  35079. 4
  35080. 8
  35081. 4
  35082. 5
  35083. 1
  35084. 49551
  35085. 2
  35086. tell_lines
  35087. 1
  35088. 2487
  35089. 1
  35090. 6
  35091. 1
  35092. 55988
  35093. 4
  35094. 5
  35095. 1
  35096. 45676
  35097. 2
  35098. enterfunc
  35099. 1
  35100. 49551
  35101. 1
  35102. 29557
  35103. 1
  35104. 55988
  35105. 4
  35106. 5
  35107. 1
  35108. 55988
  35109. 2
  35110. moveto
  35111. 1
  35112. 55988
  35113. 1
  35114. 1
  35115. 1
  35116. 55988
  35117. 4
  35118. 5
  35119. 1
  35120. 55988
  35121. 2
  35122. moveto
  35123. 1
  35124. 47
  35125. 1
  35126. 6
  35127. 1
  35128. 55988
  35129. 4
  35130. 5
  35131. 1
  35132. 55988
  35133. 2
  35134. moveto
  35135. 1
  35136. 47
  35137. 1
  35138. 3133
  35139. 1
  35140. 55988
  35141. 4
  35142. 5
  35143. 1
  35144. 22213
  35145. 2
  35146. move
  35147. 1
  35148. 2
  35149. 1
  35150. 7
  35151. 1
  35152. 55988
  35153. 4
  35154. 5
  35155. 1
  35156. 22213
  35157. 2
  35158. invoke
  35159. 1
  35160. 2
  35161. 1
  35162. 7
  35163. 1
  35164. 55988
  35165. 4
  35166. 5
  35167. 1
  35168. 24380
  35169. 2
  35170. e
  35171. 1
  35172. 2
  35173. 1
  35174. 3
  35175. 1
  35176. 55988
  35177. 4
  35178. 10
  35179. 4
  35180. 5
  35181. 1
  35182. 49551
  35183. 2
  35184. tell_lines
  35185. 1
  35186. 2487
  35187. 1
  35188. 6
  35189. 1
  35190. 49551
  35191. 4
  35192. 5
  35193. 1
  35194. 13507
  35195. 2
  35196. enterfunc
  35197. 1
  35198. 49551
  35199. 1
  35200. 29557
  35201. 1
  35202. 49551
  35203. 4
  35204. 5
  35205. 1
  35206. 13507
  35207. 2
  35208. enterfunc
  35209. 1
  35210. 50053
  35211. 1
  35212. 13507
  35213. 1
  35214. 49551
  35215. 4
  35216. 5
  35217. 1
  35218. 49551
  35219. 2
  35220. moveto
  35221. 1
  35222. 49551
  35223. 1
  35224. 1
  35225. 1
  35226. 49551
  35227. 4
  35228. 5
  35229. 1
  35230. 49551
  35231. 2
  35232. moveto
  35233. 1
  35234. 47
  35235. 1
  35236. 6
  35237. 1
  35238. 49551
  35239. 4
  35240. 5
  35241. 1
  35242. 49551
  35243. 2
  35244. moveto
  35245. 1
  35246. 47
  35247. 1
  35248. 3133
  35249. 1
  35250. 49551
  35251. 4
  35252. 5
  35253. 1
  35254. 49551
  35255. 2
  35256. moveto
  35257. 1
  35258. 78
  35259. 1
  35260. 7069
  35261. 1
  35262. 49551
  35263. 4
  35264. 5
  35265. 1
  35266. 49551
  35267. 2
  35268. moveto
  35269. 1
  35270. 3685
  35271. 1
  35272. 8855
  35273. 1
  35274. 49551
  35275. 4
  35276. 5
  35277. 1
  35278. 49551
  35279. 2
  35280. moveto
  35281. 1
  35282. 57140
  35283. 1
  35284. 49900
  35285. 1
  35286. 49551
  35287. 4
  35288. 5
  35289. 1
  35290. 5443
  35291. 2
  35292. q
  35293. 1
  35294. 6336
  35295. 1
  35296. 5400
  35297. 1
  35298. 49551
  35299. 4
  35300. 8
  35301. 4
  35302. 5
  35303. 1
  35304. 49551
  35305. 2
  35306. tell_lines
  35307. 1
  35308. 2487
  35309. 1
  35310. 6
  35311. 1
  35312. 55988
  35313. 4
  35314. 5
  35315. 1
  35316. 24380
  35317. 2
  35318. enterfunc
  35319. 1
  35320. 49551
  35321. 1
  35322. 29557
  35323. 1
  35324. 55988
  35325. 4
  35326. 5
  35327. 1
  35328. 55988
  35329. 2
  35330. moveto
  35331. 1
  35332. 55988
  35333. 1
  35334. 1
  35335. 1
  35336. 55988
  35337. 4
  35338. 5
  35339. 1
  35340. 55988
  35341. 2
  35342. moveto
  35343. 1
  35344. 47
  35345. 1
  35346. 6
  35347. 1
  35348. 55988
  35349. 4
  35350. 5
  35351. 1
  35352. 55988
  35353. 2
  35354. moveto
  35355. 1
  35356. 47
  35357. 1
  35358. 3133
  35359. 1
  35360. 55988
  35361. 4
  35362. 5
  35363. 1
  35364. 31277
  35365. 2
  35366. move
  35367. 1
  35368. 2
  35369. 1
  35370. 7
  35371. 1
  35372. 55988
  35373. 4
  35374. 5
  35375. 1
  35376. 31277
  35377. 2
  35378. invoke
  35379. 1
  35380. 2
  35381. 1
  35382. 7
  35383. 1
  35384. 55988
  35385. 4
  35386. 5
  35387. 1
  35388. 45676
  35389. 2
  35390. w
  35391. 1
  35392. 2
  35393. 1
  35394. 3
  35395. 1
  35396. 55988
  35397. 4
  35398. 9
  35399. 4
  35400. 5
  35401. 1
  35402. 49551
  35403. 2
  35404. tell_lines
  35405. 1
  35406. 2487
  35407. 1
  35408. 6
  35409. 1
  35410. 55988
  35411. 4
  35412. 5
  35413. 1
  35414. 13507
  35415. 2
  35416. enterfunc
  35417. 1
  35418. 49551
  35419. 1
  35420. 29557
  35421. 1
  35422. 55988
  35423. 4
  35424. 5
  35425. 1
  35426. 13507
  35427. 2
  35428. enterfunc
  35429. 1
  35430. 50053
  35431. 1
  35432. 13507
  35433. 1
  35434. 55988
  35435. 4
  35436. 5
  35437. 1
  35438. 55988
  35439. 2
  35440. moveto
  35441. 1
  35442. 55988
  35443. 1
  35444. 1
  35445. 1
  35446. 55988
  35447. 4
  35448. 5
  35449. 1
  35450. 55988
  35451. 2
  35452. moveto
  35453. 1
  35454. 47
  35455. 1
  35456. 6
  35457. 1
  35458. 55988
  35459. 4
  35460. 5
  35461. 1
  35462. 55988
  35463. 2
  35464. moveto
  35465. 1
  35466. 47
  35467. 1
  35468. 3133
  35469. 1
  35470. 55988
  35471. 4
  35472. 5
  35473. 1
  35474. 54185
  35475. 2
  35476. move
  35477. 1
  35478. 2
  35479. 1
  35480. 7
  35481. 1
  35482. 55988
  35483. 4
  35484. 5
  35485. 1
  35486. 54185
  35487. 2
  35488. invoke
  35489. 1
  35490. 2
  35491. 1
  35492. 7
  35493. 1
  35494. 55988
  35495. 4
  35496. 5
  35497. 1
  35498. 24380
  35499. 2
  35500. n
  35501. 1
  35502. 2
  35503. 1
  35504. 3
  35505. 1
  35506. 55988
  35507. 4
  35508. 8
  35509. 4
  35510. 5
  35511. 1
  35512. 49551
  35513. 2
  35514. tell_lines
  35515. 1
  35516. 2487
  35517. 1
  35518. 6
  35519. 1
  35520. 55988
  35521. 4
  35522. 5
  35523. 1
  35524. 13507
  35525. 2
  35526. enterfunc
  35527. 1
  35528. 49551
  35529. 1
  35530. 29557
  35531. 1
  35532. 55988
  35533. 4
  35534. 5
  35535. 1
  35536. 13507
  35537. 2
  35538. enterfunc
  35539. 1
  35540. 50053
  35541. 1
  35542. 13507
  35543. 1
  35544. 55988
  35545. 4
  35546. 5
  35547. 1
  35548. 56183
  35549. 2
  35550. moveto
  35551. 1
  35552. 55988
  35553. 1
  35554. 1
  35555. 1
  35556. 55988
  35557. 4
  35558. 5
  35559. 1
  35560. 56183
  35561. 2
  35562. moveto
  35563. 1
  35564. 6349
  35565. 1
  35566. 3
  35567. 1
  35568. 55988
  35569. 4
  35570. 5
  35571. 1
  35572. 56183
  35573. 2
  35574. moveto
  35575. 1
  35576. 4290
  35577. 1
  35578. 6145
  35579. 1
  35580. 55988
  35581. 4
  35582. 5
  35583. 1
  35584. 56183
  35585. 2
  35586. moveto
  35587. 1
  35588. 24436
  35589. 1
  35590. 26152
  35591. 1
  35592. 55988
  35593. 4
  35594. 5
  35595. 1
  35596. 56183
  35597. 2
  35598. drop
  35599. 1
  35600. 4290
  35601. 1
  35602. 6145
  35603. 1
  35604. 55988
  35605. 4
  35606. 8
  35607. 4
  35608. 5
  35609. 1
  35610. 49551
  35611. 2
  35612. tell_lines
  35613. 1
  35614. 2487
  35615. 1
  35616. 6
  35617. 1
  35618. 55988
  35619. 4
  35620. 5
  35621. 1
  35622. 13507
  35623. 2
  35624. enterfunc
  35625. 1
  35626. 49551
  35627. 1
  35628. 29557
  35629. 1
  35630. 55988
  35631. 4
  35632. 5
  35633. 1
  35634. 13507
  35635. 2
  35636. enterfunc
  35637. 1
  35638. 50053
  35639. 1
  35640. 13507
  35641. 1
  35642. 55988
  35643. 4
  35644. 5
  35645. 1
  35646. 55988
  35647. 2
  35648. moveto
  35649. 1
  35650. 55988
  35651. 1
  35652. 1
  35653. 1
  35654. 55988
  35655. 4
  35656. 5
  35657. 1
  35658. 55988
  35659. 2
  35660. moveto
  35661. 1
  35662. 47
  35663. 1
  35664. 6
  35665. 1
  35666. 55988
  35667. 4
  35668. 5
  35669. 1
  35670. 55988
  35671. 2
  35672. moveto
  35673. 1
  35674. 47
  35675. 1
  35676. 3133
  35677. 1
  35678. 55988
  35679. 4
  35680. 5
  35681. 1
  35682. 56183
  35683. 2
  35684. leave
  35685. 1
  35686. 4290
  35687. 1
  35688. 6145
  35689. 1
  35690. 55988
  35691. 4
  35692. 5
  35693. 1
  35694. 56183
  35695. 2
  35696. leave
  35697. 1
  35698. 24436
  35699. 1
  35700. 26152
  35701. 1
  35702. 55988
  35703. 4
  35704. 10
  35705. 4
  35706. 5
  35707. 1
  35708. 49551
  35709. 2
  35710. tell_lines
  35711. 1
  35712. 2487
  35713. 1
  35714. 6
  35715. 1
  35716. 56310
  35717. 4
  35718. 5
  35719. 1
  35720. 23829
  35721. 2
  35722. enterfunc
  35723. 1
  35724. 49551
  35725. 1
  35726. 29557
  35727. 1
  35728. 56310
  35729. 4
  35730. 5
  35731. 1
  35732. 56310
  35733. 2
  35734. moveto
  35735. 1
  35736. 56310
  35737. 1
  35738. 1
  35739. 1
  35740. 56310
  35741. 4
  35742. 5
  35743. 1
  35744. 56310
  35745. 2
  35746. moveto
  35747. 1
  35748. 47
  35749. 1
  35750. 6
  35751. 1
  35752. 56310
  35753. 4
  35754. 5
  35755. 1
  35756. 56310
  35757. 2
  35758. moveto
  35759. 1
  35760. 47
  35761. 1
  35762. 3133
  35763. 1
  35764. 56310
  35765. 4
  35766. 5
  35767. 1
  35768. 56310
  35769. 2
  35770. moveto
  35771. 1
  35772. 78
  35773. 1
  35774. 7069
  35775. 1
  35776. 56310
  35777. 4
  35778. 5
  35779. 1
  35780. 56310
  35781. 2
  35782. moveto
  35783. 1
  35784. 3685
  35785. 1
  35786. 8855
  35787. 1
  35788. 56310
  35789. 4
  35790. 5
  35791. 1
  35792. 56310
  35793. 2
  35794. teleport
  35795. 1
  35796. 47
  35797. 1
  35798. 3133
  35799. 1
  35800. 56310
  35801. 4
  35802. 5
  35803. 1
  35804. 56310
  35805. 2
  35806. teleport
  35807. 1
  35808. 3920
  35809. 1
  35810. 33337
  35811. 1
  35812. 56310
  35813. 4
  35814. 5
  35815. 1
  35816. 56310
  35817. 2
  35818. @join
  35819. 1
  35820. 47
  35821. 1
  35822. 3133
  35823. 1
  35824. 56310
  35825. 4
  35826. 10
  35827. 4
  35828. 5
  35829. 1
  35830. 49551
  35831. 2
  35832. tell_lines
  35833. 1
  35834. 2487
  35835. 1
  35836. 6
  35837. 1
  35838. 49551
  35839. 4
  35840. 5
  35841. 1
  35842. 13507
  35843. 2
  35844. enterfunc
  35845. 1
  35846. 49551
  35847. 1
  35848. 29557
  35849. 1
  35850. 49551
  35851. 4
  35852. 5
  35853. 1
  35854. 13507
  35855. 2
  35856. enterfunc
  35857. 1
  35858. 50053
  35859. 1
  35860. 13507
  35861. 1
  35862. 49551
  35863. 4
  35864. 5
  35865. 1
  35866. 49551
  35867. 2
  35868. moveto
  35869. 1
  35870. 49551
  35871. 1
  35872. 1
  35873. 1
  35874. 49551
  35875. 4
  35876. 5
  35877. 1
  35878. 49551
  35879. 2
  35880. moveto
  35881. 1
  35882. 47
  35883. 1
  35884. 6
  35885. 1
  35886. 49551
  35887. 4
  35888. 5
  35889. 1
  35890. 49551
  35891. 2
  35892. moveto
  35893. 1
  35894. 47
  35895. 1
  35896. 3133
  35897. 1
  35898. 49551
  35899. 4
  35900. 5
  35901. 1
  35902. 49551
  35903. 2
  35904. moveto
  35905. 1
  35906. 78
  35907. 1
  35908. 7069
  35909. 1
  35910. 49551
  35911. 4
  35912. 5
  35913. 1
  35914. 49551
  35915. 2
  35916. moveto
  35917. 1
  35918. 3685
  35919. 1
  35920. 8855
  35921. 1
  35922. 49551
  35923. 4
  35924. 5
  35925. 1
  35926. 49551
  35927. 2
  35928. moveto
  35929. 1
  35930. 57140
  35931. 1
  35932. 49900
  35933. 1
  35934. 49551
  35935. 4
  35936. 5
  35937. 1
  35938. 5443
  35939. 2
  35940. q
  35941. 1
  35942. 6336
  35943. 1
  35944. 5400
  35945. 1
  35946. 49551
  35947. 4
  35948. 12
  35949. 4
  35950. 5
  35951. 1
  35952. 49551
  35953. 2
  35954. tell_lines
  35955. 1
  35956. 2487
  35957. 1
  35958. 6
  35959. 1
  35960. 54787
  35961. 4
  35962. 5
  35963. 1
  35964. 13507
  35965. 2
  35966. enterfunc
  35967. 1
  35968. 49551
  35969. 1
  35970. 29557
  35971. 1
  35972. 54787
  35973. 4
  35974. 5
  35975. 1
  35976. 13507
  35977. 2
  35978. enterfunc
  35979. 1
  35980. 50053
  35981. 1
  35982. 13507
  35983. 1
  35984. 54787
  35985. 4
  35986. 5
  35987. 1
  35988. 54787
  35989. 2
  35990. moveto
  35991. 1
  35992. 54787
  35993. 1
  35994. 1
  35995. 1
  35996. 54787
  35997. 4
  35998. 5
  35999. 1
  36000. 54787
  36001. 2
  36002. moveto
  36003. 1
  36004. 47
  36005. 1
  36006. 6
  36007. 1
  36008. 54787
  36009. 4
  36010. 5
  36011. 1
  36012. 54787
  36013. 2
  36014. moveto
  36015. 1
  36016. 47
  36017. 1
  36018. 3133
  36019. 1
  36020. 54787
  36021. 4
  36022. 5
  36023. 1
  36024. 54787
  36025. 2
  36026. moveto
  36027. 1
  36028. 78
  36029. 1
  36030. 7069
  36031. 1
  36032. 54787
  36033. 4
  36034. 5
  36035. 1
  36036. 54787
  36037. 2
  36038. moveto
  36039. 1
  36040. 3685
  36041. 1
  36042. 8855
  36043. 1
  36044. 54787
  36045. 4
  36046. 5
  36047. 1
  36048. 54787
  36049. 2
  36050. moveto
  36051. 1
  36052. 57140
  36053. 1
  36054. 49900
  36055. 1
  36056. 54787
  36057. 4
  36058. 5
  36059. 1
  36060. 54787
  36061. 2
  36062. moveto
  36063. 1
  36064. 19845
  36065. 1
  36066. 5409
  36067. 1
  36068. 54787
  36069. 4
  36070. 5
  36071. 1
  36072. 54560
  36073. 2
  36074. exit
  36075. 1
  36076. 4290
  36077. 1
  36078. 6145
  36079. 1
  36080. 54787
  36081. 4
  36082. 5
  36083. 1
  36084. 54560
  36085. 2
  36086. exit
  36087. 1
  36088. 24436
  36089. 1
  36090. 26152
  36091. 1
  36092. 54787
  36093. 4
  36094. 10
  36095. 4
  36096. 5
  36097. 1
  36098. 49551
  36099. 2
  36100. tell_lines
  36101. 1
  36102. 2487
  36103. 1
  36104. 6
  36105. 1
  36106. 50204
  36107. 4
  36108. 5
  36109. 1
  36110. 25972
  36111. 2
  36112. enterfunc
  36113. 1
  36114. 49551
  36115. 1
  36116. 29557
  36117. 1
  36118. 50204
  36119. 4
  36120. 5
  36121. 1
  36122. 50204
  36123. 2
  36124. moveto
  36125. 1
  36126. 50204
  36127. 1
  36128. 1
  36129. 1
  36130. 50204
  36131. 4
  36132. 5
  36133. 1
  36134. 50204
  36135. 2
  36136. moveto
  36137. 1
  36138. 47
  36139. 1
  36140. 6
  36141. 1
  36142. 50204
  36143. 4
  36144. 5
  36145. 1
  36146. 50204
  36147. 2
  36148. moveto
  36149. 1
  36150. 47
  36151. 1
  36152. 3133
  36153. 1
  36154. 50204
  36155. 4
  36156. 5
  36157. 1
  36158. 50204
  36159. 2
  36160. moveto
  36161. 1
  36162. 78
  36163. 1
  36164. 7069
  36165. 1
  36166. 50204
  36167. 4
  36168. 5
  36169. 1
  36170. 50204
  36171. 2
  36172. moveto
  36173. 1
  36174. 3685
  36175. 1
  36176. 8855
  36177. 1
  36178. 50204
  36179. 4
  36180. 5
  36181. 1
  36182. 50204
  36183. 2
  36184. moveto
  36185. 1
  36186. 50204
  36187. 1
  36188. 50204
  36189. 1
  36190. 50204
  36191. 4
  36192. 5
  36193. 1
  36194. 5746
  36195. 2
  36196. done
  36197. 1
  36198. 6336
  36199. 1
  36200. 5400
  36201. 1
  36202. 50204
  36203. 4
  36204. 5
  36205. 1
  36206. 5746
  36207. 2
  36208. send
  36209. 1
  36210. 6349
  36211. 1
  36212. 5746
  36213. 1
  36214. 50204
  36215. 4
  36216. 10
  36217. 4
  36218. 5
  36219. 1
  36220. 49551
  36221. 2
  36222. tell_lines
  36223. 1
  36224. 2487
  36225. 1
  36226. 6
  36227. 1
  36228. 50176
  36229. 4
  36230. 5
  36231. 1
  36232. 51186
  36233. 2
  36234. enterfunc
  36235. 1
  36236. 49551
  36237. 1
  36238. 29557
  36239. 1
  36240. 50176
  36241. 4
  36242. 5
  36243. 1
  36244. 50176
  36245. 2
  36246. moveto
  36247. 1
  36248. 50176
  36249. 1
  36250. 1
  36251. 1
  36252. 50176
  36253. 4
  36254. 5
  36255. 1
  36256. 50176
  36257. 2
  36258. moveto
  36259. 1
  36260. 47
  36261. 1
  36262. 6
  36263. 1
  36264. 50176
  36265. 4
  36266. 5
  36267. 1
  36268. 50176
  36269. 2
  36270. moveto
  36271. 1
  36272. 47
  36273. 1
  36274. 3133
  36275. 1
  36276. 50176
  36277. 4
  36278. 5
  36279. 1
  36280. 50176
  36281. 2
  36282. moveto
  36283. 1
  36284. 78
  36285. 1
  36286. 7069
  36287. 1
  36288. 50176
  36289. 4
  36290. 5
  36291. 1
  36292. 50176
  36293. 2
  36294. moveto
  36295. 1
  36296. 3685
  36297. 1
  36298. 8855
  36299. 1
  36300. 50176
  36301. 4
  36302. 5
  36303. 1
  36304. 50176
  36305. 2
  36306. moveto
  36307. 1
  36308. 57140
  36309. 1
  36310. 49900
  36311. 1
  36312. 50176
  36313. 4
  36314. 5
  36315. 1
  36316. 50176
  36317. 2
  36318. moveto
  36319. 1
  36320. 50176
  36321. 1
  36322. 50176
  36323. 1
  36324. 50176
  36325. 4
  36326. 5
  36327. 1
  36328. 50176
  36329. 2
  36330. home
  36331. 1
  36332. 57140
  36333. 1
  36334. 49900
  36335. 1
  36336. 50176
  36337. 4
  36338. 11
  36339. 4
  36340. 5
  36341. 1
  36342. 49551
  36343. 2
  36344. tell_lines
  36345. 1
  36346. 2487
  36347. 1
  36348. 6
  36349. 1
  36350. 54099
  36351. 4
  36352. 5
  36353. 1
  36354. 30054
  36355. 2
  36356. enterfunc
  36357. 1
  36358. 49551
  36359. 1
  36360. 29557
  36361. 1
  36362. 54099
  36363. 4
  36364. 5
  36365. 1
  36366. 54099
  36367. 2
  36368. moveto
  36369. 1
  36370. 54099
  36371. 1
  36372. 1
  36373. 1
  36374. 54099
  36375. 4
  36376. 5
  36377. 1
  36378. 54099
  36379. 2
  36380. moveto
  36381. 1
  36382. 47
  36383. 1
  36384. 6
  36385. 1
  36386. 54099
  36387. 4
  36388. 5
  36389. 1
  36390. 54099
  36391. 2
  36392. moveto
  36393. 1
  36394. 47
  36395. 1
  36396. 3133
  36397. 1
  36398. 54099
  36399. 4
  36400. 5
  36401. 1
  36402. 54099
  36403. 2
  36404. moveto
  36405. 1
  36406. 78
  36407. 1
  36408. 7069
  36409. 1
  36410. 54099
  36411. 4
  36412. 5
  36413. 1
  36414. 54099
  36415. 2
  36416. moveto
  36417. 1
  36418. 3685
  36419. 1
  36420. 8855
  36421. 1
  36422. 54099
  36423. 4
  36424. 5
  36425. 1
  36426. 54099
  36427. 2
  36428. moveto
  36429. 1
  36430. 57140
  36431. 1
  36432. 49900
  36433. 1
  36434. 54099
  36435. 4
  36436. 5
  36437. 1
  36438. 54099
  36439. 2
  36440. moveto
  36441. 1
  36442. 19845
  36443. 1
  36444. 5409
  36445. 1
  36446. 54099
  36447. 4
  36448. 5
  36449. 1
  36450. 54099
  36451. 2
  36452. moveto
  36453. 1
  36454. 54099
  36455. 1
  36456. 54099
  36457. 1
  36458. 54099
  36459. 4
  36460. 5
  36461. 1
  36462. 54099
  36463. 2
  36464. home
  36465. 1
  36466. 57140
  36467. 1
  36468. 49900
  36469. 1
  36470. 54099
  36471. 4
  36472. 9
  36473. 4
  36474. 5
  36475. 1
  36476. 49551
  36477. 2
  36478. tell_lines
  36479. 1
  36480. 2487
  36481. 1
  36482. 6
  36483. 1
  36484. 54787
  36485. 4
  36486. 5
  36487. 1
  36488. 35428
  36489. 2
  36490. enterfunc
  36491. 1
  36492. 49551
  36493. 1
  36494. 29557
  36495. 1
  36496. 54787
  36497. 4
  36498. 5
  36499. 1
  36500. 54560
  36501. 2
  36502. moveto
  36503. 1
  36504. 54787
  36505. 1
  36506. 1
  36507. 1
  36508. 54787
  36509. 4
  36510. 5
  36511. 1
  36512. 54560
  36513. 2
  36514. moveto
  36515. 1
  36516. 6349
  36517. 1
  36518. 3
  36519. 1
  36520. 54787
  36521. 4
  36522. 5
  36523. 1
  36524. 54560
  36525. 2
  36526. moveto
  36527. 1
  36528. 4290
  36529. 1
  36530. 6145
  36531. 1
  36532. 54787
  36533. 4
  36534. 5
  36535. 1
  36536. 54560
  36537. 2
  36538. moveto
  36539. 1
  36540. 24436
  36541. 1
  36542. 26152
  36543. 1
  36544. 54787
  36545. 4
  36546. 5
  36547. 1
  36548. 54560
  36549. 2
  36550. warp_to
  36551. 1
  36552. 24436
  36553. 1
  36554. 1452
  36555. 1
  36556. 54787
  36557. 4
  36558. 5
  36559. 1
  36560. 54560
  36561. 2
  36562. warp_to
  36563. 1
  36564. 24436
  36565. 1
  36566. 26152
  36567. 1
  36568. 54787
  36569. 4
  36570. 5
  36571. 1
  36572. 54560
  36573. 2
  36574. engage
  36575. 1
  36576. 24436
  36577. 1
  36578. 26152
  36579. 1
  36580. 54787
  36581. 4
  36582. 7
  36583. 4
  36584. 5
  36585. 1
  36586. 49551
  36587. 2
  36588. tell_lines
  36589. 1
  36590. 2487
  36591. 1
  36592. 6
  36593. 1
  36594. 57807
  36595. 4
  36596. 5
  36597. 1
  36598. 53397
  36599. 2
  36600. enterfunc
  36601. 1
  36602. 49551
  36603. 1
  36604. 29557
  36605. 1
  36606. 57807
  36607. 4
  36608. 5
  36609. 1
  36610. 57807
  36611. 2
  36612. moveto
  36613. 1
  36614. 57807
  36615. 1
  36616. 1
  36617. 1
  36618. 57807
  36619. 4
  36620. 5
  36621. 1
  36622. 57807
  36623. 2
  36624. moveto
  36625. 1
  36626. 47
  36627. 1
  36628. 6
  36629. 1
  36630. 57807
  36631. 4
  36632. 5
  36633. 1
  36634. 57807
  36635. 2
  36636. moveto
  36637. 1
  36638. 47
  36639. 1
  36640. 3133
  36641. 1
  36642. 57807
  36643. 4
  36644. 5
  36645. 1
  36646. 57807
  36647. 2
  36648. teleport
  36649. 1
  36650. 47
  36651. 1
  36652. 3133
  36653. 1
  36654. 57807
  36655. 4
  36656. 5
  36657. 1
  36658. 57807
  36659. 2
  36660. @join
  36661. 1
  36662. 47
  36663. 1
  36664. 3133
  36665. 1
  36666. 57807
  36667. 4
  36668. 10
  36669. 4
  36670. 5
  36671. 1
  36672. 49551
  36673. 2
  36674. tell_lines
  36675. 1
  36676. 2487
  36677. 1
  36678. 6
  36679. 1
  36680. 49551
  36681. 4
  36682. 5
  36683. 1
  36684. 13507
  36685. 2
  36686. enterfunc
  36687. 1
  36688. 49551
  36689. 1
  36690. 29557
  36691. 1
  36692. 49551
  36693. 4
  36694. 5
  36695. 1
  36696. 13507
  36697. 2
  36698. enterfunc
  36699. 1
  36700. 50053
  36701. 1
  36702. 13507
  36703. 1
  36704. 49551
  36705. 4
  36706. 5
  36707. 1
  36708. 33355
  36709. 2
  36710. moveto
  36711. 1
  36712. 30246
  36713. 1
  36714. 1
  36715. 1
  36716. 49551
  36717. 4
  36718. 5
  36719. 1
  36720. 33355
  36721. 2
  36722. moveto
  36723. 1
  36724. 6349
  36725. 1
  36726. 3
  36727. 1
  36728. 49551
  36729. 4
  36730. 5
  36731. 1
  36732. 33355
  36733. 2
  36734. moveto
  36735. 1
  36736. 4290
  36737. 1
  36738. 6145
  36739. 1
  36740. 49551
  36741. 4
  36742. 5
  36743. 1
  36744. 33355
  36745. 2
  36746. moveto
  36747. 1
  36748. 24436
  36749. 1
  36750. 26152
  36751. 1
  36752. 49551
  36753. 4
  36754. 5
  36755. 1
  36756. 49551
  36757. 2
  36758. teleport
  36759. 1
  36760. 47
  36761. 1
  36762. 3133
  36763. 1
  36764. 49551
  36765. 4
  36766. 5
  36767. 1
  36768. 49551
  36769. 2
  36770. teleport
  36771. 1
  36772. 3920
  36773. 1
  36774. 33337
  36775. 1
  36776. 49551
  36777. 4
  36778. 5
  36779. 1
  36780. 49551
  36781. 2
  36782. @move
  36783. 1
  36784. 47
  36785. 1
  36786. 3133
  36787. 1
  36788. 49551
  36789. 4
  36790. 11
  36791. 4
  36792. 5
  36793. 1
  36794. 49551
  36795. 2
  36796. tell_lines
  36797. 1
  36798. 2487
  36799. 1
  36800. 6
  36801. 1
  36802. 54787
  36803. 4
  36804. 5
  36805. 1
  36806. 35428
  36807. 2
  36808. enterfunc
  36809. 1
  36810. 49551
  36811. 1
  36812. 29557
  36813. 1
  36814. 54787
  36815. 4
  36816. 5
  36817. 1
  36818. 54787
  36819. 2
  36820. moveto
  36821. 1
  36822. 54787
  36823. 1
  36824. 1
  36825. 1
  36826. 54787
  36827. 4
  36828. 5
  36829. 1
  36830. 54787
  36831. 2
  36832. moveto
  36833. 1
  36834. 47
  36835. 1
  36836. 6
  36837. 1
  36838. 54787
  36839. 4
  36840. 5
  36841. 1
  36842. 54787
  36843. 2
  36844. moveto
  36845. 1
  36846. 47
  36847. 1
  36848. 3133
  36849. 1
  36850. 54787
  36851. 4
  36852. 5
  36853. 1
  36854. 54787
  36855. 2
  36856. moveto
  36857. 1
  36858. 78
  36859. 1
  36860. 7069
  36861. 1
  36862. 54787
  36863. 4
  36864. 5
  36865. 1
  36866. 54787
  36867. 2
  36868. moveto
  36869. 1
  36870. 3685
  36871. 1
  36872. 8855
  36873. 1
  36874. 54787
  36875. 4
  36876. 5
  36877. 1
  36878. 54787
  36879. 2
  36880. moveto
  36881. 1
  36882. 57140
  36883. 1
  36884. 49900
  36885. 1
  36886. 54787
  36887. 4
  36888. 5
  36889. 1
  36890. 54787
  36891. 2
  36892. moveto
  36893. 1
  36894. 19845
  36895. 1
  36896. 5409
  36897. 1
  36898. 54787
  36899. 4
  36900. 5
  36901. 1
  36902. 54560
  36903. 2
  36904. exit
  36905. 1
  36906. 4290
  36907. 1
  36908. 6145
  36909. 1
  36910. 54787
  36911. 4
  36912. 5
  36913. 1
  36914. 54560
  36915. 2
  36916. exit
  36917. 1
  36918. 24436
  36919. 1
  36920. 26152
  36921. 1
  36922. 54787
  36923. 4
  36924. 8
  36925. 4
  36926. 5
  36927. 1
  36928. 49551
  36929. 2
  36930. tell_lines
  36931. 1
  36932. 2487
  36933. 1
  36934. 6
  36935. 1
  36936. 50176
  36937. 4
  36938. 5
  36939. 1
  36940. 45676
  36941. 2
  36942. enterfunc
  36943. 1
  36944. 49551
  36945. 1
  36946. 29557
  36947. 1
  36948. 50176
  36949. 4
  36950. 5
  36951. 1
  36952. 18438
  36953. 2
  36954. moveto
  36955. 1
  36956. 50176
  36957. 1
  36958. 1
  36959. 1
  36960. 50176
  36961. 4
  36962. 5
  36963. 1
  36964. 18438
  36965. 2
  36966. moveto
  36967. 1
  36968. 6349
  36969. 1
  36970. 3
  36971. 1
  36972. 50176
  36973. 4
  36974. 5
  36975. 1
  36976. 18438
  36977. 2
  36978. moveto
  36979. 1
  36980. 4290
  36981. 1
  36982. 6145
  36983. 1
  36984. 50176
  36985. 4
  36986. 5
  36987. 1
  36988. 18438
  36989. 2
  36990. moveto
  36991. 1
  36992. 24436
  36993. 1
  36994. 26152
  36995. 1
  36996. 50176
  36997. 4
  36998. 5
  36999. 1
  37000. 13507
  37001. 2
  37002. do_remove
  37003. 1
  37004. 50053
  37005. 1
  37006. 13507
  37007. 1
  37008. 50176
  37009. 4
  37010. 5
  37011. 1
  37012. 13507
  37013. 2
  37014. do_remove
  37015. 1
  37016. 50053
  37017. 1
  37018. 13507
  37019. 1
  37020. 50176
  37021. 4
  37022. 2
  37023. 4
  37024. 5
  37025. 1
  37026. 30246
  37027. 2
  37028. tell_lines
  37029. 1
  37030. 2487
  37031. 1
  37032. 6
  37033. 1
  37034. 30246
  37035. 4
  37036. 5
  37037. 1
  37038. 5987
  37039. 2
  37040. list
  37041. 1
  37042. 30246
  37043. 1
  37044. 5987
  37045. 1
  37046. 30246
  37047. 4
  37048. 2
  37049. 4
  37050. 5
  37051. 1
  37052. 30246
  37053. 2
  37054. tell_lines
  37055. 1
  37056. 2487
  37057. 1
  37058. 6
  37059. 1
  37060. 30246
  37061. 4
  37062. 5
  37063. 1
  37064. 5987
  37065. 2
  37066. list
  37067. 1
  37068. 30246
  37069. 1
  37070. 5987
  37071. 1
  37072. 30246
  37073. 4
  37074. 6
  37075. 4
  37076. 5
  37077. 1
  37078. 55164
  37079. 2
  37080. tell_lines
  37081. 1
  37082. 2487
  37083. 1
  37084. 6
  37085. 1
  37086. 55164
  37087. 4
  37088. 5
  37089. 1
  37090. 54023
  37091. 2
  37092. secure
  37093. 1
  37094. 49551
  37095. 1
  37096. 29557
  37097. 1
  37098. 55164
  37099. 4
  37100. 5
  37101. 1
  37102. 54023
  37103. 2
  37104. arm
  37105. 1
  37106. 49551
  37107. 1
  37108. 29557
  37109. 1
  37110. 55164
  37111. 4
  37112. 5
  37113. 1
  37114. 54023
  37115. 2
  37116. say_parse
  37117. 1
  37118. 49551
  37119. 1
  37120. 29557
  37121. 1
  37122. 55164
  37123. 4
  37124. 5
  37125. 1
  37126. 54023
  37127. 2
  37128. announce
  37129. 1
  37130. 49551
  37131. 1
  37132. 29557
  37133. 1
  37134. 55164
  37135. 4
  37136. 5
  37137. 1
  37138. 55164
  37139. 2
  37140. say
  37141. 1
  37142. 57140
  37143. 1
  37144. 49900
  37145. 1
  37146. 55164
  37147. 4
  37148. 4
  37149. 4
  37150. 5
  37151. 1
  37152. 53502
  37153. 2
  37154. tell_lines
  37155. 1
  37156. 2487
  37157. 1
  37158. 6
  37159. 1
  37160. 53502
  37161. 4
  37162. 5
  37163. 1
  37164. 53245
  37165. 2
  37166. secure
  37167. 1
  37168. 49551
  37169. 1
  37170. 29557
  37171. 1
  37172. 53502
  37173. 4
  37174. 5
  37175. 1
  37176. 53245
  37177. 2
  37178. arm
  37179. 1
  37180. 49551
  37181. 1
  37182. 29557
  37183. 1
  37184. 53502
  37185. 4
  37186. 5
  37187. 1
  37188. 53245
  37189. 2
  37190. press
  37191. 1
  37192. 49551
  37193. 1
  37194. 29557
  37195. 1
  37196. 53502
  37197. 4
  37198. 4
  37199. 4
  37200. 5
  37201. 1
  37202. 50176
  37203. 2
  37204. tell_lines
  37205. 1
  37206. 2487
  37207. 1
  37208. 6
  37209. 1
  37210. 50176
  37211. 4
  37212. 5
  37213. 1
  37214. 13507
  37215. 2
  37216. secure
  37217. 1
  37218. 49551
  37219. 1
  37220. 29557
  37221. 1
  37222. 50176
  37223. 4
  37224. 5
  37225. 1
  37226. 13507
  37227. 2
  37228. arm
  37229. 1
  37230. 49551
  37231. 1
  37232. 29557
  37233. 1
  37234. 50176
  37235. 4
  37236. 5
  37237. 1
  37238. 13507
  37239. 2
  37240. press
  37241. 1
  37242. 49551
  37243. 1
  37244. 29557
  37245. 1
  37246. 50176
  37247. 4
  37248. 8
  37249. 4
  37250. 5
  37251. 1
  37252. 51261
  37253. 2
  37254. tell_lines
  37255. 1
  37256. 2487
  37257. 1
  37258. 6
  37259. 1
  37260. 51261
  37261. 4
  37262. 5
  37263. 1
  37264. 18807
  37265. 2
  37266. @peruse
  37267. 1
  37268. 33119
  37269. 1
  37270. 18807
  37271. 1
  37272. 51261
  37273. 4
  37274. 5
  37275. 1
  37276. 51261
  37277. 2
  37278. my_huh
  37279. 1
  37280. 51261
  37281. 1
  37282. 6
  37283. 1
  37284. 51261
  37285. 4
  37286. 5
  37287. 1
  37288. 51261
  37289. 2
  37290. my_huh
  37291. 1
  37292. 78
  37293. 1
  37294. 7069
  37295. 1
  37296. 51261
  37297. 4
  37298. 5
  37299. 1
  37300. 51261
  37301. 2
  37302. my_huh
  37303. 1
  37304. 24442
  37305. 1
  37306. 26026
  37307. 1
  37308. 51261
  37309. 4
  37310. 5
  37311. 1
  37312. 51261
  37313. 2
  37314. my_huh
  37315. 1
  37316. 57140
  37317. 1
  37318. 49900
  37319. 1
  37320. 51261
  37321. 4
  37322. 5
  37323. 1
  37324. 219
  37325. 2
  37326. do_huh
  37327. 1
  37328. 51261
  37329. 1
  37330. 219
  37331. 1
  37332. 51261
  37333. 4
  37334. 5
  37335. 1
  37336. 57659
  37337. 2
  37338. @peruse
  37339. 1
  37340. 51261
  37341. 1
  37342. 1
  37343. 1
  37344. 51261
  37345. 4
  37346. 7
  37347. 4
  37348. 5
  37349. 1
  37350. 46470
  37351. 2
  37352. tell_lines
  37353. 1
  37354. 2487
  37355. 1
  37356. 6
  37357. 1
  37358. 46470
  37359. 4
  37360. 5
  37361. 1
  37362. 47192
  37363. 2
  37364. secure
  37365. 1
  37366. 49551
  37367. 1
  37368. 29557
  37369. 1
  37370. 46470
  37371. 4
  37372. 5
  37373. 1
  37374. 47192
  37375. 2
  37376. arm
  37377. 1
  37378. 49551
  37379. 1
  37380. 29557
  37381. 1
  37382. 46470
  37383. 4
  37384. 5
  37385. 1
  37386. 47192
  37387. 2
  37388. say_parse
  37389. 1
  37390. 49551
  37391. 1
  37392. 29557
  37393. 1
  37394. 46470
  37395. 4
  37396. 5
  37397. 1
  37398. 47192
  37399. 2
  37400. announce
  37401. 1
  37402. 49551
  37403. 1
  37404. 29557
  37405. 1
  37406. 46470
  37407. 4
  37408. 5
  37409. 1
  37410. 47192
  37411. 2
  37412. say
  37413. 1
  37414. 2
  37415. 1
  37416. 3
  37417. 1
  37418. 46470
  37419. 4
  37420. 5
  37421. 1
  37422. 46470
  37423. 2
  37424. say
  37425. 1
  37426. 31783
  37427. 1
  37428. 4803
  37429. 1
  37430. 46470
  37431. 4
  37432. 4
  37433. 4
  37434. 5
  37435. 1
  37436. 56629
  37437. 2
  37438. tell_lines
  37439. 1
  37440. 2487
  37441. 1
  37442. 6
  37443. 1
  37444. 56629
  37445. 4
  37446. 5
  37447. 1
  37448. 30286
  37449. 2
  37450. secure
  37451. 1
  37452. 49551
  37453. 1
  37454. 29557
  37455. 1
  37456. 56629
  37457. 4
  37458. 5
  37459. 1
  37460. 30286
  37461. 2
  37462. arm
  37463. 1
  37464. 49551
  37465. 1
  37466. 29557
  37467. 1
  37468. 56629
  37469. 4
  37470. 5
  37471. 1
  37472. 30286
  37473. 2
  37474. press
  37475. 1
  37476. 49551
  37477. 1
  37478. 29557
  37479. 1
  37480. 56629
  37481. 4
  37482. 4
  37483. 4
  37484. 5
  37485. 1
  37486. 56629
  37487. 2
  37488. tell_lines
  37489. 1
  37490. 2487
  37491. 1
  37492. 6
  37493. 1
  37494. 56629
  37495. 4
  37496. 5
  37497. 1
  37498. 30286
  37499. 2
  37500. secure
  37501. 1
  37502. 49551
  37503. 1
  37504. 29557
  37505. 1
  37506. 56629
  37507. 4
  37508. 5
  37509. 1
  37510. 30286
  37511. 2
  37512. arm
  37513. 1
  37514. 49551
  37515. 1
  37516. 29557
  37517. 1
  37518. 56629
  37519. 4
  37520. 5
  37521. 1
  37522. 30286
  37523. 2
  37524. press
  37525. 1
  37526. 49551
  37527. 1
  37528. 29557
  37529. 1
  37530. 56629
  37531. 4
  37532. 4
  37533. 4
  37534. 5
  37535. 1
  37536. 56629
  37537. 2
  37538. tell_lines
  37539. 1
  37540. 2487
  37541. 1
  37542. 6
  37543. 1
  37544. 56629
  37545. 4
  37546. 5
  37547. 1
  37548. 30286
  37549. 2
  37550. secure
  37551. 1
  37552. 49551
  37553. 1
  37554. 29557
  37555. 1
  37556. 56629
  37557. 4
  37558. 5
  37559. 1
  37560. 30286
  37561. 2
  37562. arm
  37563. 1
  37564. 49551
  37565. 1
  37566. 29557
  37567. 1
  37568. 56629
  37569. 4
  37570. 5
  37571. 1
  37572. 30286
  37573. 2
  37574. press
  37575. 1
  37576. 49551
  37577. 1
  37578. 29557
  37579. 1
  37580. 56629
  37581. 4
  37582. 4
  37583. 4
  37584. 5
  37585. 1
  37586. 56629
  37587. 2
  37588. tell_lines
  37589. 1
  37590. 2487
  37591. 1
  37592. 6
  37593. 1
  37594. 56629
  37595. 4
  37596. 5
  37597. 1
  37598. 30286
  37599. 2
  37600. secure
  37601. 1
  37602. 49551
  37603. 1
  37604. 29557
  37605. 1
  37606. 56629
  37607. 4
  37608. 5
  37609. 1
  37610. 30286
  37611. 2
  37612. arm
  37613. 1
  37614. 49551
  37615. 1
  37616. 29557
  37617. 1
  37618. 56629
  37619. 4
  37620. 5
  37621. 1
  37622. 30286
  37623. 2
  37624. press
  37625. 1
  37626. 49551
  37627. 1
  37628. 29557
  37629. 1
  37630. 56629
  37631. 4
  37632. 7
  37633. 4
  37634. 5
  37635. 1
  37636. 51902
  37637. 2
  37638. tell_lines
  37639. 1
  37640. 2487
  37641. 1
  37642. 6
  37643. 1
  37644. 51902
  37645. 4
  37646. 5
  37647. 1
  37648. 53151
  37649. 2
  37650. secure
  37651. 1
  37652. 49551
  37653. 1
  37654. 29557
  37655. 1
  37656. 51902
  37657. 4
  37658. 5
  37659. 1
  37660. 53151
  37661. 2
  37662. arm
  37663. 1
  37664. 49551
  37665. 1
  37666. 29557
  37667. 1
  37668. 51902
  37669. 4
  37670. 5
  37671. 1
  37672. 53151
  37673. 2
  37674. say_parse
  37675. 1
  37676. 49551
  37677. 1
  37678. 29557
  37679. 1
  37680. 51902
  37681. 4
  37682. 5
  37683. 1
  37684. 53151
  37685. 2
  37686. announce
  37687. 1
  37688. 49551
  37689. 1
  37690. 29557
  37691. 1
  37692. 51902
  37693. 4
  37694. 5
  37695. 1
  37696. 53151
  37697. 2
  37698. say
  37699. 1
  37700. 2
  37701. 1
  37702. 3
  37703. 1
  37704. 51902
  37705. 4
  37706. 5
  37707. 1
  37708. 51902
  37709. 2
  37710. say
  37711. 1
  37712. 31783
  37713. 1
  37714. 4803
  37715. 1
  37716. 51902
  37717. 4
  37718. 2
  37719. 4
  37720. 5
  37721. 1
  37722. 56651
  37723. 2
  37724. tell_lines
  37725. 1
  37726. 2487
  37727. 1
  37728. 6
  37729. 1
  37730. 56651
  37731. 4
  37732. 5
  37733. 1
  37734. 56651
  37735. 2
  37736. @peruse
  37737. 1
  37738. 31783
  37739. 1
  37740. 4803
  37741. 1
  37742. 56651
  37743. 4
  37744. 7
  37745. 4
  37746. 5
  37747. 1
  37748. 34107
  37749. 2
  37750. tell_lines
  37751. 1
  37752. 2487
  37753. 1
  37754. 6
  37755. 1
  37756. 34107
  37757. 4
  37758. 5
  37759. 1
  37760. 7944
  37761. 2
  37762. secure
  37763. 1
  37764. 49551
  37765. 1
  37766. 29557
  37767. 1
  37768. 34107
  37769. 4
  37770. 5
  37771. 1
  37772. 7944
  37773. 2
  37774. arm
  37775. 1
  37776. 49551
  37777. 1
  37778. 29557
  37779. 1
  37780. 34107
  37781. 4
  37782. 5
  37783. 1
  37784. 7944
  37785. 2
  37786. say_parse
  37787. 1
  37788. 49551
  37789. 1
  37790. 29557
  37791. 1
  37792. 34107
  37793. 4
  37794. 5
  37795. 1
  37796. 7944
  37797. 2
  37798. announce
  37799. 1
  37800. 49551
  37801. 1
  37802. 29557
  37803. 1
  37804. 34107
  37805. 4
  37806. 5
  37807. 1
  37808. 7944
  37809. 2
  37810. say
  37811. 1
  37812. 2
  37813. 1
  37814. 3
  37815. 1
  37816. 34107
  37817. 4
  37818. 5
  37819. 1
  37820. 34107
  37821. 2
  37822. say
  37823. 1
  37824. 31783
  37825. 1
  37826. 4803
  37827. 1
  37828. 34107
  37829. 4
  37830. 4
  37831. 4
  37832. 5
  37833. 1
  37834. 57810
  37835. 2
  37836. tell_lines
  37837. 1
  37838. 2487
  37839. 1
  37840. 6
  37841. 1
  37842. 57810
  37843. 4
  37844. 5
  37845. 1
  37846. 25980
  37847. 2
  37848. secure
  37849. 1
  37850. 49551
  37851. 1
  37852. 29557
  37853. 1
  37854. 57810
  37855. 4
  37856. 5
  37857. 1
  37858. 25980
  37859. 2
  37860. arm
  37861. 1
  37862. 49551
  37863. 1
  37864. 29557
  37865. 1
  37866. 57810
  37867. 4
  37868. 5
  37869. 1
  37870. 25980
  37871. 2
  37872. press
  37873. 1
  37874. 49551
  37875. 1
  37876. 29557
  37877. 1
  37878. 57810
  37879. 4
  37880. 7
  37881. 4
  37882. 5
  37883. 1
  37884. 50198
  37885. 2
  37886. tell_lines
  37887. 1
  37888. 2487
  37889. 1
  37890. 6
  37891. 1
  37892. 50198
  37893. 4
  37894. 5
  37895. 1
  37896. 42772
  37897. 2
  37898. secure
  37899. 1
  37900. 49551
  37901. 1
  37902. 29557
  37903. 1
  37904. 50198
  37905. 4
  37906. 5
  37907. 1
  37908. 42772
  37909. 2
  37910. arm
  37911. 1
  37912. 49551
  37913. 1
  37914. 29557
  37915. 1
  37916. 50198
  37917. 4
  37918. 5
  37919. 1
  37920. 42772
  37921. 2
  37922. say_parse
  37923. 1
  37924. 49551
  37925. 1
  37926. 29557
  37927. 1
  37928. 50198
  37929. 4
  37930. 5
  37931. 1
  37932. 42772
  37933. 2
  37934. announce
  37935. 1
  37936. 49551
  37937. 1
  37938. 29557
  37939. 1
  37940. 50198
  37941. 4
  37942. 5
  37943. 1
  37944. 42772
  37945. 2
  37946. say
  37947. 1
  37948. 2
  37949. 1
  37950. 3
  37951. 1
  37952. 50198
  37953. 4
  37954. 5
  37955. 1
  37956. 50198
  37957. 2
  37958. say
  37959. 1
  37960. 31783
  37961. 1
  37962. 4803
  37963. 1
  37964. 50198
  37965. 4
  37966. 16
  37967. 4
  37968. 5
  37969. 1
  37970. 30246
  37971. 2
  37972. tell_lines
  37973. 1
  37974. 2487
  37975. 1
  37976. 6
  37977. 1
  37978. 30246
  37979. 4
  37980. 5
  37981. 1
  37982. 5987
  37983. 2
  37984. secure_take
  37985. 1
  37986. 30246
  37987. 1
  37988. 5987
  37989. 1
  37990. 30246
  37991. 4
  37992. 5
  37993. 1
  37994. 5987
  37995. 2
  37996. exitfunc
  37997. 1
  37998. 30246
  37999. 1
  38000. 5987
  38001. 1
  38002. 30246
  38003. 4
  38004. 5
  38005. 1
  38006. 13393
  38007. 2
  38008. moveto
  38009. 1
  38010. 2693
  38011. 1
  38012. 1
  38013. 1
  38014. 30246
  38015. 4
  38016. 5
  38017. 1
  38018. 13393
  38019. 2
  38020. moveto
  38021. 1
  38022. 2
  38023. 1
  38024. 5
  38025. 1
  38026. 30246
  38027. 4
  38028. 5
  38029. 1
  38030. 13393
  38031. 2
  38032. moveto
  38033. 1
  38034. 2693
  38035. 1
  38036. 517
  38037. 1
  38038. 30246
  38039. 4
  38040. 5
  38041. 1
  38042. 8085
  38043. 2
  38044. buy_item
  38045. 1
  38046. 50459
  38047. 1
  38048. 8085
  38049. 1
  38050. 30246
  38051. 4
  38052. 5
  38053. 1
  38054. 8085
  38055. 2
  38056. Request_Sale
  38057. 1
  38058. 50459
  38059. 1
  38060. 8085
  38061. 1
  38062. 30246
  38063. 4
  38064. 5
  38065. 1
  38066. 8085
  38067. 2
  38068. rx_verb
  38069. 1
  38070. 19845
  38071. 1
  38072. 6475
  38073. 1
  38074. 30246
  38075. 4
  38076. 5
  38077. 1
  38078. 8085
  38079. 2
  38080. rx_list
  38081. 1
  38082. 19845
  38083. 1
  38084. 6475
  38085. 1
  38086. 30246
  38087. 4
  38088. 5
  38089. 1
  38090. 8085
  38091. 2
  38092. parse_say
  38093. 1
  38094. 19845
  38095. 1
  38096. 6475
  38097. 1
  38098. 30246
  38099. 4
  38100. 5
  38101. 1
  38102. 8085
  38103. 2
  38104. notify_say
  38105. 1
  38106. 19845
  38107. 1
  38108. 6475
  38109. 1
  38110. 30246
  38111. 4
  38112. 5
  38113. 1
  38114. 8085
  38115. 2
  38116. tell
  38117. 1
  38118. 19845
  38119. 1
  38120. 6475
  38121. 1
  38122. 30246
  38123. 4
  38124. 5
  38125. 1
  38126. 5987
  38127. 2
  38128. announce
  38129. 1
  38130. 2
  38131. 1
  38132. 3
  38133. 1
  38134. 30246
  38135. 4
  38136. 5
  38137. 1
  38138. 5987
  38139. 2
  38140. announce
  38141. 1
  38142. 2693
  38143. 1
  38144. 258
  38145. 1
  38146. 30246
  38147. 4
  38148. 5
  38149. 1
  38150. 30246
  38151. 2
  38152. say
  38153. 1
  38154. 57140
  38155. 1
  38156. 49900
  38157. 1
  38158. 30246
  38159. 4
  38160. 4
  38161. 4
  38162. 5
  38163. 1
  38164. 51626
  38165. 2
  38166. tell_lines
  38167. 1
  38168. 2487
  38169. 1
  38170. 6
  38171. 1
  38172. 51626
  38173. 4
  38174. 5
  38175. 1
  38176. 41034
  38177. 2
  38178. secure
  38179. 1
  38180. 49551
  38181. 1
  38182. 29557
  38183. 1
  38184. 51626
  38185. 4
  38186. 5
  38187. 1
  38188. 41034
  38189. 2
  38190. arm
  38191. 1
  38192. 49551
  38193. 1
  38194. 29557
  38195. 1
  38196. 51626
  38197. 4
  38198. 5
  38199. 1
  38200. 41034
  38201. 2
  38202. press
  38203. 1
  38204. 49551
  38205. 1
  38206. 29557
  38207. 1
  38208. 51626
  38209. 4
  38210. 8
  38211. 4
  38212. 5
  38213. 1
  38214. 50224
  38215. 2
  38216. tell_lines
  38217. 1
  38218. 2487
  38219. 1
  38220. 6
  38221. 1
  38222. 50224
  38223. 4
  38224. 5
  38225. 1
  38226. 18807
  38227. 2
  38228. @peruse
  38229. 1
  38230. 33119
  38231. 1
  38232. 18807
  38233. 1
  38234. 50224
  38235. 4
  38236. 5
  38237. 1
  38238. 50224
  38239. 2
  38240. my_huh
  38241. 1
  38242. 50224
  38243. 1
  38244. 6
  38245. 1
  38246. 50224
  38247. 4
  38248. 5
  38249. 1
  38250. 50224
  38251. 2
  38252. my_huh
  38253. 1
  38254. 78
  38255. 1
  38256. 7069
  38257. 1
  38258. 50224
  38259. 4
  38260. 5
  38261. 1
  38262. 50224
  38263. 2
  38264. my_huh
  38265. 1
  38266. 24442
  38267. 1
  38268. 26026
  38269. 1
  38270. 50224
  38271. 4
  38272. 5
  38273. 1
  38274. 50224
  38275. 2
  38276. my_huh
  38277. 1
  38278. 57140
  38279. 1
  38280. 49900
  38281. 1
  38282. 50224
  38283. 4
  38284. 5
  38285. 1
  38286. 219
  38287. 2
  38288. do_huh
  38289. 1
  38290. 50224
  38291. 1
  38292. 219
  38293. 1
  38294. 50224
  38295. 4
  38296. 5
  38297. 1
  38298. 51400
  38299. 2
  38300. @peruse
  38301. 1
  38302. 50224
  38303. 1
  38304. 1
  38305. 1
  38306. 50224
  38307. 4
  38308. 8
  38309. 4
  38310. 5
  38311. 1
  38312. 49397
  38313. 2
  38314. tell_lines
  38315. 1
  38316. 2487
  38317. 1
  38318. 6
  38319. 1
  38320. 49397
  38321. 4
  38322. 5
  38323. 1
  38324. 37404
  38325. 2
  38326. @peruse
  38327. 1
  38328. 19845
  38329. 1
  38330. 37404
  38331. 1
  38332. 49397
  38333. 4
  38334. 5
  38335. 1
  38336. 49397
  38337. 2
  38338. my_huh
  38339. 1
  38340. 49397
  38341. 1
  38342. 6
  38343. 1
  38344. 49397
  38345. 4
  38346. 5
  38347. 1
  38348. 49397
  38349. 2
  38350. my_huh
  38351. 1
  38352. 78
  38353. 1
  38354. 7069
  38355. 1
  38356. 49397
  38357. 4
  38358. 5
  38359. 1
  38360. 49397
  38361. 2
  38362. my_huh
  38363. 1
  38364. 24442
  38365. 1
  38366. 26026
  38367. 1
  38368. 49397
  38369. 4
  38370. 5
  38371. 1
  38372. 49397
  38373. 2
  38374. my_huh
  38375. 1
  38376. 57140
  38377. 1
  38378. 49900
  38379. 1
  38380. 49397
  38381. 4
  38382. 5
  38383. 1
  38384. 219
  38385. 2
  38386. do_huh
  38387. 1
  38388. 49397
  38389. 1
  38390. 219
  38391. 1
  38392. 49397
  38393. 4
  38394. 5
  38395. 1
  38396. 27861
  38397. 2
  38398. @peruse
  38399. 1
  38400. 49397
  38401. 1
  38402. 1
  38403. 1
  38404. 49397
  38405. 4
  38406. 11
  38407. 4
  38408. 5
  38409. 1
  38410. 50367
  38411. 2
  38412. tell_lines
  38413. 1
  38414. 2487
  38415. 1
  38416. 6
  38417. 1
  38418. 50367
  38419. 4
  38420. 5
  38421. 1
  38422. 32361
  38423. 2
  38424. look_self
  38425. 1
  38426. 15
  38427. 1
  38428. 6792
  38429. 1
  38430. 50367
  38431. 4
  38432. 5
  38433. 1
  38434. 32361
  38435. 2
  38436. enterfunc
  38437. 1
  38438. 2
  38439. 1
  38440. 3
  38441. 1
  38442. 50367
  38443. 4
  38444. 5
  38445. 1
  38446. 32361
  38447. 2
  38448. enterfunc
  38449. 1
  38450. 2693
  38451. 1
  38452. 258
  38453. 1
  38454. 50367
  38455. 4
  38456. 5
  38457. 1
  38458. 50367
  38459. 2
  38460. moveto
  38461. 1
  38462. 50367
  38463. 1
  38464. 1
  38465. 1
  38466. 50367
  38467. 4
  38468. 5
  38469. 1
  38470. 50367
  38471. 2
  38472. moveto
  38473. 1
  38474. 47
  38475. 1
  38476. 6
  38477. 1
  38478. 50367
  38479. 4
  38480. 5
  38481. 1
  38482. 50367
  38483. 2
  38484. moveto
  38485. 1
  38486. 47
  38487. 1
  38488. 3133
  38489. 1
  38490. 50367
  38491. 4
  38492. 5
  38493. 1
  38494. 50367
  38495. 2
  38496. moveto
  38497. 1
  38498. 78
  38499. 1
  38500. 7069
  38501. 1
  38502. 50367
  38503. 4
  38504. 5
  38505. 1
  38506. 50367
  38507. 2
  38508. moveto
  38509. 1
  38510. 3685
  38511. 1
  38512. 8855
  38513. 1
  38514. 50367
  38515. 4
  38516. 5
  38517. 1
  38518. 50367
  38519. 2
  38520. moveto
  38521. 1
  38522. 50367
  38523. 1
  38524. 50367
  38525. 1
  38526. 50367
  38527. 4
  38528. 5
  38529. 1
  38530. 5443
  38531. 2
  38532. done
  38533. 1
  38534. 6336
  38535. 1
  38536. 5400
  38537. 1
  38538. 50367
  38539. 4
  38540. 3
  38541. 4
  38542. 5
  38543. 1
  38544. 50367
  38545. 2
  38546. tell_lines
  38547. 1
  38548. 2487
  38549. 1
  38550. 6
  38551. 1
  38552. 50367
  38553. 4
  38554. 5
  38555. 1
  38556. 32361
  38557. 2
  38558. look_self
  38559. 1
  38560. 15
  38561. 1
  38562. 6792
  38563. 1
  38564. 50367
  38565. 4
  38566. 5
  38567. 1
  38568. 32361
  38569. 2
  38570. l
  38571. 1
  38572. 2693
  38573. 1
  38574. 258
  38575. 1
  38576. 50367
  38577. 4
  38578. 11
  38579. 4
  38580. 5
  38581. 1
  38582. 50367
  38583. 2
  38584. tell_lines
  38585. 1
  38586. 2487
  38587. 1
  38588. 6
  38589. 1
  38590. 50367
  38591. 4
  38592. 5
  38593. 1
  38594. 32361
  38595. 2
  38596. look_self
  38597. 1
  38598. 15
  38599. 1
  38600. 6792
  38601. 1
  38602. 50367
  38603. 4
  38604. 5
  38605. 1
  38606. 32361
  38607. 2
  38608. enterfunc
  38609. 1
  38610. 2
  38611. 1
  38612. 3
  38613. 1
  38614. 50367
  38615. 4
  38616. 5
  38617. 1
  38618. 32361
  38619. 2
  38620. enterfunc
  38621. 1
  38622. 2693
  38623. 1
  38624. 258
  38625. 1
  38626. 50367
  38627. 4
  38628. 5
  38629. 1
  38630. 50367
  38631. 2
  38632. moveto
  38633. 1
  38634. 50367
  38635. 1
  38636. 1
  38637. 1
  38638. 50367
  38639. 4
  38640. 5
  38641. 1
  38642. 50367
  38643. 2
  38644. moveto
  38645. 1
  38646. 47
  38647. 1
  38648. 6
  38649. 1
  38650. 50367
  38651. 4
  38652. 5
  38653. 1
  38654. 50367
  38655. 2
  38656. moveto
  38657. 1
  38658. 47
  38659. 1
  38660. 3133
  38661. 1
  38662. 50367
  38663. 4
  38664. 5
  38665. 1
  38666. 50367
  38667. 2
  38668. moveto
  38669. 1
  38670. 78
  38671. 1
  38672. 7069
  38673. 1
  38674. 50367
  38675. 4
  38676. 5
  38677. 1
  38678. 50367
  38679. 2
  38680. moveto
  38681. 1
  38682. 3685
  38683. 1
  38684. 8855
  38685. 1
  38686. 50367
  38687. 4
  38688. 5
  38689. 1
  38690. 50367
  38691. 2
  38692. moveto
  38693. 1
  38694. 50367
  38695. 1
  38696. 50367
  38697. 1
  38698. 50367
  38699. 4
  38700. 5
  38701. 1
  38702. 5443
  38703. 2
  38704. done
  38705. 1
  38706. 6336
  38707. 1
  38708. 5400
  38709. 1
  38710. 50367
  38711. 4
  38712. 11
  38713. 4
  38714. 5
  38715. 1
  38716. 50367
  38717. 2
  38718. tell_lines
  38719. 1
  38720. 2487
  38721. 1
  38722. 6
  38723. 1
  38724. 50367
  38725. 4
  38726. 5
  38727. 1
  38728. 32361
  38729. 2
  38730. look_self
  38731. 1
  38732. 15
  38733. 1
  38734. 6792
  38735. 1
  38736. 50367
  38737. 4
  38738. 5
  38739. 1
  38740. 32361
  38741. 2
  38742. enterfunc
  38743. 1
  38744. 2
  38745. 1
  38746. 3
  38747. 1
  38748. 50367
  38749. 4
  38750. 5
  38751. 1
  38752. 32361
  38753. 2
  38754. enterfunc
  38755. 1
  38756. 2693
  38757. 1
  38758. 258
  38759. 1
  38760. 50367
  38761. 4
  38762. 5
  38763. 1
  38764. 50367
  38765. 2
  38766. moveto
  38767. 1
  38768. 50367
  38769. 1
  38770. 1
  38771. 1
  38772. 50367
  38773. 4
  38774. 5
  38775. 1
  38776. 50367
  38777. 2
  38778. moveto
  38779. 1
  38780. 47
  38781. 1
  38782. 6
  38783. 1
  38784. 50367
  38785. 4
  38786. 5
  38787. 1
  38788. 50367
  38789. 2
  38790. moveto
  38791. 1
  38792. 47
  38793. 1
  38794. 3133
  38795. 1
  38796. 50367
  38797. 4
  38798. 5
  38799. 1
  38800. 50367
  38801. 2
  38802. moveto
  38803. 1
  38804. 78
  38805. 1
  38806. 7069
  38807. 1
  38808. 50367
  38809. 4
  38810. 5
  38811. 1
  38812. 50367
  38813. 2
  38814. moveto
  38815. 1
  38816. 3685
  38817. 1
  38818. 8855
  38819. 1
  38820. 50367
  38821. 4
  38822. 5
  38823. 1
  38824. 50367
  38825. 2
  38826. moveto
  38827. 1
  38828. 50367
  38829. 1
  38830. 50367
  38831. 1
  38832. 50367
  38833. 4
  38834. 5
  38835. 1
  38836. 5443
  38837. 2
  38838. done
  38839. 1
  38840. 6336
  38841. 1
  38842. 5400
  38843. 1
  38844. 50367
  38845. 4
  38846. 3
  38847. 4
  38848. 5
  38849. 1
  38850. 50367
  38851. 2
  38852. tell_lines
  38853. 1
  38854. 2487
  38855. 1
  38856. 6
  38857. 1
  38858. 50367
  38859. 4
  38860. 5
  38861. 1
  38862. 32361
  38863. 2
  38864. look_self
  38865. 1
  38866. 15
  38867. 1
  38868. 6792
  38869. 1
  38870. 50367
  38871. 4
  38872. 5
  38873. 1
  38874. 32361
  38875. 2
  38876. l
  38877. 1
  38878. 2693
  38879. 1
  38880. 258
  38881. 1
  38882. 50367
  38883. 4
  38884. 3
  38885. 4
  38886. 5
  38887. 1
  38888. 50367
  38889. 2
  38890. tell_lines
  38891. 1
  38892. 2487
  38893. 1
  38894. 6
  38895. 1
  38896. 50367
  38897. 4
  38898. 5
  38899. 1
  38900. 32361
  38901. 2
  38902. look_self
  38903. 1
  38904. 15
  38905. 1
  38906. 6792
  38907. 1
  38908. 50367
  38909. 4
  38910. 5
  38911. 1
  38912. 32361
  38913. 2
  38914. l
  38915. 1
  38916. 2693
  38917. 1
  38918. 258
  38919. 1
  38920. 50367
  38921. 4
  38922. 3
  38923. 4
  38924. 5
  38925. 1
  38926. 50367
  38927. 2
  38928. tell_lines
  38929. 1
  38930. 2487
  38931. 1
  38932. 6
  38933. 1
  38934. 50367
  38935. 4
  38936. 5
  38937. 1
  38938. 32361
  38939. 2
  38940. look_self
  38941. 1
  38942. 15
  38943. 1
  38944. 6792
  38945. 1
  38946. 50367
  38947. 4
  38948. 5
  38949. 1
  38950. 32361
  38951. 2
  38952. l
  38953. 1
  38954. 2693
  38955. 1
  38956. 258
  38957. 1
  38958. 50367
  38959. 4
  38960. 3
  38961. 4
  38962. 5
  38963. 1
  38964. 50367
  38965. 2
  38966. tell_lines
  38967. 1
  38968. 2487
  38969. 1
  38970. 6
  38971. 1
  38972. 50367
  38973. 4
  38974. 5
  38975. 1
  38976. 32361
  38977. 2
  38978. look_self
  38979. 1
  38980. 15
  38981. 1
  38982. 6792
  38983. 1
  38984. 50367
  38985. 4
  38986. 5
  38987. 1
  38988. 32361
  38989. 2
  38990. l
  38991. 1
  38992. 2693
  38993. 1
  38994. 258
  38995. 1
  38996. 50367
  38997. 4
  38998. 3
  38999. 4
  39000. 5
  39001. 1
  39002. 50367
  39003. 2
  39004. tell_lines
  39005. 1
  39006. 2487
  39007. 1
  39008. 6
  39009. 1
  39010. 50367
  39011. 4
  39012. 5
  39013. 1
  39014. 32361
  39015. 2
  39016. look_self
  39017. 1
  39018. 15
  39019. 1
  39020. 6792
  39021. 1
  39022. 50367
  39023. 4
  39024. 5
  39025. 1
  39026. 32361
  39027. 2
  39028. l
  39029. 1
  39030. 2693
  39031. 1
  39032. 258
  39033. 1
  39034. 50367
  39035. 4
  39036. 2
  39037. 4
  39038. 5
  39039. 1
  39040. 53466
  39041. 2
  39042. tell_lines
  39043. 1
  39044. 2487
  39045. 1
  39046. 6
  39047. 1
  39048. 53466
  39049. 4
  39050. 5
  39051. 1
  39052. 53466
  39053. 2
  39054. @peruse
  39055. 1
  39056. 31783
  39057. 1
  39058. 4803
  39059. 1
  39060. 53466
  39061. 4
  39062. 4
  39063. 4
  39064. 5
  39065. 1
  39066. 50290
  39067. 2
  39068. tell_lines
  39069. 1
  39070. 2487
  39071. 1
  39072. 6
  39073. 1
  39074. 50290
  39075. 4
  39076. 5
  39077. 1
  39078. 41318
  39079. 2
  39080. secure
  39081. 1
  39082. 49551
  39083. 1
  39084. 29557
  39085. 1
  39086. 50290
  39087. 4
  39088. 5
  39089. 1
  39090. 41318
  39091. 2
  39092. arm
  39093. 1
  39094. 49551
  39095. 1
  39096. 29557
  39097. 1
  39098. 50290
  39099. 4
  39100. 5
  39101. 1
  39102. 41318
  39103. 2
  39104. press
  39105. 1
  39106. 49551
  39107. 1
  39108. 29557
  39109. 1
  39110. 50290
  39111. 4
  39112. 7
  39113. 4
  39114. 5
  39115. 1
  39116. 57531
  39117. 2
  39118. tell_lines
  39119. 1
  39120. 2487
  39121. 1
  39122. 6
  39123. 1
  39124. 57531
  39125. 4
  39126. 5
  39127. 1
  39128. 53249
  39129. 2
  39130. secure
  39131. 1
  39132. 49551
  39133. 1
  39134. 29557
  39135. 1
  39136. 57531
  39137. 4
  39138. 5
  39139. 1
  39140. 53249
  39141. 2
  39142. arm
  39143. 1
  39144. 49551
  39145. 1
  39146. 29557
  39147. 1
  39148. 57531
  39149. 4
  39150. 5
  39151. 1
  39152. 53249
  39153. 2
  39154. say_parse
  39155. 1
  39156. 49551
  39157. 1
  39158. 29557
  39159. 1
  39160. 57531
  39161. 4
  39162. 5
  39163. 1
  39164. 53249
  39165. 2
  39166. announce
  39167. 1
  39168. 49551
  39169. 1
  39170. 29557
  39171. 1
  39172. 57531
  39173. 4
  39174. 5
  39175. 1
  39176. 53249
  39177. 2
  39178. say
  39179. 1
  39180. 2
  39181. 1
  39182. 3
  39183. 1
  39184. 57531
  39185. 4
  39186. 5
  39187. 1
  39188. 57531
  39189. 2
  39190. say
  39191. 1
  39192. 31783
  39193. 1
  39194. 4803
  39195. 1
  39196. 57531
  39197. 4
  39198. 6
  39199. 4
  39200. 5
  39201. 1
  39202. 56607
  39203. 2
  39204. tell_lines
  39205. 1
  39206. 2487
  39207. 1
  39208. 6
  39209. 1
  39210. 56607
  39211. 4
  39212. 5
  39213. 1
  39214. 54479
  39215. 2
  39216. secure
  39217. 1
  39218. 49551
  39219. 1
  39220. 29557
  39221. 1
  39222. 56607
  39223. 4
  39224. 5
  39225. 1
  39226. 54479
  39227. 2
  39228. arm
  39229. 1
  39230. 49551
  39231. 1
  39232. 29557
  39233. 1
  39234. 56607
  39235. 4
  39236. 5
  39237. 1
  39238. 54479
  39239. 2
  39240. say_parse
  39241. 1
  39242. 49551
  39243. 1
  39244. 29557
  39245. 1
  39246. 56607
  39247. 4
  39248. 5
  39249. 1
  39250. 54479
  39251. 2
  39252. announce
  39253. 1
  39254. 49551
  39255. 1
  39256. 29557
  39257. 1
  39258. 56607
  39259. 4
  39260. 5
  39261. 1
  39262. 56607
  39263. 2
  39264. say
  39265. 1
  39266. 57140
  39267. 1
  39268. 49900
  39269. 1
  39270. 56607
  39271. 4
  39272. 2
  39273. 4
  39274. 5
  39275. 1
  39276. 57140
  39277. 2
  39278. tell_lines
  39279. 1
  39280. 2487
  39281. 1
  39282. 6
  39283. 1
  39284. 41057
  39285. 4
  39286. 5
  39287. 1
  39288. 41057
  39289. 2
  39290. @fedit
  39291. 1
  39292. 41057
  39293. 1
  39294. 41057
  39295. 1
  39296. 41057
  39297. 4
  39298. 8
  39299. 4
  39300. 5
  39301. 1
  39302. 57421
  39303. 2
  39304. tell_lines
  39305. 1
  39306. 2487
  39307. 1
  39308. 6
  39309. 1
  39310. 57421
  39311. 4
  39312. 5
  39313. 1
  39314. 18807
  39315. 2
  39316. @peruse
  39317. 1
  39318. 33119
  39319. 1
  39320. 18807
  39321. 1
  39322. 57421
  39323. 4
  39324. 5
  39325. 1
  39326. 57421
  39327. 2
  39328. my_huh
  39329. 1
  39330. 57421
  39331. 1
  39332. 6
  39333. 1
  39334. 57421
  39335. 4
  39336. 5
  39337. 1
  39338. 57421
  39339. 2
  39340. my_huh
  39341. 1
  39342. 78
  39343. 1
  39344. 7069
  39345. 1
  39346. 57421
  39347. 4
  39348. 5
  39349. 1
  39350. 57421
  39351. 2
  39352. my_huh
  39353. 1
  39354. 24442
  39355. 1
  39356. 26026
  39357. 1
  39358. 57421
  39359. 4
  39360. 5
  39361. 1
  39362. 57421
  39363. 2
  39364. my_huh
  39365. 1
  39366. 57140
  39367. 1
  39368. 49900
  39369. 1
  39370. 57421
  39371. 4
  39372. 5
  39373. 1
  39374. 219
  39375. 2
  39376. do_huh
  39377. 1
  39378. 57421
  39379. 1
  39380. 219
  39381. 1
  39382. 57421
  39383. 4
  39384. 5
  39385. 1
  39386. 43787
  39387. 2
  39388. @peruse
  39389. 1
  39390. 57421
  39391. 1
  39392. 1
  39393. 1
  39394. 57421
  39395. 4
  39396. 8
  39397. 4
  39398. 5
  39399. 1
  39400. 57135
  39401. 2
  39402. tell_lines
  39403. 1
  39404. 2487
  39405. 1
  39406. 6
  39407. 1
  39408. 57135
  39409. 4
  39410. 5
  39411. 1
  39412. 18807
  39413. 2
  39414. @peruse
  39415. 1
  39416. 33119
  39417. 1
  39418. 18807
  39419. 1
  39420. 57135
  39421. 4
  39422. 5
  39423. 1
  39424. 57135
  39425. 2
  39426. my_huh
  39427. 1
  39428. 57135
  39429. 1
  39430. 6
  39431. 1
  39432. 57135
  39433. 4
  39434. 5
  39435. 1
  39436. 57135
  39437. 2
  39438. my_huh
  39439. 1
  39440. 78
  39441. 1
  39442. 7069
  39443. 1
  39444. 57135
  39445. 4
  39446. 5
  39447. 1
  39448. 57135
  39449. 2
  39450. my_huh
  39451. 1
  39452. 24442
  39453. 1
  39454. 26026
  39455. 1
  39456. 57135
  39457. 4
  39458. 5
  39459. 1
  39460. 57135
  39461. 2
  39462. my_huh
  39463. 1
  39464. 57140
  39465. 1
  39466. 49900
  39467. 1
  39468. 57135
  39469. 4
  39470. 5
  39471. 1
  39472. 219
  39473. 2
  39474. do_huh
  39475. 1
  39476. 57135
  39477. 1
  39478. 219
  39479. 1
  39480. 57135
  39481. 4
  39482. 5
  39483. 1
  39484. 53512
  39485. 2
  39486. @peruse
  39487. 1
  39488. 57135
  39489. 1
  39490. 1
  39491. 1
  39492. 57135
  39493. 4
  39494. 2
  39495. 4
  39496. 5
  39497. 1
  39498. 50266
  39499. 2
  39500. tell_lines
  39501. 1
  39502. 2487
  39503. 1
  39504. 6
  39505. 1
  39506. 50266
  39507. 4
  39508. 5
  39509. 1
  39510. 50266
  39511. 2
  39512. @peruse
  39513. 1
  39514. 31783
  39515. 1
  39516. 4803
  39517. 1
  39518. 50266
  39519. 4
  39520. 2
  39521. 4
  39522. 5
  39523. 1
  39524. 56361
  39525. 2
  39526. tell_lines
  39527. 1
  39528. 2487
  39529. 1
  39530. 6
  39531. 1
  39532. 56361
  39533. 4
  39534. 5
  39535. 1
  39536. 50484
  39537. 2
  39538. print
  39539. 1
  39540. 2487
  39541. 1
  39542. 5400
  39543. 1
  39544. 56361
  39545. 4
  39546. 2
  39547. 4
  39548. 5
  39549. 1
  39550. 56361
  39551. 2
  39552. tell_lines
  39553. 1
  39554. 2487
  39555. 1
  39556. 6
  39557. 1
  39558. 56361
  39559. 4
  39560. 5
  39561. 1
  39562. 50484
  39563. 2
  39564. print
  39565. 1
  39566. 2487
  39567. 1
  39568. 5400
  39569. 1
  39570. 56361
  39571. 4
  39572. 4
  39573. 4
  39574. 5
  39575. 1
  39576. 53465
  39577. 2
  39578. tell_lines
  39579. 1
  39580. 2487
  39581. 1
  39582. 6
  39583. 1
  39584. 53465
  39585. 4
  39586. 5
  39587. 1
  39588. 5008
  39589. 2
  39590. secure
  39591. 1
  39592. 49551
  39593. 1
  39594. 29557
  39595. 1
  39596. 53465
  39597. 4
  39598. 5
  39599. 1
  39600. 5008
  39601. 2
  39602. arm
  39603. 1
  39604. 49551
  39605. 1
  39606. 29557
  39607. 1
  39608. 53465
  39609. 4
  39610. 5
  39611. 1
  39612. 5008
  39613. 2
  39614. press
  39615. 1
  39616. 49551
  39617. 1
  39618. 29557
  39619. 1
  39620. 53465
  39621. 4
  39622. 4
  39623. 4
  39624. 5
  39625. 1
  39626. 57810
  39627. 2
  39628. tell_lines
  39629. 1
  39630. 2487
  39631. 1
  39632. 6
  39633. 1
  39634. 57810
  39635. 4
  39636. 5
  39637. 1
  39638. 25980
  39639. 2
  39640. secure
  39641. 1
  39642. 49551
  39643. 1
  39644. 29557
  39645. 1
  39646. 57810
  39647. 4
  39648. 5
  39649. 1
  39650. 25980
  39651. 2
  39652. arm
  39653. 1
  39654. 49551
  39655. 1
  39656. 29557
  39657. 1
  39658. 57810
  39659. 4
  39660. 5
  39661. 1
  39662. 25980
  39663. 2
  39664. press
  39665. 1
  39666. 49551
  39667. 1
  39668. 29557
  39669. 1
  39670. 57810
  39671. 4
  39672. 13
  39673. 4
  39674. 5
  39675. 1
  39676. 50367
  39677. 2
  39678. tell_lines
  39679. 1
  39680. 2487
  39681. 1
  39682. 6
  39683. 1
  39684. 50367
  39685. 4
  39686. 5
  39687. 1
  39688. 32361
  39689. 2
  39690. look_self
  39691. 1
  39692. 15
  39693. 1
  39694. 6792
  39695. 1
  39696. 50367
  39697. 4
  39698. 5
  39699. 1
  39700. 32361
  39701. 2
  39702. enterfunc
  39703. 1
  39704. 2
  39705. 1
  39706. 3
  39707. 1
  39708. 50367
  39709. 4
  39710. 5
  39711. 1
  39712. 32361
  39713. 2
  39714. enterfunc
  39715. 1
  39716. 2693
  39717. 1
  39718. 258
  39719. 1
  39720. 50367
  39721. 4
  39722. 5
  39723. 1
  39724. 50367
  39725. 2
  39726. moveto
  39727. 1
  39728. 50367
  39729. 1
  39730. 1
  39731. 1
  39732. 50367
  39733. 4
  39734. 5
  39735. 1
  39736. 50367
  39737. 2
  39738. moveto
  39739. 1
  39740. 47
  39741. 1
  39742. 6
  39743. 1
  39744. 50367
  39745. 4
  39746. 5
  39747. 1
  39748. 50367
  39749. 2
  39750. moveto
  39751. 1
  39752. 47
  39753. 1
  39754. 3133
  39755. 1
  39756. 50367
  39757. 4
  39758. 5
  39759. 1
  39760. 50367
  39761. 2
  39762. moveto
  39763. 1
  39764. 78
  39765. 1
  39766. 7069
  39767. 1
  39768. 50367
  39769. 4
  39770. 5
  39771. 1
  39772. 50367
  39773. 2
  39774. moveto
  39775. 1
  39776. 3685
  39777. 1
  39778. 8855
  39779. 1
  39780. 50367
  39781. 4
  39782. 5
  39783. 1
  39784. 50367
  39785. 2
  39786. moveto
  39787. 1
  39788. 50367
  39789. 1
  39790. 50367
  39791. 1
  39792. 50367
  39793. 4
  39794. 5
  39795. 1
  39796. 50367
  39797. 2
  39798. teleport
  39799. 1
  39800. 47
  39801. 1
  39802. 3133
  39803. 1
  39804. 50367
  39805. 4
  39806. 5
  39807. 1
  39808. 50367
  39809. 2
  39810. teleport
  39811. 1
  39812. 3920
  39813. 1
  39814. 33337
  39815. 1
  39816. 50367
  39817. 4
  39818. 5
  39819. 1
  39820. 50367
  39821. 2
  39822. @go
  39823. 1
  39824. 47
  39825. 1
  39826. 3133
  39827. 1
  39828. 50367
  39829. 4
  39830. 3
  39831. 4
  39832. 5
  39833. 1
  39834. 50367
  39835. 2
  39836. tell_lines
  39837. 1
  39838. 2487
  39839. 1
  39840. 6
  39841. 1
  39842. 50367
  39843. 4
  39844. 5
  39845. 1
  39846. 32361
  39847. 2
  39848. look_self
  39849. 1
  39850. 15
  39851. 1
  39852. 6792
  39853. 1
  39854. 50367
  39855. 4
  39856. 5
  39857. 1
  39858. 32361
  39859. 2
  39860. confunc
  39861. 1
  39862. 2
  39863. 1
  39864. 3
  39865. 1
  39866. 50367
  39867. 4
  39868. 11
  39869. 4
  39870. 5
  39871. 1
  39872. 50367
  39873. 2
  39874. tell_lines
  39875. 1
  39876. 2487
  39877. 1
  39878. 6
  39879. 1
  39880. 50367
  39881. 4
  39882. 5
  39883. 1
  39884. 32361
  39885. 2
  39886. look_self
  39887. 1
  39888. 15
  39889. 1
  39890. 6792
  39891. 1
  39892. 50367
  39893. 4
  39894. 5
  39895. 1
  39896. 32361
  39897. 2
  39898. enterfunc
  39899. 1
  39900. 2
  39901. 1
  39902. 3
  39903. 1
  39904. 50367
  39905. 4
  39906. 5
  39907. 1
  39908. 32361
  39909. 2
  39910. enterfunc
  39911. 1
  39912. 2693
  39913. 1
  39914. 258
  39915. 1
  39916. 50367
  39917. 4
  39918. 5
  39919. 1
  39920. 50367
  39921. 2
  39922. moveto
  39923. 1
  39924. 50367
  39925. 1
  39926. 1
  39927. 1
  39928. 50367
  39929. 4
  39930. 5
  39931. 1
  39932. 50367
  39933. 2
  39934. moveto
  39935. 1
  39936. 47
  39937. 1
  39938. 6
  39939. 1
  39940. 50367
  39941. 4
  39942. 5
  39943. 1
  39944. 50367
  39945. 2
  39946. moveto
  39947. 1
  39948. 47
  39949. 1
  39950. 3133
  39951. 1
  39952. 50367
  39953. 4
  39954. 5
  39955. 1
  39956. 50367
  39957. 2
  39958. moveto
  39959. 1
  39960. 78
  39961. 1
  39962. 7069
  39963. 1
  39964. 50367
  39965. 4
  39966. 5
  39967. 1
  39968. 50367
  39969. 2
  39970. moveto
  39971. 1
  39972. 3685
  39973. 1
  39974. 8855
  39975. 1
  39976. 50367
  39977. 4
  39978. 5
  39979. 1
  39980. 50367
  39981. 2
  39982. moveto
  39983. 1
  39984. 50367
  39985. 1
  39986. 50367
  39987. 1
  39988. 50367
  39989. 4
  39990. 5
  39991. 1
  39992. 5443
  39993. 2
  39994. done
  39995. 1
  39996. 6336
  39997. 1
  39998. 5400
  39999. 1
  40000. 50367
  40001. 4
  40002. 11
  40003. 4
  40004. 5
  40005. 1
  40006. 50367
  40007. 2
  40008. tell_lines
  40009. 1
  40010. 2487
  40011. 1
  40012. 6
  40013. 1
  40014. 50367
  40015. 4
  40016. 5
  40017. 1
  40018. 32361
  40019. 2
  40020. look_self
  40021. 1
  40022. 15
  40023. 1
  40024. 6792
  40025. 1
  40026. 50367
  40027. 4
  40028. 5
  40029. 1
  40030. 32361
  40031. 2
  40032. enterfunc
  40033. 1
  40034. 2
  40035. 1
  40036. 3
  40037. 1
  40038. 50367
  40039. 4
  40040. 5
  40041. 1
  40042. 32361
  40043. 2
  40044. enterfunc
  40045. 1
  40046. 2693
  40047. 1
  40048. 258
  40049. 1
  40050. 50367
  40051. 4
  40052. 5
  40053. 1
  40054. 50367
  40055. 2
  40056. moveto
  40057. 1
  40058. 50367
  40059. 1
  40060. 1
  40061. 1
  40062. 50367
  40063. 4
  40064. 5
  40065. 1
  40066. 50367
  40067. 2
  40068. moveto
  40069. 1
  40070. 47
  40071. 1
  40072. 6
  40073. 1
  40074. 50367
  40075. 4
  40076. 5
  40077. 1
  40078. 50367
  40079. 2
  40080. moveto
  40081. 1
  40082. 47
  40083. 1
  40084. 3133
  40085. 1
  40086. 50367
  40087. 4
  40088. 5
  40089. 1
  40090. 50367
  40091. 2
  40092. moveto
  40093. 1
  40094. 78
  40095. 1
  40096. 7069
  40097. 1
  40098. 50367
  40099. 4
  40100. 5
  40101. 1
  40102. 50367
  40103. 2
  40104. moveto
  40105. 1
  40106. 3685
  40107. 1
  40108. 8855
  40109. 1
  40110. 50367
  40111. 4
  40112. 5
  40113. 1
  40114. 50367
  40115. 2
  40116. moveto
  40117. 1
  40118. 50367
  40119. 1
  40120. 50367
  40121. 1
  40122. 50367
  40123. 4
  40124. 5
  40125. 1
  40126. 5443
  40127. 2
  40128. done
  40129. 1
  40130. 6336
  40131. 1
  40132. 5400
  40133. 1
  40134. 50367
  40135. 4
  40136. 11
  40137. 4
  40138. 5
  40139. 1
  40140. 50367
  40141. 2
  40142. tell_lines
  40143. 1
  40144. 2487
  40145. 1
  40146. 6
  40147. 1
  40148. 50367
  40149. 4
  40150. 5
  40151. 1
  40152. 32361
  40153. 2
  40154. look_self
  40155. 1
  40156. 15
  40157. 1
  40158. 6792
  40159. 1
  40160. 50367
  40161. 4
  40162. 5
  40163. 1
  40164. 32361
  40165. 2
  40166. enterfunc
  40167. 1
  40168. 2
  40169. 1
  40170. 3
  40171. 1
  40172. 50367
  40173. 4
  40174. 5
  40175. 1
  40176. 32361
  40177. 2
  40178. enterfunc
  40179. 1
  40180. 2693
  40181. 1
  40182. 258
  40183. 1
  40184. 50367
  40185. 4
  40186. 5
  40187. 1
  40188. 50367
  40189. 2
  40190. moveto
  40191. 1
  40192. 50367
  40193. 1
  40194. 1
  40195. 1
  40196. 50367
  40197. 4
  40198. 5
  40199. 1
  40200. 50367
  40201. 2
  40202. moveto
  40203. 1
  40204. 47
  40205. 1
  40206. 6
  40207. 1
  40208. 50367
  40209. 4
  40210. 5
  40211. 1
  40212. 50367
  40213. 2
  40214. moveto
  40215. 1
  40216. 47
  40217. 1
  40218. 3133
  40219. 1
  40220. 50367
  40221. 4
  40222. 5
  40223. 1
  40224. 50367
  40225. 2
  40226. moveto
  40227. 1
  40228. 78
  40229. 1
  40230. 7069
  40231. 1
  40232. 50367
  40233. 4
  40234. 5
  40235. 1
  40236. 50367
  40237. 2
  40238. moveto
  40239. 1
  40240. 3685
  40241. 1
  40242. 8855
  40243. 1
  40244. 50367
  40245. 4
  40246. 5
  40247. 1
  40248. 50367
  40249. 2
  40250. moveto
  40251. 1
  40252. 50367
  40253. 1
  40254. 50367
  40255. 1
  40256. 50367
  40257. 4
  40258. 5
  40259. 1
  40260. 5443
  40261. 2
  40262. done
  40263. 1
  40264. 6336
  40265. 1
  40266. 5400
  40267. 1
  40268. 50367
  40269. 4
  40270. 11
  40271. 4
  40272. 5
  40273. 1
  40274. 50367
  40275. 2
  40276. tell_lines
  40277. 1
  40278. 2487
  40279. 1
  40280. 6
  40281. 1
  40282. 50367
  40283. 4
  40284. 5
  40285. 1
  40286. 32361
  40287. 2
  40288. look_self
  40289. 1
  40290. 15
  40291. 1
  40292. 6792
  40293. 1
  40294. 50367
  40295. 4
  40296. 5
  40297. 1
  40298. 32361
  40299. 2
  40300. enterfunc
  40301. 1
  40302. 2
  40303. 1
  40304. 3
  40305. 1
  40306. 50367
  40307. 4
  40308. 5
  40309. 1
  40310. 32361
  40311. 2
  40312. enterfunc
  40313. 1
  40314. 2693
  40315. 1
  40316. 258
  40317. 1
  40318. 50367
  40319. 4
  40320. 5
  40321. 1
  40322. 50367
  40323. 2
  40324. moveto
  40325. 1
  40326. 50367
  40327. 1
  40328. 1
  40329. 1
  40330. 50367
  40331. 4
  40332. 5
  40333. 1
  40334. 50367
  40335. 2
  40336. moveto
  40337. 1
  40338. 47
  40339. 1
  40340. 6
  40341. 1
  40342. 50367
  40343. 4
  40344. 5
  40345. 1
  40346. 50367
  40347. 2
  40348. moveto
  40349. 1
  40350. 47
  40351. 1
  40352. 3133
  40353. 1
  40354. 50367
  40355. 4
  40356. 5
  40357. 1
  40358. 50367
  40359. 2
  40360. moveto
  40361. 1
  40362. 78
  40363. 1
  40364. 7069
  40365. 1
  40366. 50367
  40367. 4
  40368. 5
  40369. 1
  40370. 50367
  40371. 2
  40372. moveto
  40373. 1
  40374. 3685
  40375. 1
  40376. 8855
  40377. 1
  40378. 50367
  40379. 4
  40380. 5
  40381. 1
  40382. 50367
  40383. 2
  40384. moveto
  40385. 1
  40386. 50367
  40387. 1
  40388. 50367
  40389. 1
  40390. 50367
  40391. 4
  40392. 5
  40393. 1
  40394. 5443
  40395. 2
  40396. done
  40397. 1
  40398. 6336
  40399. 1
  40400. 5400
  40401. 1
  40402. 50367
  40403. 4
  40404. 11
  40405. 4
  40406. 5
  40407. 1
  40408. 50367
  40409. 2
  40410. tell_lines
  40411. 1
  40412. 2487
  40413. 1
  40414. 6
  40415. 1
  40416. 50367
  40417. 4
  40418. 5
  40419. 1
  40420. 32361
  40421. 2
  40422. look_self
  40423. 1
  40424. 15
  40425. 1
  40426. 6792
  40427. 1
  40428. 50367
  40429. 4
  40430. 5
  40431. 1
  40432. 32361
  40433. 2
  40434. enterfunc
  40435. 1
  40436. 2
  40437. 1
  40438. 3
  40439. 1
  40440. 50367
  40441. 4
  40442. 5
  40443. 1
  40444. 32361
  40445. 2
  40446. enterfunc
  40447. 1
  40448. 2693
  40449. 1
  40450. 258
  40451. 1
  40452. 50367
  40453. 4
  40454. 5
  40455. 1
  40456. 50367
  40457. 2
  40458. moveto
  40459. 1
  40460. 50367
  40461. 1
  40462. 1
  40463. 1
  40464. 50367
  40465. 4
  40466. 5
  40467. 1
  40468. 50367
  40469. 2
  40470. moveto
  40471. 1
  40472. 47
  40473. 1
  40474. 6
  40475. 1
  40476. 50367
  40477. 4
  40478. 5
  40479. 1
  40480. 50367
  40481. 2
  40482. moveto
  40483. 1
  40484. 47
  40485. 1
  40486. 3133
  40487. 1
  40488. 50367
  40489. 4
  40490. 5
  40491. 1
  40492. 50367
  40493. 2
  40494. moveto
  40495. 1
  40496. 78
  40497. 1
  40498. 7069
  40499. 1
  40500. 50367
  40501. 4
  40502. 5
  40503. 1
  40504. 50367
  40505. 2
  40506. moveto
  40507. 1
  40508. 3685
  40509. 1
  40510. 8855
  40511. 1
  40512. 50367
  40513. 4
  40514. 5
  40515. 1
  40516. 50367
  40517. 2
  40518. moveto
  40519. 1
  40520. 50367
  40521. 1
  40522. 50367
  40523. 1
  40524. 50367
  40525. 4
  40526. 5
  40527. 1
  40528. 5443
  40529. 2
  40530. done
  40531. 1
  40532. 6336
  40533. 1
  40534. 5400
  40535. 1
  40536. 50367
  40537. 4
  40538. 11
  40539. 4
  40540. 5
  40541. 1
  40542. 50367
  40543. 2
  40544. tell_lines
  40545. 1
  40546. 2487
  40547. 1
  40548. 6
  40549. 1
  40550. 50367
  40551. 4
  40552. 5
  40553. 1
  40554. 32361
  40555. 2
  40556. look_self
  40557. 1
  40558. 15
  40559. 1
  40560. 6792
  40561. 1
  40562. 50367
  40563. 4
  40564. 5
  40565. 1
  40566. 32361
  40567. 2
  40568. enterfunc
  40569. 1
  40570. 2
  40571. 1
  40572. 3
  40573. 1
  40574. 50367
  40575. 4
  40576. 5
  40577. 1
  40578. 32361
  40579. 2
  40580. enterfunc
  40581. 1
  40582. 2693
  40583. 1
  40584. 258
  40585. 1
  40586. 50367
  40587. 4
  40588. 5
  40589. 1
  40590. 50367
  40591. 2
  40592. moveto
  40593. 1
  40594. 50367
  40595. 1
  40596. 1
  40597. 1
  40598. 50367
  40599. 4
  40600. 5
  40601. 1
  40602. 50367
  40603. 2
  40604. moveto
  40605. 1
  40606. 47
  40607. 1
  40608. 6
  40609. 1
  40610. 50367
  40611. 4
  40612. 5
  40613. 1
  40614. 50367
  40615. 2
  40616. moveto
  40617. 1
  40618. 47
  40619. 1
  40620. 3133
  40621. 1
  40622. 50367
  40623. 4
  40624. 5
  40625. 1
  40626. 50367
  40627. 2
  40628. moveto
  40629. 1
  40630. 78
  40631. 1
  40632. 7069
  40633. 1
  40634. 50367
  40635. 4
  40636. 5
  40637. 1
  40638. 50367
  40639. 2
  40640. moveto
  40641. 1
  40642. 3685
  40643. 1
  40644. 8855
  40645. 1
  40646. 50367
  40647. 4
  40648. 5
  40649. 1
  40650. 50367
  40651. 2
  40652. moveto
  40653. 1
  40654. 50367
  40655. 1
  40656. 50367
  40657. 1
  40658. 50367
  40659. 4
  40660. 5
  40661. 1
  40662. 5443
  40663. 2
  40664. done
  40665. 1
  40666. 6336
  40667. 1
  40668. 5400
  40669. 1
  40670. 50367
  40671. 4
  40672. 11
  40673. 4
  40674. 5
  40675. 1
  40676. 50367
  40677. 2
  40678. tell_lines
  40679. 1
  40680. 2487
  40681. 1
  40682. 6
  40683. 1
  40684. 50367
  40685. 4
  40686. 5
  40687. 1
  40688. 32361
  40689. 2
  40690. look_self
  40691. 1
  40692. 15
  40693. 1
  40694. 6792
  40695. 1
  40696. 50367
  40697. 4
  40698. 5
  40699. 1
  40700. 32361
  40701. 2
  40702. enterfunc
  40703. 1
  40704. 2
  40705. 1
  40706. 3
  40707. 1
  40708. 50367
  40709. 4
  40710. 5
  40711. 1
  40712. 32361
  40713. 2
  40714. enterfunc
  40715. 1
  40716. 2693
  40717. 1
  40718. 258
  40719. 1
  40720. 50367
  40721. 4
  40722. 5
  40723. 1
  40724. 50367
  40725. 2
  40726. moveto
  40727. 1
  40728. 50367
  40729. 1
  40730. 1
  40731. 1
  40732. 50367
  40733. 4
  40734. 5
  40735. 1
  40736. 50367
  40737. 2
  40738. moveto
  40739. 1
  40740. 47
  40741. 1
  40742. 6
  40743. 1
  40744. 50367
  40745. 4
  40746. 5
  40747. 1
  40748. 50367
  40749. 2
  40750. moveto
  40751. 1
  40752. 47
  40753. 1
  40754. 3133
  40755. 1
  40756. 50367
  40757. 4
  40758. 5
  40759. 1
  40760. 50367
  40761. 2
  40762. moveto
  40763. 1
  40764. 78
  40765. 1
  40766. 7069
  40767. 1
  40768. 50367
  40769. 4
  40770. 5
  40771. 1
  40772. 50367
  40773. 2
  40774. moveto
  40775. 1
  40776. 3685
  40777. 1
  40778. 8855
  40779. 1
  40780. 50367
  40781. 4
  40782. 5
  40783. 1
  40784. 50367
  40785. 2
  40786. moveto
  40787. 1
  40788. 50367
  40789. 1
  40790. 50367
  40791. 1
  40792. 50367
  40793. 4
  40794. 5
  40795. 1
  40796. 5443
  40797. 2
  40798. done
  40799. 1
  40800. 6336
  40801. 1
  40802. 5400
  40803. 1
  40804. 50367
  40805. 4
  40806. 7
  40807. 4
  40808. 5
  40809. 1
  40810. 56872
  40811. 2
  40812. tell_lines
  40813. 1
  40814. 2487
  40815. 1
  40816. 6
  40817. 1
  40818. 56872
  40819. 4
  40820. 5
  40821. 1
  40822. 39439
  40823. 2
  40824. secure
  40825. 1
  40826. 49551
  40827. 1
  40828. 29557
  40829. 1
  40830. 56872
  40831. 4
  40832. 5
  40833. 1
  40834. 39439
  40835. 2
  40836. arm
  40837. 1
  40838. 49551
  40839. 1
  40840. 29557
  40841. 1
  40842. 56872
  40843. 4
  40844. 5
  40845. 1
  40846. 39439
  40847. 2
  40848. say_parse
  40849. 1
  40850. 49551
  40851. 1
  40852. 29557
  40853. 1
  40854. 56872
  40855. 4
  40856. 5
  40857. 1
  40858. 39439
  40859. 2
  40860. announce
  40861. 1
  40862. 49551
  40863. 1
  40864. 29557
  40865. 1
  40866. 56872
  40867. 4
  40868. 5
  40869. 1
  40870. 56872
  40871. 2
  40872. say
  40873. 1
  40874. 57140
  40875. 1
  40876. 49900
  40877. 1
  40878. 56872
  40879. 4
  40880. 5
  40881. 1
  40882. 56872
  40883. 2
  40884. say
  40885. 1
  40886. 19845
  40887. 1
  40888. 5409
  40889. 1
  40890. 56872
  40891. 4
  40892. 8
  40893. 4
  40894. 5
  40895. 1
  40896. 53484
  40897. 2
  40898. tell_lines
  40899. 1
  40900. 2487
  40901. 1
  40902. 6
  40903. 1
  40904. 53484
  40905. 4
  40906. 5
  40907. 1
  40908. 36284
  40909. 2
  40910. @inspect
  40911. 1
  40912. 19845
  40913. 1
  40914. 36284
  40915. 1
  40916. 53484
  40917. 4
  40918. 5
  40919. 1
  40920. 53484
  40921. 2
  40922. my_huh
  40923. 1
  40924. 53484
  40925. 1
  40926. 6
  40927. 1
  40928. 53484
  40929. 4
  40930. 5
  40931. 1
  40932. 53484
  40933. 2
  40934. my_huh
  40935. 1
  40936. 78
  40937. 1
  40938. 7069
  40939. 1
  40940. 53484
  40941. 4
  40942. 5
  40943. 1
  40944. 53484
  40945. 2
  40946. my_huh
  40947. 1
  40948. 24442
  40949. 1
  40950. 26026
  40951. 1
  40952. 53484
  40953. 4
  40954. 5
  40955. 1
  40956. 53484
  40957. 2
  40958. my_huh
  40959. 1
  40960. 57140
  40961. 1
  40962. 49900
  40963. 1
  40964. 53484
  40965. 4
  40966. 5
  40967. 1
  40968. 219
  40969. 2
  40970. do_huh
  40971. 1
  40972. 53484
  40973. 1
  40974. 219
  40975. 1
  40976. 53484
  40977. 4
  40978. 5
  40979. 1
  40980. 42023
  40981. 2
  40982. @inspect
  40983. 1
  40984. 53484
  40985. 1
  40986. 1
  40987. 1
  40988. 53484
  40989. 4
  40990. 8
  40991. 4
  40992. 5
  40993. 1
  40994. 53484
  40995. 2
  40996. tell_lines
  40997. 1
  40998. 2487
  40999. 1
  41000. 6
  41001. 1
  41002. 53484
  41003. 4
  41004. 5
  41005. 1
  41006. 36284
  41007. 2
  41008. @dox
  41009. 1
  41010. 19845
  41011. 1
  41012. 36284
  41013. 1
  41014. 53484
  41015. 4
  41016. 5
  41017. 1
  41018. 53484
  41019. 2
  41020. my_huh
  41021. 1
  41022. 53484
  41023. 1
  41024. 6
  41025. 1
  41026. 53484
  41027. 4
  41028. 5
  41029. 1
  41030. 53484
  41031. 2
  41032. my_huh
  41033. 1
  41034. 78
  41035. 1
  41036. 7069
  41037. 1
  41038. 53484
  41039. 4
  41040. 5
  41041. 1
  41042. 53484
  41043. 2
  41044. my_huh
  41045. 1
  41046. 24442
  41047. 1
  41048. 26026
  41049. 1
  41050. 53484
  41051. 4
  41052. 5
  41053. 1
  41054. 53484
  41055. 2
  41056. my_huh
  41057. 1
  41058. 57140
  41059. 1
  41060. 49900
  41061. 1
  41062. 53484
  41063. 4
  41064. 5
  41065. 1
  41066. 219
  41067. 2
  41068. do_huh
  41069. 1
  41070. 53484
  41071. 1
  41072. 219
  41073. 1
  41074. 53484
  41075. 4
  41076. 5
  41077. 1
  41078. 43542
  41079. 2
  41080. @dox
  41081. 1
  41082. 53484
  41083. 1
  41084. 1
  41085. 1
  41086. 53484
  41087. 4
  41088. 7
  41089. 4
  41090. 5
  41091. 1
  41092. 26343
  41093. 2
  41094. tell_lines
  41095. 1
  41096. 2487
  41097. 1
  41098. 6
  41099. 1
  41100. 26343
  41101. 4
  41102. 5
  41103. 1
  41104. 18807
  41105. 2
  41106. @peruse
  41107. 1
  41108. 33119
  41109. 1
  41110. 18807
  41111. 1
  41112. 26343
  41113. 4
  41114. 5
  41115. 1
  41116. 26343
  41117. 2
  41118. my_huh
  41119. 1
  41120. 26343
  41121. 1
  41122. 6
  41123. 1
  41124. 26343
  41125. 4
  41126. 5
  41127. 1
  41128. 26343
  41129. 2
  41130. my_huh
  41131. 1
  41132. 78
  41133. 1
  41134. 7069
  41135. 1
  41136. 26343
  41137. 4
  41138. 5
  41139. 1
  41140. 26343
  41141. 2
  41142. my_huh
  41143. 1
  41144. 24442
  41145. 1
  41146. 26026
  41147. 1
  41148. 26343
  41149. 4
  41150. 5
  41151. 1
  41152. 219
  41153. 2
  41154. do_huh
  41155. 1
  41156. 26343
  41157. 1
  41158. 219
  41159. 1
  41160. 26343
  41161. 4
  41162. 5
  41163. 1
  41164. 38937
  41165. 2
  41166. @peruse
  41167. 1
  41168. 26343
  41169. 1
  41170. 1
  41171. 1
  41172. 26343
  41173. 4
  41174. 6
  41175. 4
  41176. 5
  41177. 1
  41178. 23276
  41179. 2
  41180. tell_lines
  41181. 1
  41182. 2487
  41183. 1
  41184. 6
  41185. 1
  41186. 23276
  41187. 4
  41188. 5
  41189. 1
  41190. 40878
  41191. 2
  41192. secure
  41193. 1
  41194. 49551
  41195. 1
  41196. 29557
  41197. 1
  41198. 23276
  41199. 4
  41200. 5
  41201. 1
  41202. 40878
  41203. 2
  41204. arm
  41205. 1
  41206. 49551
  41207. 1
  41208. 29557
  41209. 1
  41210. 23276
  41211. 4
  41212. 5
  41213. 1
  41214. 40878
  41215. 2
  41216. say_parse
  41217. 1
  41218. 49551
  41219. 1
  41220. 29557
  41221. 1
  41222. 23276
  41223. 4
  41224. 5
  41225. 1
  41226. 40878
  41227. 2
  41228. announce
  41229. 1
  41230. 49551
  41231. 1
  41232. 29557
  41233. 1
  41234. 23276
  41235. 4
  41236. 5
  41237. 1
  41238. 23276
  41239. 2
  41240. say
  41241. 1
  41242. 57140
  41243. 1
  41244. 49900
  41245. 1
  41246. 23276
  41247. 4
  41248. 4
  41249. 4
  41250. 5
  41251. 1
  41252. 57042
  41253. 2
  41254. tell_lines
  41255. 1
  41256. 2487
  41257. 1
  41258. 6
  41259. 1
  41260. 57042
  41261. 4
  41262. 5
  41263. 1
  41264. 46611
  41265. 2
  41266. secure
  41267. 1
  41268. 49551
  41269. 1
  41270. 29557
  41271. 1
  41272. 57042
  41273. 4
  41274. 5
  41275. 1
  41276. 46611
  41277. 2
  41278. arm
  41279. 1
  41280. 49551
  41281. 1
  41282. 29557
  41283. 1
  41284. 57042
  41285. 4
  41286. 5
  41287. 1
  41288. 46611
  41289. 2
  41290. press
  41291. 1
  41292. 49551
  41293. 1
  41294. 29557
  41295. 1
  41296. 57042
  41297. 4
  41298. 8
  41299. 4
  41300. 5
  41301. 1
  41302. 56263
  41303. 2
  41304. tell_lines
  41305. 1
  41306. 2487
  41307. 1
  41308. 6
  41309. 1
  41310. 56263
  41311. 4
  41312. 5
  41313. 1
  41314. 18807
  41315. 2
  41316. @peruse
  41317. 1
  41318. 33119
  41319. 1
  41320. 18807
  41321. 1
  41322. 56263
  41323. 4
  41324. 5
  41325. 1
  41326. 56263
  41327. 2
  41328. my_huh
  41329. 1
  41330. 56263
  41331. 1
  41332. 6
  41333. 1
  41334. 56263
  41335. 4
  41336. 5
  41337. 1
  41338. 56263
  41339. 2
  41340. my_huh
  41341. 1
  41342. 78
  41343. 1
  41344. 7069
  41345. 1
  41346. 56263
  41347. 4
  41348. 5
  41349. 1
  41350. 56263
  41351. 2
  41352. my_huh
  41353. 1
  41354. 24442
  41355. 1
  41356. 26026
  41357. 1
  41358. 56263
  41359. 4
  41360. 5
  41361. 1
  41362. 56263
  41363. 2
  41364. my_huh
  41365. 1
  41366. 57140
  41367. 1
  41368. 49900
  41369. 1
  41370. 56263
  41371. 4
  41372. 5
  41373. 1
  41374. 219
  41375. 2
  41376. do_huh
  41377. 1
  41378. 56263
  41379. 1
  41380. 219
  41381. 1
  41382. 56263
  41383. 4
  41384. 5
  41385. 1
  41386. 55879
  41387. 2
  41388. @peruse
  41389. 1
  41390. 56263
  41391. 1
  41392. 1
  41393. 1
  41394. 56263
  41395. 4
  41396. 7
  41397. 4
  41398. 5
  41399. 1
  41400. 56872
  41401. 2
  41402. tell_lines
  41403. 1
  41404. 2487
  41405. 1
  41406. 6
  41407. 1
  41408. 56872
  41409. 4
  41410. 5
  41411. 1
  41412. 39439
  41413. 2
  41414. secure
  41415. 1
  41416. 49551
  41417. 1
  41418. 29557
  41419. 1
  41420. 56872
  41421. 4
  41422. 5
  41423. 1
  41424. 39439
  41425. 2
  41426. arm
  41427. 1
  41428. 49551
  41429. 1
  41430. 29557
  41431. 1
  41432. 56872
  41433. 4
  41434. 5
  41435. 1
  41436. 39439
  41437. 2
  41438. say_parse
  41439. 1
  41440. 49551
  41441. 1
  41442. 29557
  41443. 1
  41444. 56872
  41445. 4
  41446. 5
  41447. 1
  41448. 39439
  41449. 2
  41450. announce
  41451. 1
  41452. 49551
  41453. 1
  41454. 29557
  41455. 1
  41456. 56872
  41457. 4
  41458. 5
  41459. 1
  41460. 56872
  41461. 2
  41462. say
  41463. 1
  41464. 57140
  41465. 1
  41466. 49900
  41467. 1
  41468. 56872
  41469. 4
  41470. 5
  41471. 1
  41472. 56872
  41473. 2
  41474. say
  41475. 1
  41476. 19845
  41477. 1
  41478. 5409
  41479. 1
  41480. 56872
  41481. 4
  41482. 2
  41483. 4
  41484. 5
  41485. 1
  41486. 54875
  41487. 2
  41488. tell_lines
  41489. 1
  41490. 2487
  41491. 1
  41492. 6
  41493. 1
  41494. 54875
  41495. 4
  41496. 5
  41497. 1
  41498. 54875
  41499. 2
  41500. @peruse
  41501. 1
  41502. 31783
  41503. 1
  41504. 4803
  41505. 1
  41506. 54875
  41507. 4
  41508. 2
  41509. 4
  41510. 5
  41511. 1
  41512. 37781
  41513. 2
  41514. tell_lines
  41515. 1
  41516. 2487
  41517. 1
  41518. 6
  41519. 1
  41520. 37781
  41521. 4
  41522. 5
  41523. 1
  41524. 37781
  41525. 2
  41526. @peruse
  41527. 1
  41528. 37781
  41529. 1
  41530. 37781
  41531. 1
  41532. 37781
  41533. 4
  41534. 7
  41535. 4
  41536. 5
  41537. 1
  41538. 57531
  41539. 2
  41540. tell_lines
  41541. 1
  41542. 2487
  41543. 1
  41544. 6
  41545. 1
  41546. 57531
  41547. 4
  41548. 5
  41549. 1
  41550. 53249
  41551. 2
  41552. secure
  41553. 1
  41554. 49551
  41555. 1
  41556. 29557
  41557. 1
  41558. 57531
  41559. 4
  41560. 5
  41561. 1
  41562. 53249
  41563. 2
  41564. arm
  41565. 1
  41566. 49551
  41567. 1
  41568. 29557
  41569. 1
  41570. 57531
  41571. 4
  41572. 5
  41573. 1
  41574. 53249
  41575. 2
  41576. say_parse
  41577. 1
  41578. 49551
  41579. 1
  41580. 29557
  41581. 1
  41582. 57531
  41583. 4
  41584. 5
  41585. 1
  41586. 53249
  41587. 2
  41588. announce
  41589. 1
  41590. 49551
  41591. 1
  41592. 29557
  41593. 1
  41594. 57531
  41595. 4
  41596. 5
  41597. 1
  41598. 53249
  41599. 2
  41600. say
  41601. 1
  41602. 2
  41603. 1
  41604. 3
  41605. 1
  41606. 57531
  41607. 4
  41608. 5
  41609. 1
  41610. 57531
  41611. 2
  41612. say
  41613. 1
  41614. 31783
  41615. 1
  41616. 4803
  41617. 1
  41618. 57531
  41619. 4
  41620. 4
  41621. 4
  41622. 5
  41623. 1
  41624. 57990
  41625. 2
  41626. tell_lines
  41627. 1
  41628. 2487
  41629. 1
  41630. 6
  41631. 1
  41632. 57990
  41633. 4
  41634. 5
  41635. 1
  41636. 13610
  41637. 2
  41638. secure
  41639. 1
  41640. 49551
  41641. 1
  41642. 29557
  41643. 1
  41644. 57990
  41645. 4
  41646. 5
  41647. 1
  41648. 13610
  41649. 2
  41650. arm
  41651. 1
  41652. 49551
  41653. 1
  41654. 29557
  41655. 1
  41656. 57990
  41657. 4
  41658. 5
  41659. 1
  41660. 13610
  41661. 2
  41662. press
  41663. 1
  41664. 49551
  41665. 1
  41666. 29557
  41667. 1
  41668. 57990
  41669. 4
  41670. 6
  41671. 4
  41672. 5
  41673. 1
  41674. 57998
  41675. 2
  41676. tell_lines
  41677. 1
  41678. 2487
  41679. 1
  41680. 6
  41681. 1
  41682. 57998
  41683. 4
  41684. 5
  41685. 1
  41686. 57998
  41687. 2
  41688. look_self
  41689. 1
  41690. 2
  41691. 1
  41692. 1
  41693. 1
  41694. 57998
  41695. 4
  41696. 5
  41697. 1
  41698. 57998
  41699. 2
  41700. look_self
  41701. 1
  41702. 2
  41703. 1
  41704. 6
  41705. 1
  41706. 57998
  41707. 4
  41708. 5
  41709. 1
  41710. 31788
  41711. 2
  41712. special_look
  41713. 1
  41714. 31783
  41715. 1
  41716. 9805
  41717. 1
  41718. 57998
  41719. 4
  41720. 5
  41721. 1
  41722. 31788
  41723. 2
  41724. l
  41725. 1
  41726. 31783
  41727. 1
  41728. 9805
  41729. 1
  41730. 57998
  41731. 4
  41732. 5
  41733. 1
  41734. 31788
  41735. 2
  41736. l
  41737. 1
  41738. 49551
  41739. 1
  41740. 29557
  41741. 1
  41742. 57998
  41743. 4
  41744. 2
  41745. 4
  41746. 5
  41747. 1
  41748. 50464
  41749. 2
  41750. tell_lines
  41751. 1
  41752. 2487
  41753. 1
  41754. 6
  41755. 1
  41756. 50464
  41757. 4
  41758. 5
  41759. 1
  41760. 50464
  41761. 2
  41762. @peruse
  41763. 1
  41764. 31783
  41765. 1
  41766. 4803
  41767. 1
  41768. 50464
  41769. 4
  41770. 8
  41771. 4
  41772. 5
  41773. 1
  41774. 39670
  41775. 2
  41776. tell_lines
  41777. 1
  41778. 2487
  41779. 1
  41780. 6
  41781. 1
  41782. 39670
  41783. 4
  41784. 5
  41785. 1
  41786. 5023
  41787. 2
  41788. spamhelp
  41789. 1
  41790. 37636
  41791. 1
  41792. 5023
  41793. 1
  41794. 39670
  41795. 4
  41796. 5
  41797. 1
  41798. 39670
  41799. 2
  41800. my_huh
  41801. 1
  41802. 39670
  41803. 1
  41804. 6
  41805. 1
  41806. 39670
  41807. 4
  41808. 5
  41809. 1
  41810. 39670
  41811. 2
  41812. my_huh
  41813. 1
  41814. 78
  41815. 1
  41816. 7069
  41817. 1
  41818. 39670
  41819. 4
  41820. 5
  41821. 1
  41822. 39670
  41823. 2
  41824. my_huh
  41825. 1
  41826. 24442
  41827. 1
  41828. 26026
  41829. 1
  41830. 39670
  41831. 4
  41832. 5
  41833. 1
  41834. 39670
  41835. 2
  41836. my_huh
  41837. 1
  41838. 57140
  41839. 1
  41840. 49900
  41841. 1
  41842. 39670
  41843. 4
  41844. 5
  41845. 1
  41846. 219
  41847. 2
  41848. do_huh
  41849. 1
  41850. 39670
  41851. 1
  41852. 219
  41853. 1
  41854. 39670
  41855. 4
  41856. 5
  41857. 1
  41858. 5173
  41859. 2
  41860. spamhelp
  41861. 1
  41862. 39670
  41863. 1
  41864. 1
  41865. 1
  41866. 39670
  41867. 4
  41868. 6
  41869. 4
  41870. 5
  41871. 1
  41872. 57413
  41873. 2
  41874. tell_lines
  41875. 1
  41876. 2487
  41877. 1
  41878. 6
  41879. 1
  41880. 57413
  41881. 4
  41882. 5
  41883. 1
  41884. 50866
  41885. 2
  41886. secure
  41887. 1
  41888. 49551
  41889. 1
  41890. 29557
  41891. 1
  41892. 57413
  41893. 4
  41894. 5
  41895. 1
  41896. 50866
  41897. 2
  41898. arm
  41899. 1
  41900. 49551
  41901. 1
  41902. 29557
  41903. 1
  41904. 57413
  41905. 4
  41906. 5
  41907. 1
  41908. 50866
  41909. 2
  41910. say_parse
  41911. 1
  41912. 49551
  41913. 1
  41914. 29557
  41915. 1
  41916. 57413
  41917. 4
  41918. 5
  41919. 1
  41920. 50866
  41921. 2
  41922. announce
  41923. 1
  41924. 49551
  41925. 1
  41926. 29557
  41927. 1
  41928. 57413
  41929. 4
  41930. 5
  41931. 1
  41932. 50866
  41933. 2
  41934. say
  41935. 1
  41936. 2
  41937. 1
  41938. 3
  41939. 1
  41940. 57413
  41941. 4
  41942. 8
  41943. 4
  41944. 5
  41945. 1
  41946. 57421
  41947. 2
  41948. tell_lines
  41949. 1
  41950. 2487
  41951. 1
  41952. 6
  41953. 1
  41954. 57421
  41955. 4
  41956. 5
  41957. 1
  41958. 18807
  41959. 2
  41960. @peruse
  41961. 1
  41962. 33119
  41963. 1
  41964. 18807
  41965. 1
  41966. 57421
  41967. 4
  41968. 5
  41969. 1
  41970. 57421
  41971. 2
  41972. my_huh
  41973. 1
  41974. 57421
  41975. 1
  41976. 6
  41977. 1
  41978. 57421
  41979. 4
  41980. 5
  41981. 1
  41982. 57421
  41983. 2
  41984. my_huh
  41985. 1
  41986. 78
  41987. 1
  41988. 7069
  41989. 1
  41990. 57421
  41991. 4
  41992. 5
  41993. 1
  41994. 57421
  41995. 2
  41996. my_huh
  41997. 1
  41998. 24442
  41999. 1
  42000. 26026
  42001. 1
  42002. 57421
  42003. 4
  42004. 5
  42005. 1
  42006. 57421
  42007. 2
  42008. my_huh
  42009. 1
  42010. 57140
  42011. 1
  42012. 49900
  42013. 1
  42014. 57421
  42015. 4
  42016. 5
  42017. 1
  42018. 219
  42019. 2
  42020. do_huh
  42021. 1
  42022. 57421
  42023. 1
  42024. 219
  42025. 1
  42026. 57421
  42027. 4
  42028. 5
  42029. 1
  42030. 40840
  42031. 2
  42032. @peruse
  42033. 1
  42034. 57421
  42035. 1
  42036. 1
  42037. 1
  42038. 57421
  42039. 4
  42040. 13
  42041. 4
  42042. 5
  42043. 1
  42044. 50367
  42045. 2
  42046. tell_lines
  42047. 1
  42048. 2487
  42049. 1
  42050. 6
  42051. 1
  42052. 50367
  42053. 4
  42054. 5
  42055. 1
  42056. 32361
  42057. 2
  42058. look_self
  42059. 1
  42060. 15
  42061. 1
  42062. 6792
  42063. 1
  42064. 50367
  42065. 4
  42066. 5
  42067. 1
  42068. 32361
  42069. 2
  42070. enterfunc
  42071. 1
  42072. 2
  42073. 1
  42074. 3
  42075. 1
  42076. 50367
  42077. 4
  42078. 5
  42079. 1
  42080. 32361
  42081. 2
  42082. enterfunc
  42083. 1
  42084. 2693
  42085. 1
  42086. 258
  42087. 1
  42088. 50367
  42089. 4
  42090. 5
  42091. 1
  42092. 50367
  42093. 2
  42094. moveto
  42095. 1
  42096. 50367
  42097. 1
  42098. 1
  42099. 1
  42100. 50367
  42101. 4
  42102. 5
  42103. 1
  42104. 50367
  42105. 2
  42106. moveto
  42107. 1
  42108. 47
  42109. 1
  42110. 6
  42111. 1
  42112. 50367
  42113. 4
  42114. 5
  42115. 1
  42116. 50367
  42117. 2
  42118. moveto
  42119. 1
  42120. 47
  42121. 1
  42122. 3133
  42123. 1
  42124. 50367
  42125. 4
  42126. 5
  42127. 1
  42128. 50367
  42129. 2
  42130. moveto
  42131. 1
  42132. 78
  42133. 1
  42134. 7069
  42135. 1
  42136. 50367
  42137. 4
  42138. 5
  42139. 1
  42140. 50367
  42141. 2
  42142. moveto
  42143. 1
  42144. 3685
  42145. 1
  42146. 8855
  42147. 1
  42148. 50367
  42149. 4
  42150. 5
  42151. 1
  42152. 50367
  42153. 2
  42154. moveto
  42155. 1
  42156. 50367
  42157. 1
  42158. 50367
  42159. 1
  42160. 50367
  42161. 4
  42162. 5
  42163. 1
  42164. 50367
  42165. 2
  42166. teleport
  42167. 1
  42168. 47
  42169. 1
  42170. 3133
  42171. 1
  42172. 50367
  42173. 4
  42174. 5
  42175. 1
  42176. 50367
  42177. 2
  42178. teleport
  42179. 1
  42180. 3920
  42181. 1
  42182. 33337
  42183. 1
  42184. 50367
  42185. 4
  42186. 5
  42187. 1
  42188. 50367
  42189. 2
  42190. @go
  42191. 1
  42192. 47
  42193. 1
  42194. 3133
  42195. 1
  42196. 50367
  42197. 4
  42198. 9
  42199. 4
  42200. 5
  42201. 1
  42202. 50634
  42203. 2
  42204. tell_lines
  42205. 1
  42206. 2487
  42207. 1
  42208. 6
  42209. 1
  42210. 50634
  42211. 4
  42212. 5
  42213. 1
  42214. 27804
  42215. 2
  42216. secure
  42217. 1
  42218. 30246
  42219. 1
  42220. 16017
  42221. 1
  42222. 50634
  42223. 4
  42224. 5
  42225. 1
  42226. 27804
  42227. 2
  42228. arm
  42229. 1
  42230. 30246
  42231. 1
  42232. 16017
  42233. 1
  42234. 50634
  42235. 4
  42236. 5
  42237. 1
  42238. 27804
  42239. 2
  42240. say_parse
  42241. 1
  42242. 30246
  42243. 1
  42244. 16017
  42245. 1
  42246. 50634
  42247. 4
  42248. 5
  42249. 1
  42250. 27804
  42251. 2
  42252. announce_all
  42253. 1
  42254. 30246
  42255. 1
  42256. 16017
  42257. 1
  42258. 50634
  42259. 4
  42260. 5
  42261. 1
  42262. 27804
  42263. 2
  42264. tell
  42265. 1
  42266. 4290
  42267. 1
  42268. 6145
  42269. 1
  42270. 50634
  42271. 4
  42272. 5
  42273. 1
  42274. 50986
  42275. 2
  42276. announce
  42277. 1
  42278. 31783
  42279. 1
  42280. 9805
  42281. 1
  42282. 50634
  42283. 4
  42284. 5
  42285. 1
  42286. 50986
  42287. 2
  42288. announce
  42289. 1
  42290. 49551
  42291. 1
  42292. 29557
  42293. 1
  42294. 50634
  42295. 4
  42296. 5
  42297. 1
  42298. 50634
  42299. 2
  42300. say
  42301. 1
  42302. 57140
  42303. 1
  42304. 49900
  42305. 1
  42306. 50634
  42307. 4
  42308. 6
  42309. 4
  42310. 5
  42311. 1
  42312. 55707
  42313. 2
  42314. tell_lines
  42315. 1
  42316. 2487
  42317. 1
  42318. 6
  42319. 1
  42320. 55707
  42321. 4
  42322. 5
  42323. 1
  42324. 36264
  42325. 2
  42326. secure
  42327. 1
  42328. 49551
  42329. 1
  42330. 29557
  42331. 1
  42332. 55707
  42333. 4
  42334. 5
  42335. 1
  42336. 36264
  42337. 2
  42338. arm
  42339. 1
  42340. 49551
  42341. 1
  42342. 29557
  42343. 1
  42344. 55707
  42345. 4
  42346. 5
  42347. 1
  42348. 36264
  42349. 2
  42350. say_parse
  42351. 1
  42352. 49551
  42353. 1
  42354. 29557
  42355. 1
  42356. 55707
  42357. 4
  42358. 5
  42359. 1
  42360. 36264
  42361. 2
  42362. announce
  42363. 1
  42364. 49551
  42365. 1
  42366. 29557
  42367. 1
  42368. 55707
  42369. 4
  42370. 5
  42371. 1
  42372. 55707
  42373. 2
  42374. say
  42375. 1
  42376. 57140
  42377. 1
  42378. 49900
  42379. 1
  42380. 55707
  42381. 4
  42382. 6
  42383. 4
  42384. 5
  42385. 1
  42386. 57998
  42387. 2
  42388. tell_lines
  42389. 1
  42390. 2487
  42391. 1
  42392. 6
  42393. 1
  42394. 57998
  42395. 4
  42396. 5
  42397. 1
  42398. 31788
  42399. 2
  42400. secure
  42401. 1
  42402. 49551
  42403. 1
  42404. 29557
  42405. 1
  42406. 57998
  42407. 4
  42408. 5
  42409. 1
  42410. 31788
  42411. 2
  42412. arm
  42413. 1
  42414. 49551
  42415. 1
  42416. 29557
  42417. 1
  42418. 57998
  42419. 4
  42420. 5
  42421. 1
  42422. 31788
  42423. 2
  42424. say_parse
  42425. 1
  42426. 49551
  42427. 1
  42428. 29557
  42429. 1
  42430. 57998
  42431. 4
  42432. 5
  42433. 1
  42434. 31788
  42435. 2
  42436. announce
  42437. 1
  42438. 49551
  42439. 1
  42440. 29557
  42441. 1
  42442. 57998
  42443. 4
  42444. 5
  42445. 1
  42446. 31788
  42447. 2
  42448. say
  42449. 1
  42450. 2
  42451. 1
  42452. 3
  42453. 1
  42454. 57998
  42455. 4
  42456. 15
  42457. 4
  42458. 5
  42459. 1
  42460. 56998
  42461. 2
  42462. tell_lines
  42463. 1
  42464. 2487
  42465. 1
  42466. 6
  42467. 1
  42468. 56998
  42469. 4
  42470. 5
  42471. 1
  42472. 32361
  42473. 2
  42474. look_self
  42475. 1
  42476. 15
  42477. 1
  42478. 6792
  42479. 1
  42480. 56998
  42481. 4
  42482. 5
  42483. 1
  42484. 32361
  42485. 2
  42486. enterfunc
  42487. 1
  42488. 2
  42489. 1
  42490. 3
  42491. 1
  42492. 56998
  42493. 4
  42494. 5
  42495. 1
  42496. 32361
  42497. 2
  42498. enterfunc
  42499. 1
  42500. 2693
  42501. 1
  42502. 258
  42503. 1
  42504. 56998
  42505. 4
  42506. 5
  42507. 1
  42508. 56998
  42509. 2
  42510. moveto
  42511. 1
  42512. 56998
  42513. 1
  42514. 1
  42515. 1
  42516. 56998
  42517. 4
  42518. 5
  42519. 1
  42520. 56998
  42521. 2
  42522. moveto
  42523. 1
  42524. 47
  42525. 1
  42526. 6
  42527. 1
  42528. 56998
  42529. 4
  42530. 5
  42531. 1
  42532. 56998
  42533. 2
  42534. moveto
  42535. 1
  42536. 47
  42537. 1
  42538. 3133
  42539. 1
  42540. 56998
  42541. 4
  42542. 5
  42543. 1
  42544. 56998
  42545. 2
  42546. moveto
  42547. 1
  42548. 78
  42549. 1
  42550. 7069
  42551. 1
  42552. 56998
  42553. 4
  42554. 5
  42555. 1
  42556. 56998
  42557. 2
  42558. moveto
  42559. 1
  42560. 3685
  42561. 1
  42562. 8855
  42563. 1
  42564. 56998
  42565. 4
  42566. 5
  42567. 1
  42568. 56998
  42569. 2
  42570. moveto
  42571. 1
  42572. 56998
  42573. 1
  42574. 56998
  42575. 1
  42576. 56998
  42577. 4
  42578. 5
  42579. 1
  42580. 26217
  42581. 2
  42582. move
  42583. 1
  42584. 2
  42585. 1
  42586. 7
  42587. 1
  42588. 56998
  42589. 4
  42590. 5
  42591. 1
  42592. 26217
  42593. 2
  42594. move
  42595. 1
  42596. 50367
  42597. 1
  42598. 26217
  42599. 1
  42600. 56998
  42601. 4
  42602. 5
  42603. 1
  42604. 26217
  42605. 2
  42606. invoke
  42607. 1
  42608. 2
  42609. 1
  42610. 7
  42611. 1
  42612. 56998
  42613. 4
  42614. 5
  42615. 1
  42616. 26217
  42617. 2
  42618. invoke
  42619. 1
  42620. 50367
  42621. 1
  42622. 26217
  42623. 1
  42624. 56998
  42625. 4
  42626. 5
  42627. 1
  42628. 35514
  42629. 2
  42630. d
  42631. 1
  42632. 2
  42633. 1
  42634. 3
  42635. 1
  42636. 56998
  42637. 4
  42638. 3
  42639. 4
  42640. 5
  42641. 1
  42642. 56998
  42643. 2
  42644. tell_lines
  42645. 1
  42646. 2487
  42647. 1
  42648. 6
  42649. 1
  42650. 56998
  42651. 4
  42652. 5
  42653. 1
  42654. 32361
  42655. 2
  42656. look_self
  42657. 1
  42658. 15
  42659. 1
  42660. 6792
  42661. 1
  42662. 56998
  42663. 4
  42664. 5
  42665. 1
  42666. 32361
  42667. 2
  42668. look
  42669. 1
  42670. 2693
  42671. 1
  42672. 258
  42673. 1
  42674. 56998
  42675. 4
  42676. 10
  42677. 4
  42678. 5
  42679. 1
  42680. 54918
  42681. 2
  42682. tell_lines
  42683. 1
  42684. 2487
  42685. 1
  42686. 6
  42687. 1
  42688. 54918
  42689. 4
  42690. 5
  42691. 1
  42692. 24737
  42693. 2
  42694. look_self
  42695. 1
  42696. 2
  42697. 1
  42698. 1
  42699. 1
  42700. 54918
  42701. 4
  42702. 5
  42703. 1
  42704. 24737
  42705. 2
  42706. look_self
  42707. 1
  42708. 2
  42709. 1
  42710. 3
  42711. 1
  42712. 54918
  42713. 4
  42714. 5
  42715. 1
  42716. 24737
  42717. 2
  42718. enterfunc
  42719. 1
  42720. 2
  42721. 1
  42722. 3
  42723. 1
  42724. 54918
  42725. 4
  42726. 5
  42727. 1
  42728. 54918
  42729. 2
  42730. moveto
  42731. 1
  42732. 54918
  42733. 1
  42734. 1
  42735. 1
  42736. 54918
  42737. 4
  42738. 5
  42739. 1
  42740. 54918
  42741. 2
  42742. moveto
  42743. 1
  42744. 47
  42745. 1
  42746. 6
  42747. 1
  42748. 54918
  42749. 4
  42750. 5
  42751. 1
  42752. 54918
  42753. 2
  42754. moveto
  42755. 1
  42756. 47
  42757. 1
  42758. 3133
  42759. 1
  42760. 54918
  42761. 4
  42762. 5
  42763. 1
  42764. 43463
  42765. 2
  42766. move
  42767. 1
  42768. 2
  42769. 1
  42770. 7
  42771. 1
  42772. 54918
  42773. 4
  42774. 5
  42775. 1
  42776. 43463
  42777. 2
  42778. invoke
  42779. 1
  42780. 2
  42781. 1
  42782. 7
  42783. 1
  42784. 54918
  42785. 4
  42786. 5
  42787. 1
  42788. 47200
  42789. 2
  42790. s
  42791. 1
  42792. 2
  42793. 1
  42794. 3
  42795. 1
  42796. 54918
  42797. 4
  42798. 7
  42799. 4
  42800. 5
  42801. 1
  42802. 56872
  42803. 2
  42804. tell_lines
  42805. 1
  42806. 2487
  42807. 1
  42808. 6
  42809. 1
  42810. 56872
  42811. 4
  42812. 5
  42813. 1
  42814. 39439
  42815. 2
  42816. secure
  42817. 1
  42818. 49551
  42819. 1
  42820. 29557
  42821. 1
  42822. 56872
  42823. 4
  42824. 5
  42825. 1
  42826. 39439
  42827. 2
  42828. arm
  42829. 1
  42830. 49551
  42831. 1
  42832. 29557
  42833. 1
  42834. 56872
  42835. 4
  42836. 5
  42837. 1
  42838. 39439
  42839. 2
  42840. say_parse
  42841. 1
  42842. 49551
  42843. 1
  42844. 29557
  42845. 1
  42846. 56872
  42847. 4
  42848. 5
  42849. 1
  42850. 39439
  42851. 2
  42852. announce
  42853. 1
  42854. 49551
  42855. 1
  42856. 29557
  42857. 1
  42858. 56872
  42859. 4
  42860. 5
  42861. 1
  42862. 56872
  42863. 2
  42864. say
  42865. 1
  42866. 57140
  42867. 1
  42868. 49900
  42869. 1
  42870. 56872
  42871. 4
  42872. 5
  42873. 1
  42874. 56872
  42875. 2
  42876. say
  42877. 1
  42878. 19845
  42879. 1
  42880. 5409
  42881. 1
  42882. 56872
  42883. 4
  42884. 4
  42885. 4
  42886. 5
  42887. 1
  42888. 58173
  42889. 2
  42890. tell_lines
  42891. 1
  42892. 2487
  42893. 1
  42894. 6
  42895. 1
  42896. 58173
  42897. 4
  42898. 5
  42899. 1
  42900. 41398
  42901. 2
  42902. secure
  42903. 1
  42904. 49551
  42905. 1
  42906. 29557
  42907. 1
  42908. 58173
  42909. 4
  42910. 5
  42911. 1
  42912. 41398
  42913. 2
  42914. arm
  42915. 1
  42916. 49551
  42917. 1
  42918. 29557
  42919. 1
  42920. 58173
  42921. 4
  42922. 5
  42923. 1
  42924. 41398
  42925. 2
  42926. press
  42927. 1
  42928. 49551
  42929. 1
  42930. 29557
  42931. 1
  42932. 58173
  42933. 4
  42934. 15
  42935. 4
  42936. 5
  42937. 1
  42938. 50367
  42939. 2
  42940. tell_lines
  42941. 1
  42942. 2487
  42943. 1
  42944. 6
  42945. 1
  42946. 50367
  42947. 4
  42948. 5
  42949. 1
  42950. 32361
  42951. 2
  42952. look_self
  42953. 1
  42954. 15
  42955. 1
  42956. 6792
  42957. 1
  42958. 50367
  42959. 4
  42960. 5
  42961. 1
  42962. 32361
  42963. 2
  42964. enterfunc
  42965. 1
  42966. 2
  42967. 1
  42968. 3
  42969. 1
  42970. 50367
  42971. 4
  42972. 5
  42973. 1
  42974. 32361
  42975. 2
  42976. enterfunc
  42977. 1
  42978. 2693
  42979. 1
  42980. 258
  42981. 1
  42982. 50367
  42983. 4
  42984. 5
  42985. 1
  42986. 50367
  42987. 2
  42988. moveto
  42989. 1
  42990. 50367
  42991. 1
  42992. 1
  42993. 1
  42994. 50367
  42995. 4
  42996. 5
  42997. 1
  42998. 50367
  42999. 2
  43000. moveto
  43001. 1
  43002. 47
  43003. 1
  43004. 6
  43005. 1
  43006. 50367
  43007. 4
  43008. 5
  43009. 1
  43010. 50367
  43011. 2
  43012. moveto
  43013. 1
  43014. 47
  43015. 1
  43016. 3133
  43017. 1
  43018. 50367
  43019. 4
  43020. 5
  43021. 1
  43022. 50367
  43023. 2
  43024. moveto
  43025. 1
  43026. 78
  43027. 1
  43028. 7069
  43029. 1
  43030. 50367
  43031. 4
  43032. 5
  43033. 1
  43034. 50367
  43035. 2
  43036. moveto
  43037. 1
  43038. 3685
  43039. 1
  43040. 8855
  43041. 1
  43042. 50367
  43043. 4
  43044. 5
  43045. 1
  43046. 50367
  43047. 2
  43048. moveto
  43049. 1
  43050. 50367
  43051. 1
  43052. 50367
  43053. 1
  43054. 50367
  43055. 4
  43056. 5
  43057. 1
  43058. 26217
  43059. 2
  43060. move
  43061. 1
  43062. 2
  43063. 1
  43064. 7
  43065. 1
  43066. 50367
  43067. 4
  43068. 5
  43069. 1
  43070. 26217
  43071. 2
  43072. move
  43073. 1
  43074. 50367
  43075. 1
  43076. 26217
  43077. 1
  43078. 50367
  43079. 4
  43080. 5
  43081. 1
  43082. 26217
  43083. 2
  43084. invoke
  43085. 1
  43086. 2
  43087. 1
  43088. 7
  43089. 1
  43090. 50367
  43091. 4
  43092. 5
  43093. 1
  43094. 26217
  43095. 2
  43096. invoke
  43097. 1
  43098. 50367
  43099. 1
  43100. 26217
  43101. 1
  43102. 50367
  43103. 4
  43104. 5
  43105. 1
  43106. 35514
  43107. 2
  43108. d
  43109. 1
  43110. 2
  43111. 1
  43112. 3
  43113. 1
  43114. 50367
  43115. 4
  43116. 4
  43117. 4
  43118. 5
  43119. 1
  43120. 57990
  43121. 2
  43122. tell_lines
  43123. 1
  43124. 2487
  43125. 1
  43126. 6
  43127. 1
  43128. 57990
  43129. 4
  43130. 5
  43131. 1
  43132. 52032
  43133. 2
  43134. secure
  43135. 1
  43136. 49551
  43137. 1
  43138. 29557
  43139. 1
  43140. 57990
  43141. 4
  43142. 5
  43143. 1
  43144. 52032
  43145. 2
  43146. arm
  43147. 1
  43148. 49551
  43149. 1
  43150. 29557
  43151. 1
  43152. 57990
  43153. 4
  43154. 5
  43155. 1
  43156. 52032
  43157. 2
  43158. press
  43159. 1
  43160. 49551
  43161. 1
  43162. 29557
  43163. 1
  43164. 57990
  43165. 4
  43166. 4
  43167. 4
  43168. 5
  43169. 1
  43170. 56310
  43171. 2
  43172. tell_lines
  43173. 1
  43174. 2487
  43175. 1
  43176. 6
  43177. 1
  43178. 56310
  43179. 4
  43180. 5
  43181. 1
  43182. 56232
  43183. 2
  43184. secure
  43185. 1
  43186. 49551
  43187. 1
  43188. 29557
  43189. 1
  43190. 56310
  43191. 4
  43192. 5
  43193. 1
  43194. 56232
  43195. 2
  43196. arm
  43197. 1
  43198. 49551
  43199. 1
  43200. 29557
  43201. 1
  43202. 56310
  43203. 4
  43204. 5
  43205. 1
  43206. 56232
  43207. 2
  43208. press
  43209. 1
  43210. 49551
  43211. 1
  43212. 29557
  43213. 1
  43214. 56310
  43215. 4
  43216. 4
  43217. 4
  43218. 5
  43219. 1
  43220. 56311
  43221. 2
  43222. tell_lines
  43223. 1
  43224. 2487
  43225. 1
  43226. 6
  43227. 1
  43228. 56311
  43229. 4
  43230. 5
  43231. 1
  43232. 45919
  43233. 2
  43234. secure
  43235. 1
  43236. 49551
  43237. 1
  43238. 29557
  43239. 1
  43240. 56311
  43241. 4
  43242. 5
  43243. 1
  43244. 45919
  43245. 2
  43246. arm
  43247. 1
  43248. 49551
  43249. 1
  43250. 29557
  43251. 1
  43252. 56311
  43253. 4
  43254. 5
  43255. 1
  43256. 45919
  43257. 2
  43258. press
  43259. 1
  43260. 49551
  43261. 1
  43262. 29557
  43263. 1
  43264. 56311
  43265. 4
  43266. 7
  43267. 4
  43268. 5
  43269. 1
  43270. 52687
  43271. 2
  43272. tell_lines
  43273. 1
  43274. 2487
  43275. 1
  43276. 6
  43277. 1
  43278. 52687
  43279. 4
  43280. 5
  43281. 1
  43282. 11461
  43283. 2
  43284. secure
  43285. 1
  43286. 49551
  43287. 1
  43288. 29557
  43289. 1
  43290. 52687
  43291. 4
  43292. 5
  43293. 1
  43294. 11461
  43295. 2
  43296. arm
  43297. 1
  43298. 49551
  43299. 1
  43300. 29557
  43301. 1
  43302. 52687
  43303. 4
  43304. 5
  43305. 1
  43306. 11461
  43307. 2
  43308. say_parse
  43309. 1
  43310. 49551
  43311. 1
  43312. 29557
  43313. 1
  43314. 52687
  43315. 4
  43316. 5
  43317. 1
  43318. 11461
  43319. 2
  43320. announce
  43321. 1
  43322. 49551
  43323. 1
  43324. 29557
  43325. 1
  43326. 52687
  43327. 4
  43328. 5
  43329. 1
  43330. 11461
  43331. 2
  43332. say
  43333. 1
  43334. 2
  43335. 1
  43336. 3
  43337. 1
  43338. 52687
  43339. 4
  43340. 5
  43341. 1
  43342. 52687
  43343. 2
  43344. say
  43345. 1
  43346. 31783
  43347. 1
  43348. 4803
  43349. 1
  43350. 52687
  43351. 4
  43352. 4
  43353. 4
  43354. 5
  43355. 1
  43356. 57892
  43357. 2
  43358. tell_lines
  43359. 1
  43360. 2487
  43361. 1
  43362. 6
  43363. 1
  43364. 57892
  43365. 4
  43366. 5
  43367. 1
  43368. 22838
  43369. 2
  43370. secure
  43371. 1
  43372. 49551
  43373. 1
  43374. 29557
  43375. 1
  43376. 57892
  43377. 4
  43378. 5
  43379. 1
  43380. 22838
  43381. 2
  43382. arm
  43383. 1
  43384. 49551
  43385. 1
  43386. 29557
  43387. 1
  43388. 57892
  43389. 4
  43390. 5
  43391. 1
  43392. 22838
  43393. 2
  43394. press
  43395. 1
  43396. 49551
  43397. 1
  43398. 29557
  43399. 1
  43400. 57892
  43401. 4
  43402. 7
  43403. 4
  43404. 5
  43405. 1
  43406. 57531
  43407. 2
  43408. tell_lines
  43409. 1
  43410. 2487
  43411. 1
  43412. 6
  43413. 1
  43414. 57531
  43415. 4
  43416. 5
  43417. 1
  43418. 53249
  43419. 2
  43420. secure
  43421. 1
  43422. 49551
  43423. 1
  43424. 29557
  43425. 1
  43426. 57531
  43427. 4
  43428. 5
  43429. 1
  43430. 53249
  43431. 2
  43432. arm
  43433. 1
  43434. 49551
  43435. 1
  43436. 29557
  43437. 1
  43438. 57531
  43439. 4
  43440. 5
  43441. 1
  43442. 53249
  43443. 2
  43444. say_parse
  43445. 1
  43446. 49551
  43447. 1
  43448. 29557
  43449. 1
  43450. 57531
  43451. 4
  43452. 5
  43453. 1
  43454. 53249
  43455. 2
  43456. announce
  43457. 1
  43458. 49551
  43459. 1
  43460. 29557
  43461. 1
  43462. 57531
  43463. 4
  43464. 5
  43465. 1
  43466. 53249
  43467. 2
  43468. say
  43469. 1
  43470. 2
  43471. 1
  43472. 3
  43473. 1
  43474. 57531
  43475. 4
  43476. 5
  43477. 1
  43478. 57531
  43479. 2
  43480. say
  43481. 1
  43482. 31783
  43483. 1
  43484. 4803
  43485. 1
  43486. 57531
  43487. 4
  43488. 7
  43489. 4
  43490. 5
  43491. 1
  43492. 57531
  43493. 2
  43494. tell_lines
  43495. 1
  43496. 2487
  43497. 1
  43498. 6
  43499. 1
  43500. 57531
  43501. 4
  43502. 5
  43503. 1
  43504. 53249
  43505. 2
  43506. secure
  43507. 1
  43508. 49551
  43509. 1
  43510. 29557
  43511. 1
  43512. 57531
  43513. 4
  43514. 5
  43515. 1
  43516. 53249
  43517. 2
  43518. arm
  43519. 1
  43520. 49551
  43521. 1
  43522. 29557
  43523. 1
  43524. 57531
  43525. 4
  43526. 5
  43527. 1
  43528. 53249
  43529. 2
  43530. say_parse
  43531. 1
  43532. 49551
  43533. 1
  43534. 29557
  43535. 1
  43536. 57531
  43537. 4
  43538. 5
  43539. 1
  43540. 53249
  43541. 2
  43542. announce
  43543. 1
  43544. 49551
  43545. 1
  43546. 29557
  43547. 1
  43548. 57531
  43549. 4
  43550. 5
  43551. 1
  43552. 53249
  43553. 2
  43554. say
  43555. 1
  43556. 2
  43557. 1
  43558. 3
  43559. 1
  43560. 57531
  43561. 4
  43562. 5
  43563. 1
  43564. 57531
  43565. 2
  43566. say
  43567. 1
  43568. 31783
  43569. 1
  43570. 4803
  43571. 1
  43572. 57531
  43573. 4
  43574. 4
  43575. 4
  43576. 5
  43577. 1
  43578. 58091
  43579. 2
  43580. tell_lines
  43581. 1
  43582. 2487
  43583. 1
  43584. 6
  43585. 1
  43586. 58091
  43587. 4
  43588. 5
  43589. 1
  43590. 13455
  43591. 2
  43592. secure
  43593. 1
  43594. 49551
  43595. 1
  43596. 29557
  43597. 1
  43598. 58091
  43599. 4
  43600. 5
  43601. 1
  43602. 13455
  43603. 2
  43604. arm
  43605. 1
  43606. 49551
  43607. 1
  43608. 29557
  43609. 1
  43610. 58091
  43611. 4
  43612. 5
  43613. 1
  43614. 13455
  43615. 2
  43616. press
  43617. 1
  43618. 49551
  43619. 1
  43620. 29557
  43621. 1
  43622. 58091
  43623. 4
  43624. 4
  43625. 4
  43626. 5
  43627. 1
  43628. 58173
  43629. 2
  43630. tell_lines
  43631. 1
  43632. 2487
  43633. 1
  43634. 6
  43635. 1
  43636. 58173
  43637. 4
  43638. 5
  43639. 1
  43640. 41398
  43641. 2
  43642. secure
  43643. 1
  43644. 49551
  43645. 1
  43646. 29557
  43647. 1
  43648. 58173
  43649. 4
  43650. 5
  43651. 1
  43652. 41398
  43653. 2
  43654. arm
  43655. 1
  43656. 49551
  43657. 1
  43658. 29557
  43659. 1
  43660. 58173
  43661. 4
  43662. 5
  43663. 1
  43664. 41398
  43665. 2
  43666. press
  43667. 1
  43668. 49551
  43669. 1
  43670. 29557
  43671. 1
  43672. 58173
  43673. 4
  43674. 5
  43675. 4
  43676. 5
  43677. 1
  43678. 57998
  43679. 2
  43680. tell_lines
  43681. 1
  43682. 2487
  43683. 1
  43684. 6
  43685. 1
  43686. 57998
  43687. 4
  43688. 5
  43689. 1
  43690. 57998
  43691. 2
  43692. look_self
  43693. 1
  43694. 15
  43695. 1
  43696. 7069
  43697. 1
  43698. 57998
  43699. 4
  43700. 5
  43701. 1
  43702. 31788
  43703. 2
  43704. special_look
  43705. 1
  43706. 31783
  43707. 1
  43708. 9805
  43709. 1
  43710. 57998
  43711. 4
  43712. 5
  43713. 1
  43714. 31788
  43715. 2
  43716. l
  43717. 1
  43718. 31783
  43719. 1
  43720. 9805
  43721. 1
  43722. 57998
  43723. 4
  43724. 5
  43725. 1
  43726. 31788
  43727. 2
  43728. l
  43729. 1
  43730. 49551
  43731. 1
  43732. 29557
  43733. 1
  43734. 57998
  43735. 4
  43736. 7
  43737. 4
  43738. 5
  43739. 1
  43740. 56263
  43741. 2
  43742. tell_lines
  43743. 1
  43744. 2487
  43745. 1
  43746. 6
  43747. 1
  43748. 56263
  43749. 4
  43750. 5
  43751. 1
  43752. 55879
  43753. 2
  43754. secure
  43755. 1
  43756. 49551
  43757. 1
  43758. 29557
  43759. 1
  43760. 56263
  43761. 4
  43762. 5
  43763. 1
  43764. 55879
  43765. 2
  43766. arm
  43767. 1
  43768. 49551
  43769. 1
  43770. 29557
  43771. 1
  43772. 56263
  43773. 4
  43774. 5
  43775. 1
  43776. 55879
  43777. 2
  43778. say_parse
  43779. 1
  43780. 49551
  43781. 1
  43782. 29557
  43783. 1
  43784. 56263
  43785. 4
  43786. 5
  43787. 1
  43788. 55879
  43789. 2
  43790. announce
  43791. 1
  43792. 49551
  43793. 1
  43794. 29557
  43795. 1
  43796. 56263
  43797. 4
  43798. 5
  43799. 1
  43800. 56263
  43801. 2
  43802. say
  43803. 1
  43804. 57140
  43805. 1
  43806. 49900
  43807. 1
  43808. 56263
  43809. 4
  43810. 5
  43811. 1
  43812. 56263
  43813. 2
  43814. say
  43815. 1
  43816. 19845
  43817. 1
  43818. 5409
  43819. 1
  43820. 56263
  43821. 4
  43822. 14
  43823. 4
  43824. 5
  43825. 1
  43826. 50367
  43827. 2
  43828. tell_lines
  43829. 1
  43830. 2487
  43831. 1
  43832. 6
  43833. 1
  43834. 50367
  43835. 4
  43836. 5
  43837. 1
  43838. 32361
  43839. 2
  43840. look_self
  43841. 1
  43842. 15
  43843. 1
  43844. 6792
  43845. 1
  43846. 50367
  43847. 4
  43848. 5
  43849. 1
  43850. 32361
  43851. 2
  43852. enterfunc
  43853. 1
  43854. 2
  43855. 1
  43856. 3
  43857. 1
  43858. 50367
  43859. 4
  43860. 5
  43861. 1
  43862. 32361
  43863. 2
  43864. enterfunc
  43865. 1
  43866. 2693
  43867. 1
  43868. 258
  43869. 1
  43870. 50367
  43871. 4
  43872. 5
  43873. 1
  43874. 50367
  43875. 2
  43876. moveto
  43877. 1
  43878. 50367
  43879. 1
  43880. 1
  43881. 1
  43882. 50367
  43883. 4
  43884. 5
  43885. 1
  43886. 50367
  43887. 2
  43888. moveto
  43889. 1
  43890. 47
  43891. 1
  43892. 6
  43893. 1
  43894. 50367
  43895. 4
  43896. 5
  43897. 1
  43898. 50367
  43899. 2
  43900. moveto
  43901. 1
  43902. 47
  43903. 1
  43904. 3133
  43905. 1
  43906. 50367
  43907. 4
  43908. 5
  43909. 1
  43910. 50367
  43911. 2
  43912. moveto
  43913. 1
  43914. 78
  43915. 1
  43916. 7069
  43917. 1
  43918. 50367
  43919. 4
  43920. 5
  43921. 1
  43922. 50367
  43923. 2
  43924. moveto
  43925. 1
  43926. 3685
  43927. 1
  43928. 8855
  43929. 1
  43930. 50367
  43931. 4
  43932. 5
  43933. 1
  43934. 26217
  43935. 2
  43936. move
  43937. 1
  43938. 2
  43939. 1
  43940. 7
  43941. 1
  43942. 50367
  43943. 4
  43944. 5
  43945. 1
  43946. 26217
  43947. 2
  43948. move
  43949. 1
  43950. 50367
  43951. 1
  43952. 26217
  43953. 1
  43954. 50367
  43955. 4
  43956. 5
  43957. 1
  43958. 26217
  43959. 2
  43960. invoke
  43961. 1
  43962. 2
  43963. 1
  43964. 7
  43965. 1
  43966. 50367
  43967. 4
  43968. 5
  43969. 1
  43970. 26217
  43971. 2
  43972. invoke
  43973. 1
  43974. 50367
  43975. 1
  43976. 26217
  43977. 1
  43978. 50367
  43979. 4
  43980. 5
  43981. 1
  43982. 35514
  43983. 2
  43984. d
  43985. 1
  43986. 2
  43987. 1
  43988. 3
  43989. 1
  43990. 50367
  43991. 4
  43992. 14
  43993. 4
  43994. 5
  43995. 1
  43996. 29209
  43997. 2
  43998. tell_lines
  43999. 1
  44000. 2487
  44001. 1
  44002. 6
  44003. 1
  44004. 29209
  44005. 4
  44006. 5
  44007. 1
  44008. 32361
  44009. 2
  44010. look_self
  44011. 1
  44012. 15
  44013. 1
  44014. 6792
  44015. 1
  44016. 29209
  44017. 4
  44018. 5
  44019. 1
  44020. 32361
  44021. 2
  44022. enterfunc
  44023. 1
  44024. 2
  44025. 1
  44026. 3
  44027. 1
  44028. 29209
  44029. 4
  44030. 5
  44031. 1
  44032. 32361
  44033. 2
  44034. enterfunc
  44035. 1
  44036. 2693
  44037. 1
  44038. 258
  44039. 1
  44040. 29209
  44041. 4
  44042. 5
  44043. 1
  44044. 29209
  44045. 2
  44046. moveto
  44047. 1
  44048. 29209
  44049. 1
  44050. 1
  44051. 1
  44052. 29209
  44053. 4
  44054. 5
  44055. 1
  44056. 29209
  44057. 2
  44058. moveto
  44059. 1
  44060. 47
  44061. 1
  44062. 6
  44063. 1
  44064. 29209
  44065. 4
  44066. 5
  44067. 1
  44068. 29209
  44069. 2
  44070. moveto
  44071. 1
  44072. 47
  44073. 1
  44074. 3133
  44075. 1
  44076. 29209
  44077. 4
  44078. 5
  44079. 1
  44080. 29209
  44081. 2
  44082. moveto
  44083. 1
  44084. 78
  44085. 1
  44086. 7069
  44087. 1
  44088. 29209
  44089. 4
  44090. 5
  44091. 1
  44092. 29209
  44093. 2
  44094. moveto
  44095. 1
  44096. 3685
  44097. 1
  44098. 8855
  44099. 1
  44100. 29209
  44101. 4
  44102. 5
  44103. 1
  44104. 26217
  44105. 2
  44106. move
  44107. 1
  44108. 2
  44109. 1
  44110. 7
  44111. 1
  44112. 29209
  44113. 4
  44114. 5
  44115. 1
  44116. 26217
  44117. 2
  44118. move
  44119. 1
  44120. 50367
  44121. 1
  44122. 26217
  44123. 1
  44124. 29209
  44125. 4
  44126. 5
  44127. 1
  44128. 26217
  44129. 2
  44130. invoke
  44131. 1
  44132. 2
  44133. 1
  44134. 7
  44135. 1
  44136. 29209
  44137. 4
  44138. 5
  44139. 1
  44140. 26217
  44141. 2
  44142. invoke
  44143. 1
  44144. 50367
  44145. 1
  44146. 26217
  44147. 1
  44148. 29209
  44149. 4
  44150. 5
  44151. 1
  44152. 35514
  44153. 2
  44154. d
  44155. 1
  44156. 2
  44157. 1
  44158. 3
  44159. 1
  44160. 29209
  44161. 4
  44162. 4
  44163. 4
  44164. 5
  44165. 1
  44166. 56310
  44167. 2
  44168. tell_lines
  44169. 1
  44170. 2487
  44171. 1
  44172. 6
  44173. 1
  44174. 56310
  44175. 4
  44176. 5
  44177. 1
  44178. 56232
  44179. 2
  44180. secure
  44181. 1
  44182. 49551
  44183. 1
  44184. 29557
  44185. 1
  44186. 56310
  44187. 4
  44188. 5
  44189. 1
  44190. 56232
  44191. 2
  44192. arm
  44193. 1
  44194. 49551
  44195. 1
  44196. 29557
  44197. 1
  44198. 56310
  44199. 4
  44200. 5
  44201. 1
  44202. 56232
  44203. 2
  44204. press
  44205. 1
  44206. 49551
  44207. 1
  44208. 29557
  44209. 1
  44210. 56310
  44211. 4
  44212. 4
  44213. 4
  44214. 5
  44215. 1
  44216. 35404
  44217. 2
  44218. tell_lines
  44219. 1
  44220. 2487
  44221. 1
  44222. 6
  44223. 1
  44224. 35404
  44225. 4
  44226. 5
  44227. 1
  44228. 34623
  44229. 2
  44230. secure
  44231. 1
  44232. 49551
  44233. 1
  44234. 29557
  44235. 1
  44236. 35404
  44237. 4
  44238. 5
  44239. 1
  44240. 34623
  44241. 2
  44242. arm
  44243. 1
  44244. 49551
  44245. 1
  44246. 29557
  44247. 1
  44248. 35404
  44249. 4
  44250. 5
  44251. 1
  44252. 34623
  44253. 2
  44254. press
  44255. 1
  44256. 49551
  44257. 1
  44258. 29557
  44259. 1
  44260. 35404
  44261. 4
  44262. 4
  44263. 4
  44264. 5
  44265. 1
  44266. 56819
  44267. 2
  44268. tell_lines
  44269. 1
  44270. 2487
  44271. 1
  44272. 6
  44273. 1
  44274. 56819
  44275. 4
  44276. 5
  44277. 1
  44278. 53010
  44279. 2
  44280. secure
  44281. 1
  44282. 49551
  44283. 1
  44284. 29557
  44285. 1
  44286. 56819
  44287. 4
  44288. 5
  44289. 1
  44290. 53010
  44291. 2
  44292. arm
  44293. 1
  44294. 49551
  44295. 1
  44296. 29557
  44297. 1
  44298. 56819
  44299. 4
  44300. 5
  44301. 1
  44302. 53010
  44303. 2
  44304. press
  44305. 1
  44306. 49551
  44307. 1
  44308. 29557
  44309. 1
  44310. 56819
  44311. 4
  44312. 7
  44313. 4
  44314. 5
  44315. 1
  44316. 57531
  44317. 2
  44318. tell_lines
  44319. 1
  44320. 2487
  44321. 1
  44322. 6
  44323. 1
  44324. 57531
  44325. 4
  44326. 5
  44327. 1
  44328. 53249
  44329. 2
  44330. secure
  44331. 1
  44332. 49551
  44333. 1
  44334. 29557
  44335. 1
  44336. 57531
  44337. 4
  44338. 5
  44339. 1
  44340. 53249
  44341. 2
  44342. arm
  44343. 1
  44344. 49551
  44345. 1
  44346. 29557
  44347. 1
  44348. 57531
  44349. 4
  44350. 5
  44351. 1
  44352. 53249
  44353. 2
  44354. say_parse
  44355. 1
  44356. 49551
  44357. 1
  44358. 29557
  44359. 1
  44360. 57531
  44361. 4
  44362. 5
  44363. 1
  44364. 53249
  44365. 2
  44366. announce
  44367. 1
  44368. 49551
  44369. 1
  44370. 29557
  44371. 1
  44372. 57531
  44373. 4
  44374. 5
  44375. 1
  44376. 53249
  44377. 2
  44378. say
  44379. 1
  44380. 2
  44381. 1
  44382. 3
  44383. 1
  44384. 57531
  44385. 4
  44386. 5
  44387. 1
  44388. 57531
  44389. 2
  44390. say
  44391. 1
  44392. 31783
  44393. 1
  44394. 4803
  44395. 1
  44396. 57531
  44397. 4
  44398. 7
  44399. 4
  44400. 5
  44401. 1
  44402. 57531
  44403. 2
  44404. tell_lines
  44405. 1
  44406. 2487
  44407. 1
  44408. 6
  44409. 1
  44410. 57531
  44411. 4
  44412. 5
  44413. 1
  44414. 53249
  44415. 2
  44416. secure
  44417. 1
  44418. 49551
  44419. 1
  44420. 29557
  44421. 1
  44422. 57531
  44423. 4
  44424. 5
  44425. 1
  44426. 53249
  44427. 2
  44428. arm
  44429. 1
  44430. 49551
  44431. 1
  44432. 29557
  44433. 1
  44434. 57531
  44435. 4
  44436. 5
  44437. 1
  44438. 53249
  44439. 2
  44440. say_parse
  44441. 1
  44442. 49551
  44443. 1
  44444. 29557
  44445. 1
  44446. 57531
  44447. 4
  44448. 5
  44449. 1
  44450. 53249
  44451. 2
  44452. announce
  44453. 1
  44454. 49551
  44455. 1
  44456. 29557
  44457. 1
  44458. 57531
  44459. 4
  44460. 5
  44461. 1
  44462. 53249
  44463. 2
  44464. say
  44465. 1
  44466. 2
  44467. 1
  44468. 3
  44469. 1
  44470. 57531
  44471. 4
  44472. 5
  44473. 1
  44474. 57531
  44475. 2
  44476. say
  44477. 1
  44478. 31783
  44479. 1
  44480. 4803
  44481. 1
  44482. 57531
  44483. 4
  44484. 6
  44485. 4
  44486. 5
  44487. 1
  44488. 57998
  44489. 2
  44490. tell_lines
  44491. 1
  44492. 2487
  44493. 1
  44494. 6
  44495. 1
  44496. 57998
  44497. 4
  44498. 5
  44499. 1
  44500. 31788
  44501. 2
  44502. secure
  44503. 1
  44504. 49551
  44505. 1
  44506. 29557
  44507. 1
  44508. 57998
  44509. 4
  44510. 5
  44511. 1
  44512. 31788
  44513. 2
  44514. arm
  44515. 1
  44516. 49551
  44517. 1
  44518. 29557
  44519. 1
  44520. 57998
  44521. 4
  44522. 5
  44523. 1
  44524. 31788
  44525. 2
  44526. say_parse
  44527. 1
  44528. 49551
  44529. 1
  44530. 29557
  44531. 1
  44532. 57998
  44533. 4
  44534. 5
  44535. 1
  44536. 31788
  44537. 2
  44538. announce
  44539. 1
  44540. 49551
  44541. 1
  44542. 29557
  44543. 1
  44544. 57998
  44545. 4
  44546. 5
  44547. 1
  44548. 31788
  44549. 2
  44550. say
  44551. 1
  44552. 2
  44553. 1
  44554. 3
  44555. 1
  44556. 57998
  44557. 4
  44558. 4
  44559. 4
  44560. 5
  44561. 1
  44562. 55718
  44563. 2
  44564. tell_lines
  44565. 1
  44566. 2487
  44567. 1
  44568. 6
  44569. 1
  44570. 55718
  44571. 4
  44572. 5
  44573. 1
  44574. -1
  44575. 2
  44576.  
  44577. 1
  44578. 55718
  44579. 1
  44580. -1
  44581. 1
  44582. 55718
  44583. 4
  44584. 5
  44585. 1
  44586. 55718
  44587. 2
  44588. eval_cmd_string
  44589. 1
  44590. 55718
  44591. 1
  44592. 217
  44593. 1
  44594. 55718
  44595. 4
  44596. 5
  44597. 1
  44598. 55718
  44599. 2
  44600. eval
  44601. 1
  44602. 55718
  44603. 1
  44604. 217
  44605. 1
  44606. 55718
  44607. 4
  44608. 4
  44609. 4
  44610. 5
  44611. 1
  44612. 55718
  44613. 2
  44614. tell_lines
  44615. 1
  44616. 2487
  44617. 1
  44618. 6
  44619. 1
  44620. 55718
  44621. 4
  44622. 5
  44623. 1
  44624. -1
  44625. 2
  44626.  
  44627. 1
  44628. 55718
  44629. 1
  44630. -1
  44631. 1
  44632. 55718
  44633. 4
  44634. 5
  44635. 1
  44636. 55718
  44637. 2
  44638. eval_cmd_string
  44639. 1
  44640. 55718
  44641. 1
  44642. 217
  44643. 1
  44644. 55718
  44645. 4
  44646. 5
  44647. 1
  44648. 55718
  44649. 2
  44650. eval
  44651. 1
  44652. 55718
  44653. 1
  44654. 217
  44655. 1
  44656. 55718
  44657. 4
  44658. 2
  44659. 4
  44660. 5
  44661. 1
  44662. 58217
  44663. 2
  44664. tell_lines
  44665. 1
  44666. 2487
  44667. 1
  44668. 6
  44669. 1
  44670. 58217
  44671. 4
  44672. 5
  44673. 1
  44674. 16175
  44675. 2
  44676. check
  44677. 1
  44678. 19845
  44679. 1
  44680. 53431
  44681. 1
  44682. 58217
  44683. 4
  44684. 7
  44685. 4
  44686. 5
  44687. 1
  44688. 57956
  44689. 2
  44690. tell_lines
  44691. 1
  44692. 2487
  44693. 1
  44694. 6
  44695. 1
  44696. 57956
  44697. 4
  44698. 5
  44699. 1
  44700. 45245
  44701. 2
  44702. secure
  44703. 1
  44704. 49551
  44705. 1
  44706. 29557
  44707. 1
  44708. 57956
  44709. 4
  44710. 5
  44711. 1
  44712. 45245
  44713. 2
  44714. arm
  44715. 1
  44716. 49551
  44717. 1
  44718. 29557
  44719. 1
  44720. 57956
  44721. 4
  44722. 5
  44723. 1
  44724. 45245
  44725. 2
  44726. say_parse
  44727. 1
  44728. 49551
  44729. 1
  44730. 29557
  44731. 1
  44732. 57956
  44733. 4
  44734. 5
  44735. 1
  44736. 45245
  44737. 2
  44738. announce
  44739. 1
  44740. 49551
  44741. 1
  44742. 29557
  44743. 1
  44744. 57956
  44745. 4
  44746. 5
  44747. 1
  44748. 45245
  44749. 2
  44750. say
  44751. 1
  44752. 2
  44753. 1
  44754. 3
  44755. 1
  44756. 57956
  44757. 4
  44758. 5
  44759. 1
  44760. 57956
  44761. 2
  44762. say
  44763. 1
  44764. 24436
  44765. 1
  44766. 10068
  44767. 1
  44768. 57956
  44769. 4
  44770. 7
  44771. 4
  44772. 5
  44773. 1
  44774. 57956
  44775. 2
  44776. tell_lines
  44777. 1
  44778. 2487
  44779. 1
  44780. 6
  44781. 1
  44782. 57956
  44783. 4
  44784. 5
  44785. 1
  44786. 45245
  44787. 2
  44788. secure
  44789. 1
  44790. 49551
  44791. 1
  44792. 29557
  44793. 1
  44794. 57956
  44795. 4
  44796. 5
  44797. 1
  44798. 45245
  44799. 2
  44800. arm
  44801. 1
  44802. 49551
  44803. 1
  44804. 29557
  44805. 1
  44806. 57956
  44807. 4
  44808. 5
  44809. 1
  44810. 45245
  44811. 2
  44812. say_parse
  44813. 1
  44814. 49551
  44815. 1
  44816. 29557
  44817. 1
  44818. 57956
  44819. 4
  44820. 5
  44821. 1
  44822. 45245
  44823. 2
  44824. announce
  44825. 1
  44826. 49551
  44827. 1
  44828. 29557
  44829. 1
  44830. 57956
  44831. 4
  44832. 5
  44833. 1
  44834. 45245
  44835. 2
  44836. say
  44837. 1
  44838. 2
  44839. 1
  44840. 3
  44841. 1
  44842. 57956
  44843. 4
  44844. 5
  44845. 1
  44846. 57956
  44847. 2
  44848. say
  44849. 1
  44850. 24436
  44851. 1
  44852. 10068
  44853. 1
  44854. 57956
  44855. 4
  44856. 6
  44857. 4
  44858. 5
  44859. 1
  44860. 30246
  44861. 2
  44862. tell_lines
  44863. 1
  44864. 2487
  44865. 1
  44866. 6
  44867. 1
  44868. 30246
  44869. 4
  44870. 5
  44871. 1
  44872. 25476
  44873. 2
  44874. secure
  44875. 1
  44876. 49551
  44877. 1
  44878. 29557
  44879. 1
  44880. 30246
  44881. 4
  44882. 5
  44883. 1
  44884. 25476
  44885. 2
  44886. arm
  44887. 1
  44888. 49551
  44889. 1
  44890. 29557
  44891. 1
  44892. 30246
  44893. 4
  44894. 5
  44895. 1
  44896. 25476
  44897. 2
  44898. say_parse
  44899. 1
  44900. 49551
  44901. 1
  44902. 29557
  44903. 1
  44904. 30246
  44905. 4
  44906. 5
  44907. 1
  44908. 25476
  44909. 2
  44910. announce
  44911. 1
  44912. 49551
  44913. 1
  44914. 29557
  44915. 1
  44916. 30246
  44917. 4
  44918. 5
  44919. 1
  44920. 30246
  44921. 2
  44922. say
  44923. 1
  44924. 57140
  44925. 1
  44926. 49900
  44927. 1
  44928. 30246
  44929. 4
  44930. 2
  44931. 4
  44932. 5
  44933. 1
  44934. 48961
  44935. 2
  44936. tell_lines
  44937. 1
  44938. 2487
  44939. 1
  44940. 6
  44941. 1
  44942. 48961
  44943. 4
  44944. 5
  44945. 1
  44946. 6776
  44947. 2
  44948. @roomo
  44949. 1
  44950. 48961
  44951. 1
  44952. 6776
  44953. 1
  44954. 48961
  44955. 4
  44956. 2
  44957. 4
  44958. 5
  44959. 1
  44960. 48961
  44961. 2
  44962. tell_lines
  44963. 1
  44964. 2487
  44965. 1
  44966. 6
  44967. 1
  44968. 48961
  44969. 4
  44970. 5
  44971. 1
  44972. 6776
  44973. 2
  44974. @roomo
  44975. 1
  44976. 48961
  44977. 1
  44978. 6776
  44979. 1
  44980. 48961
  44981. 4
  44982. 2
  44983. 4
  44984. 5
  44985. 1
  44986. 48961
  44987. 2
  44988. tell_lines
  44989. 1
  44990. 2487
  44991. 1
  44992. 6
  44993. 1
  44994. 48961
  44995. 4
  44996. 5
  44997. 1
  44998. 6776
  44999. 2
  45000. @roomo
  45001. 1
  45002. 48961
  45003. 1
  45004. 6776
  45005. 1
  45006. 48961
  45007. 4
  45008. 4
  45009. 4
  45010. 5
  45011. 1
  45012. 58172
  45013. 2
  45014. tell_lines
  45015. 1
  45016. 2487
  45017. 1
  45018. 6
  45019. 1
  45020. 58172
  45021. 4
  45022. 5
  45023. 1
  45024. 56555
  45025. 2
  45026. secure
  45027. 1
  45028. 49551
  45029. 1
  45030. 29557
  45031. 1
  45032. 58172
  45033. 4
  45034. 5
  45035. 1
  45036. 56555
  45037. 2
  45038. arm
  45039. 1
  45040. 49551
  45041. 1
  45042. 29557
  45043. 1
  45044. 58172
  45045. 4
  45046. 5
  45047. 1
  45048. 56555
  45049. 2
  45050. press
  45051. 1
  45052. 49551
  45053. 1
  45054. 29557
  45055. 1
  45056. 58172
  45057. 4
  45058. 7
  45059. 4
  45060. 5
  45061. 1
  45062. 34107
  45063. 2
  45064. tell_lines
  45065. 1
  45066. 2487
  45067. 1
  45068. 6
  45069. 1
  45070. 34107
  45071. 4
  45072. 5
  45073. 1
  45074. 58228
  45075. 2
  45076. @antisocial
  45077. 1
  45078. 34107
  45079. 1
  45080. 58228
  45081. 1
  45082. 34107
  45083. 4
  45084. 5
  45085. 1
  45086. 34107
  45087. 2
  45088. my_huh
  45089. 1
  45090. 34107
  45091. 1
  45092. 6
  45093. 1
  45094. 34107
  45095. 4
  45096. 5
  45097. 1
  45098. 34107
  45099. 2
  45100. my_huh
  45101. 1
  45102. 78
  45103. 1
  45104. 7069
  45105. 1
  45106. 34107
  45107. 4
  45108. 5
  45109. 1
  45110. 34107
  45111. 2
  45112. my_huh
  45113. 1
  45114. 24442
  45115. 1
  45116. 26026
  45117. 1
  45118. 34107
  45119. 4
  45120. 5
  45121. 1
  45122. 219
  45123. 2
  45124. do_huh
  45125. 1
  45126. 34107
  45127. 1
  45128. 219
  45129. 1
  45130. 34107
  45131. 4
  45132. 5
  45133. 1
  45134. 7944
  45135. 2
  45136. @antisocial
  45137. 1
  45138. 34107
  45139. 1
  45140. 1
  45141. 1
  45142. 34107
  45143. 4
  45144. 4
  45145. 4
  45146. 5
  45147. 1
  45148. 53502
  45149. 2
  45150. tell_lines
  45151. 1
  45152. 2487
  45153. 1
  45154. 6
  45155. 1
  45156. 53502
  45157. 4
  45158. 5
  45159. 1
  45160. 53245
  45161. 2
  45162. secure
  45163. 1
  45164. 49551
  45165. 1
  45166. 29557
  45167. 1
  45168. 53502
  45169. 4
  45170. 5
  45171. 1
  45172. 53245
  45173. 2
  45174. arm
  45175. 1
  45176. 49551
  45177. 1
  45178. 29557
  45179. 1
  45180. 53502
  45181. 4
  45182. 5
  45183. 1
  45184. 53245
  45185. 2
  45186. press
  45187. 1
  45188. 49551
  45189. 1
  45190. 29557
  45191. 1
  45192. 53502
  45193. 4
  45194. 6
  45195. 4
  45196. 5
  45197. 1
  45198. 57867
  45199. 2
  45200. tell_lines
  45201. 1
  45202. 2487
  45203. 1
  45204. 6
  45205. 1
  45206. 57867
  45207. 4
  45208. 5
  45209. 1
  45210. 36302
  45211. 2
  45212. secure
  45213. 1
  45214. 49551
  45215. 1
  45216. 29557
  45217. 1
  45218. 57867
  45219. 4
  45220. 5
  45221. 1
  45222. 36302
  45223. 2
  45224. arm
  45225. 1
  45226. 49551
  45227. 1
  45228. 29557
  45229. 1
  45230. 57867
  45231. 4
  45232. 5
  45233. 1
  45234. 36302
  45235. 2
  45236. say_parse
  45237. 1
  45238. 49551
  45239. 1
  45240. 29557
  45241. 1
  45242. 57867
  45243. 4
  45244. 5
  45245. 1
  45246. 36302
  45247. 2
  45248. announce
  45249. 1
  45250. 49551
  45251. 1
  45252. 29557
  45253. 1
  45254. 57867
  45255. 4
  45256. 5
  45257. 1
  45258. 36302
  45259. 2
  45260. say
  45261. 1
  45262. 2
  45263. 1
  45264. 3
  45265. 1
  45266. 57867
  45267. 4
  45268. 6
  45269. 4
  45270. 5
  45271. 1
  45272. 57919
  45273. 2
  45274. tell_lines
  45275. 1
  45276. 2487
  45277. 1
  45278. 6
  45279. 1
  45280. 57919
  45281. 4
  45282. 5
  45283. 1
  45284. 20584
  45285. 2
  45286. secure
  45287. 1
  45288. 49551
  45289. 1
  45290. 29557
  45291. 1
  45292. 57919
  45293. 4
  45294. 5
  45295. 1
  45296. 20584
  45297. 2
  45298. arm
  45299. 1
  45300. 49551
  45301. 1
  45302. 29557
  45303. 1
  45304. 57919
  45305. 4
  45306. 5
  45307. 1
  45308. 20584
  45309. 2
  45310. say_parse
  45311. 1
  45312. 49551
  45313. 1
  45314. 29557
  45315. 1
  45316. 57919
  45317. 4
  45318. 5
  45319. 1
  45320. 20584
  45321. 2
  45322. announce
  45323. 1
  45324. 49551
  45325. 1
  45326. 29557
  45327. 1
  45328. 57919
  45329. 4
  45330. 5
  45331. 1
  45332. 20584
  45333. 2
  45334. say
  45335. 1
  45336. 2
  45337. 1
  45338. 3
  45339. 1
  45340. 57919
  45341. 4
  45342. 4
  45343. 4
  45344. 5
  45345. 1
  45346. 58173
  45347. 2
  45348. tell_lines
  45349. 1
  45350. 2487
  45351. 1
  45352. 6
  45353. 1
  45354. 58173
  45355. 4
  45356. 5
  45357. 1
  45358. 41398
  45359. 2
  45360. secure
  45361. 1
  45362. 49551
  45363. 1
  45364. 29557
  45365. 1
  45366. 58173
  45367. 4
  45368. 5
  45369. 1
  45370. 41398
  45371. 2
  45372. arm
  45373. 1
  45374. 49551
  45375. 1
  45376. 29557
  45377. 1
  45378. 58173
  45379. 4
  45380. 5
  45381. 1
  45382. 41398
  45383. 2
  45384. press
  45385. 1
  45386. 49551
  45387. 1
  45388. 29557
  45389. 1
  45390. 58173
  45391. 4
  45392. 4
  45393. 4
  45394. 5
  45395. 1
  45396. 58173
  45397. 2
  45398. tell_lines
  45399. 1
  45400. 2487
  45401. 1
  45402. 6
  45403. 1
  45404. 58173
  45405. 4
  45406. 5
  45407. 1
  45408. 41398
  45409. 2
  45410. secure
  45411. 1
  45412. 49551
  45413. 1
  45414. 29557
  45415. 1
  45416. 58173
  45417. 4
  45418. 5
  45419. 1
  45420. 41398
  45421. 2
  45422. arm
  45423. 1
  45424. 49551
  45425. 1
  45426. 29557
  45427. 1
  45428. 58173
  45429. 4
  45430. 5
  45431. 1
  45432. 41398
  45433. 2
  45434. press
  45435. 1
  45436. 49551
  45437. 1
  45438. 29557
  45439. 1
  45440. 58173
  45441. 4
  45442. 14
  45443. 4
  45444. 5
  45445. 1
  45446. 50367
  45447. 2
  45448. tell_lines
  45449. 1
  45450. 2487
  45451. 1
  45452. 6
  45453. 1
  45454. 50367
  45455. 4
  45456. 5
  45457. 1
  45458. 32361
  45459. 2
  45460. look_self
  45461. 1
  45462. 15
  45463. 1
  45464. 6792
  45465. 1
  45466. 50367
  45467. 4
  45468. 5
  45469. 1
  45470. 32361
  45471. 2
  45472. enterfunc
  45473. 1
  45474. 2
  45475. 1
  45476. 3
  45477. 1
  45478. 50367
  45479. 4
  45480. 5
  45481. 1
  45482. 32361
  45483. 2
  45484. enterfunc
  45485. 1
  45486. 2693
  45487. 1
  45488. 258
  45489. 1
  45490. 50367
  45491. 4
  45492. 5
  45493. 1
  45494. 50367
  45495. 2
  45496. moveto
  45497. 1
  45498. 50367
  45499. 1
  45500. 1
  45501. 1
  45502. 50367
  45503. 4
  45504. 5
  45505. 1
  45506. 50367
  45507. 2
  45508. moveto
  45509. 1
  45510. 47
  45511. 1
  45512. 6
  45513. 1
  45514. 50367
  45515. 4
  45516. 5
  45517. 1
  45518. 50367
  45519. 2
  45520. moveto
  45521. 1
  45522. 47
  45523. 1
  45524. 3133
  45525. 1
  45526. 50367
  45527. 4
  45528. 5
  45529. 1
  45530. 50367
  45531. 2
  45532. moveto
  45533. 1
  45534. 78
  45535. 1
  45536. 7069
  45537. 1
  45538. 50367
  45539. 4
  45540. 5
  45541. 1
  45542. 50367
  45543. 2
  45544. moveto
  45545. 1
  45546. 3685
  45547. 1
  45548. 8855
  45549. 1
  45550. 50367
  45551. 4
  45552. 5
  45553. 1
  45554. 26217
  45555. 2
  45556. move
  45557. 1
  45558. 2
  45559. 1
  45560. 7
  45561. 1
  45562. 50367
  45563. 4
  45564. 5
  45565. 1
  45566. 26217
  45567. 2
  45568. move
  45569. 1
  45570. 50367
  45571. 1
  45572. 26217
  45573. 1
  45574. 50367
  45575. 4
  45576. 5
  45577. 1
  45578. 26217
  45579. 2
  45580. invoke
  45581. 1
  45582. 2
  45583. 1
  45584. 7
  45585. 1
  45586. 50367
  45587. 4
  45588. 5
  45589. 1
  45590. 26217
  45591. 2
  45592. invoke
  45593. 1
  45594. 50367
  45595. 1
  45596. 26217
  45597. 1
  45598. 50367
  45599. 4
  45600. 5
  45601. 1
  45602. 35514
  45603. 2
  45604. d
  45605. 1
  45606. 2
  45607. 1
  45608. 3
  45609. 1
  45610. 50367
  45611. 4
  45612. 14
  45613. 4
  45614. 5
  45615. 1
  45616. 50367
  45617. 2
  45618. tell_lines
  45619. 1
  45620. 2487
  45621. 1
  45622. 6
  45623. 1
  45624. 50367
  45625. 4
  45626. 5
  45627. 1
  45628. 32361
  45629. 2
  45630. look_self
  45631. 1
  45632. 15
  45633. 1
  45634. 6792
  45635. 1
  45636. 50367
  45637. 4
  45638. 5
  45639. 1
  45640. 32361
  45641. 2
  45642. enterfunc
  45643. 1
  45644. 2
  45645. 1
  45646. 3
  45647. 1
  45648. 50367
  45649. 4
  45650. 5
  45651. 1
  45652. 32361
  45653. 2
  45654. enterfunc
  45655. 1
  45656. 2693
  45657. 1
  45658. 258
  45659. 1
  45660. 50367
  45661. 4
  45662. 5
  45663. 1
  45664. 50367
  45665. 2
  45666. moveto
  45667. 1
  45668. 50367
  45669. 1
  45670. 1
  45671. 1
  45672. 50367
  45673. 4
  45674. 5
  45675. 1
  45676. 50367
  45677. 2
  45678. moveto
  45679. 1
  45680. 47
  45681. 1
  45682. 6
  45683. 1
  45684. 50367
  45685. 4
  45686. 5
  45687. 1
  45688. 50367
  45689. 2
  45690. moveto
  45691. 1
  45692. 47
  45693. 1
  45694. 3133
  45695. 1
  45696. 50367
  45697. 4
  45698. 5
  45699. 1
  45700. 50367
  45701. 2
  45702. moveto
  45703. 1
  45704. 78
  45705. 1
  45706. 7069
  45707. 1
  45708. 50367
  45709. 4
  45710. 5
  45711. 1
  45712. 50367
  45713. 2
  45714. moveto
  45715. 1
  45716. 3685
  45717. 1
  45718. 8855
  45719. 1
  45720. 50367
  45721. 4
  45722. 5
  45723. 1
  45724. 26217
  45725. 2
  45726. move
  45727. 1
  45728. 2
  45729. 1
  45730. 7
  45731. 1
  45732. 50367
  45733. 4
  45734. 5
  45735. 1
  45736. 26217
  45737. 2
  45738. move
  45739. 1
  45740. 50367
  45741. 1
  45742. 26217
  45743. 1
  45744. 50367
  45745. 4
  45746. 5
  45747. 1
  45748. 26217
  45749. 2
  45750. invoke
  45751. 1
  45752. 2
  45753. 1
  45754. 7
  45755. 1
  45756. 50367
  45757. 4
  45758. 5
  45759. 1
  45760. 26217
  45761. 2
  45762. invoke
  45763. 1
  45764. 50367
  45765. 1
  45766. 26217
  45767. 1
  45768. 50367
  45769. 4
  45770. 5
  45771. 1
  45772. 35514
  45773. 2
  45774. d
  45775. 1
  45776. 2
  45777. 1
  45778. 3
  45779. 1
  45780. 50367
  45781. 4
  45782. 15
  45783. 4
  45784. 5
  45785. 1
  45786. 56939
  45787. 2
  45788. tell_lines
  45789. 1
  45790. 2487
  45791. 1
  45792. 6
  45793. 1
  45794. 56939
  45795. 4
  45796. 5
  45797. 1
  45798. 32361
  45799. 2
  45800. look_self
  45801. 1
  45802. 15
  45803. 1
  45804. 6792
  45805. 1
  45806. 56939
  45807. 4
  45808. 5
  45809. 1
  45810. 32361
  45811. 2
  45812. enterfunc
  45813. 1
  45814. 2
  45815. 1
  45816. 3
  45817. 1
  45818. 56939
  45819. 4
  45820. 5
  45821. 1
  45822. 32361
  45823. 2
  45824. enterfunc
  45825. 1
  45826. 2693
  45827. 1
  45828. 258
  45829. 1
  45830. 56939
  45831. 4
  45832. 5
  45833. 1
  45834. 56939
  45835. 2
  45836. moveto
  45837. 1
  45838. 56939
  45839. 1
  45840. 1
  45841. 1
  45842. 56939
  45843. 4
  45844. 5
  45845. 1
  45846. 56939
  45847. 2
  45848. moveto
  45849. 1
  45850. 47
  45851. 1
  45852. 6
  45853. 1
  45854. 56939
  45855. 4
  45856. 5
  45857. 1
  45858. 56939
  45859. 2
  45860. moveto
  45861. 1
  45862. 47
  45863. 1
  45864. 3133
  45865. 1
  45866. 56939
  45867. 4
  45868. 5
  45869. 1
  45870. 56939
  45871. 2
  45872. moveto
  45873. 1
  45874. 78
  45875. 1
  45876. 7069
  45877. 1
  45878. 56939
  45879. 4
  45880. 5
  45881. 1
  45882. 56939
  45883. 2
  45884. moveto
  45885. 1
  45886. 3685
  45887. 1
  45888. 8855
  45889. 1
  45890. 56939
  45891. 4
  45892. 5
  45893. 1
  45894. 56939
  45895. 2
  45896. moveto
  45897. 1
  45898. 57140
  45899. 1
  45900. 49900
  45901. 1
  45902. 56939
  45903. 4
  45904. 5
  45905. 1
  45906. 26217
  45907. 2
  45908. move
  45909. 1
  45910. 2
  45911. 1
  45912. 7
  45913. 1
  45914. 56939
  45915. 4
  45916. 5
  45917. 1
  45918. 26217
  45919. 2
  45920. move
  45921. 1
  45922. 50367
  45923. 1
  45924. 26217
  45925. 1
  45926. 56939
  45927. 4
  45928. 5
  45929. 1
  45930. 26217
  45931. 2
  45932. invoke
  45933. 1
  45934. 2
  45935. 1
  45936. 7
  45937. 1
  45938. 56939
  45939. 4
  45940. 5
  45941. 1
  45942. 26217
  45943. 2
  45944. invoke
  45945. 1
  45946. 50367
  45947. 1
  45948. 26217
  45949. 1
  45950. 56939
  45951. 4
  45952. 5
  45953. 1
  45954. 35514
  45955. 2
  45956. d
  45957. 1
  45958. 2
  45959. 1
  45960. 3
  45961. 1
  45962. 56939
  45963. 4
  45964. 3
  45965. 4
  45966. 5
  45967. 1
  45968. 56939
  45969. 2
  45970. tell_lines
  45971. 1
  45972. 2487
  45973. 1
  45974. 6
  45975. 1
  45976. 56939
  45977. 4
  45978. 5
  45979. 1
  45980. 32361
  45981. 2
  45982. look_self
  45983. 1
  45984. 15
  45985. 1
  45986. 6792
  45987. 1
  45988. 56939
  45989. 4
  45990. 5
  45991. 1
  45992. 32361
  45993. 2
  45994. l
  45995. 1
  45996. 2693
  45997. 1
  45998. 258
  45999. 1
  46000. 56939
  46001. 4
  46002. 3
  46003. 4
  46004. 5
  46005. 1
  46006. 50367
  46007. 2
  46008. tell_lines
  46009. 1
  46010. 2487
  46011. 1
  46012. 6
  46013. 1
  46014. 50367
  46015. 4
  46016. 5
  46017. 1
  46018. 32361
  46019. 2
  46020. look_self
  46021. 1
  46022. 15
  46023. 1
  46024. 6792
  46025. 1
  46026. 50367
  46027. 4
  46028. 5
  46029. 1
  46030. 32361
  46031. 2
  46032. l
  46033. 1
  46034. 2693
  46035. 1
  46036. 258
  46037. 1
  46038. 50367
  46039. 4
  46040. 14
  46041. 4
  46042. 5
  46043. 1
  46044. 50367
  46045. 2
  46046. tell_lines
  46047. 1
  46048. 2487
  46049. 1
  46050. 6
  46051. 1
  46052. 50367
  46053. 4
  46054. 5
  46055. 1
  46056. 32361
  46057. 2
  46058. look_self
  46059. 1
  46060. 15
  46061. 1
  46062. 6792
  46063. 1
  46064. 50367
  46065. 4
  46066. 5
  46067. 1
  46068. 32361
  46069. 2
  46070. enterfunc
  46071. 1
  46072. 2
  46073. 1
  46074. 3
  46075. 1
  46076. 50367
  46077. 4
  46078. 5
  46079. 1
  46080. 32361
  46081. 2
  46082. enterfunc
  46083. 1
  46084. 2693
  46085. 1
  46086. 258
  46087. 1
  46088. 50367
  46089. 4
  46090. 5
  46091. 1
  46092. 50367
  46093. 2
  46094. moveto
  46095. 1
  46096. 50367
  46097. 1
  46098. 1
  46099. 1
  46100. 50367
  46101. 4
  46102. 5
  46103. 1
  46104. 50367
  46105. 2
  46106. moveto
  46107. 1
  46108. 47
  46109. 1
  46110. 6
  46111. 1
  46112. 50367
  46113. 4
  46114. 5
  46115. 1
  46116. 50367
  46117. 2
  46118. moveto
  46119. 1
  46120. 47
  46121. 1
  46122. 3133
  46123. 1
  46124. 50367
  46125. 4
  46126. 5
  46127. 1
  46128. 50367
  46129. 2
  46130. moveto
  46131. 1
  46132. 78
  46133. 1
  46134. 7069
  46135. 1
  46136. 50367
  46137. 4
  46138. 5
  46139. 1
  46140. 50367
  46141. 2
  46142. moveto
  46143. 1
  46144. 3685
  46145. 1
  46146. 8855
  46147. 1
  46148. 50367
  46149. 4
  46150. 5
  46151. 1
  46152. 26217
  46153. 2
  46154. move
  46155. 1
  46156. 2
  46157. 1
  46158. 7
  46159. 1
  46160. 50367
  46161. 4
  46162. 5
  46163. 1
  46164. 26217
  46165. 2
  46166. move
  46167. 1
  46168. 50367
  46169. 1
  46170. 26217
  46171. 1
  46172. 50367
  46173. 4
  46174. 5
  46175. 1
  46176. 26217
  46177. 2
  46178. invoke
  46179. 1
  46180. 2
  46181. 1
  46182. 7
  46183. 1
  46184. 50367
  46185. 4
  46186. 5
  46187. 1
  46188. 26217
  46189. 2
  46190. invoke
  46191. 1
  46192. 50367
  46193. 1
  46194. 26217
  46195. 1
  46196. 50367
  46197. 4
  46198. 5
  46199. 1
  46200. 35514
  46201. 2
  46202. d
  46203. 1
  46204. 2
  46205. 1
  46206. 3
  46207. 1
  46208. 50367
  46209. 4
  46210. 15
  46211. 4
  46212. 5
  46213. 1
  46214. 56939
  46215. 2
  46216. tell_lines
  46217. 1
  46218. 2487
  46219. 1
  46220. 6
  46221. 1
  46222. 56939
  46223. 4
  46224. 5
  46225. 1
  46226. 32361
  46227. 2
  46228. look_self
  46229. 1
  46230. 15
  46231. 1
  46232. 6792
  46233. 1
  46234. 56939
  46235. 4
  46236. 5
  46237. 1
  46238. 32361
  46239. 2
  46240. enterfunc
  46241. 1
  46242. 2
  46243. 1
  46244. 3
  46245. 1
  46246. 56939
  46247. 4
  46248. 5
  46249. 1
  46250. 32361
  46251. 2
  46252. enterfunc
  46253. 1
  46254. 2693
  46255. 1
  46256. 258
  46257. 1
  46258. 56939
  46259. 4
  46260. 5
  46261. 1
  46262. 56939
  46263. 2
  46264. moveto
  46265. 1
  46266. 56939
  46267. 1
  46268. 1
  46269. 1
  46270. 56939
  46271. 4
  46272. 5
  46273. 1
  46274. 56939
  46275. 2
  46276. moveto
  46277. 1
  46278. 47
  46279. 1
  46280. 6
  46281. 1
  46282. 56939
  46283. 4
  46284. 5
  46285. 1
  46286. 56939
  46287. 2
  46288. moveto
  46289. 1
  46290. 47
  46291. 1
  46292. 3133
  46293. 1
  46294. 56939
  46295. 4
  46296. 5
  46297. 1
  46298. 56939
  46299. 2
  46300. moveto
  46301. 1
  46302. 78
  46303. 1
  46304. 7069
  46305. 1
  46306. 56939
  46307. 4
  46308. 5
  46309. 1
  46310. 56939
  46311. 2
  46312. moveto
  46313. 1
  46314. 3685
  46315. 1
  46316. 8855
  46317. 1
  46318. 56939
  46319. 4
  46320. 5
  46321. 1
  46322. 56939
  46323. 2
  46324. moveto
  46325. 1
  46326. 57140
  46327. 1
  46328. 49900
  46329. 1
  46330. 56939
  46331. 4
  46332. 5
  46333. 1
  46334. 26217
  46335. 2
  46336. move
  46337. 1
  46338. 2
  46339. 1
  46340. 7
  46341. 1
  46342. 56939
  46343. 4
  46344. 5
  46345. 1
  46346. 26217
  46347. 2
  46348. move
  46349. 1
  46350. 50367
  46351. 1
  46352. 26217
  46353. 1
  46354. 56939
  46355. 4
  46356. 5
  46357. 1
  46358. 26217
  46359. 2
  46360. invoke
  46361. 1
  46362. 2
  46363. 1
  46364. 7
  46365. 1
  46366. 56939
  46367. 4
  46368. 5
  46369. 1
  46370. 26217
  46371. 2
  46372. invoke
  46373. 1
  46374. 50367
  46375. 1
  46376. 26217
  46377. 1
  46378. 56939
  46379. 4
  46380. 5
  46381. 1
  46382. 35514
  46383. 2
  46384. d
  46385. 1
  46386. 2
  46387. 1
  46388. 3
  46389. 1
  46390. 56939
  46391. 4
  46392. 3
  46393. 4
  46394. 5
  46395. 1
  46396. 56939
  46397. 2
  46398. tell_lines
  46399. 1
  46400. 2487
  46401. 1
  46402. 6
  46403. 1
  46404. 56939
  46405. 4
  46406. 5
  46407. 1
  46408. 32361
  46409. 2
  46410. look_self
  46411. 1
  46412. 15
  46413. 1
  46414. 6792
  46415. 1
  46416. 56939
  46417. 4
  46418. 5
  46419. 1
  46420. 32361
  46421. 2
  46422. l
  46423. 1
  46424. 2693
  46425. 1
  46426. 258
  46427. 1
  46428. 56939
  46429. 4
  46430. 14
  46431. 4
  46432. 5
  46433. 1
  46434. 50367
  46435. 2
  46436. tell_lines
  46437. 1
  46438. 2487
  46439. 1
  46440. 6
  46441. 1
  46442. 50367
  46443. 4
  46444. 5
  46445. 1
  46446. 32361
  46447. 2
  46448. look_self
  46449. 1
  46450. 15
  46451. 1
  46452. 6792
  46453. 1
  46454. 50367
  46455. 4
  46456. 5
  46457. 1
  46458. 32361
  46459. 2
  46460. enterfunc
  46461. 1
  46462. 2
  46463. 1
  46464. 3
  46465. 1
  46466. 50367
  46467. 4
  46468. 5
  46469. 1
  46470. 32361
  46471. 2
  46472. enterfunc
  46473. 1
  46474. 2693
  46475. 1
  46476. 258
  46477. 1
  46478. 50367
  46479. 4
  46480. 5
  46481. 1
  46482. 50367
  46483. 2
  46484. moveto
  46485. 1
  46486. 50367
  46487. 1
  46488. 1
  46489. 1
  46490. 50367
  46491. 4
  46492. 5
  46493. 1
  46494. 50367
  46495. 2
  46496. moveto
  46497. 1
  46498. 47
  46499. 1
  46500. 6
  46501. 1
  46502. 50367
  46503. 4
  46504. 5
  46505. 1
  46506. 50367
  46507. 2
  46508. moveto
  46509. 1
  46510. 47
  46511. 1
  46512. 3133
  46513. 1
  46514. 50367
  46515. 4
  46516. 5
  46517. 1
  46518. 50367
  46519. 2
  46520. moveto
  46521. 1
  46522. 78
  46523. 1
  46524. 7069
  46525. 1
  46526. 50367
  46527. 4
  46528. 5
  46529. 1
  46530. 50367
  46531. 2
  46532. moveto
  46533. 1
  46534. 3685
  46535. 1
  46536. 8855
  46537. 1
  46538. 50367
  46539. 4
  46540. 5
  46541. 1
  46542. 26217
  46543. 2
  46544. move
  46545. 1
  46546. 2
  46547. 1
  46548. 7
  46549. 1
  46550. 50367
  46551. 4
  46552. 5
  46553. 1
  46554. 26217
  46555. 2
  46556. move
  46557. 1
  46558. 50367
  46559. 1
  46560. 26217
  46561. 1
  46562. 50367
  46563. 4
  46564. 5
  46565. 1
  46566. 26217
  46567. 2
  46568. invoke
  46569. 1
  46570. 2
  46571. 1
  46572. 7
  46573. 1
  46574. 50367
  46575. 4
  46576. 5
  46577. 1
  46578. 26217
  46579. 2
  46580. invoke
  46581. 1
  46582. 50367
  46583. 1
  46584. 26217
  46585. 1
  46586. 50367
  46587. 4
  46588. 5
  46589. 1
  46590. 35514
  46591. 2
  46592. d
  46593. 1
  46594. 2
  46595. 1
  46596. 3
  46597. 1
  46598. 50367
  46599. 4
  46600. 10
  46601. 4
  46602. 5
  46603. 1
  46604. 50367
  46605. 2
  46606. tell_lines
  46607. 1
  46608. 2487
  46609. 1
  46610. 6
  46611. 1
  46612. 50367
  46613. 4
  46614. 5
  46615. 1
  46616. 32361
  46617. 2
  46618. look_self
  46619. 1
  46620. 15
  46621. 1
  46622. 6792
  46623. 1
  46624. 50367
  46625. 4
  46626. 5
  46627. 1
  46628. 32361
  46629. 2
  46630. enterfunc
  46631. 1
  46632. 2
  46633. 1
  46634. 3
  46635. 1
  46636. 50367
  46637. 4
  46638. 5
  46639. 1
  46640. 32361
  46641. 2
  46642. enterfunc
  46643. 1
  46644. 2693
  46645. 1
  46646. 258
  46647. 1
  46648. 50367
  46649. 4
  46650. 5
  46651. 1
  46652. 50367
  46653. 2
  46654. moveto
  46655. 1
  46656. 50367
  46657. 1
  46658. 1
  46659. 1
  46660. 50367
  46661. 4
  46662. 5
  46663. 1
  46664. 50367
  46665. 2
  46666. moveto
  46667. 1
  46668. 47
  46669. 1
  46670. 6
  46671. 1
  46672. 50367
  46673. 4
  46674. 5
  46675. 1
  46676. 50367
  46677. 2
  46678. moveto
  46679. 1
  46680. 47
  46681. 1
  46682. 3133
  46683. 1
  46684. 50367
  46685. 4
  46686. 5
  46687. 1
  46688. 50367
  46689. 2
  46690. moveto
  46691. 1
  46692. 78
  46693. 1
  46694. 7069
  46695. 1
  46696. 50367
  46697. 4
  46698. 5
  46699. 1
  46700. 50367
  46701. 2
  46702. moveto
  46703. 1
  46704. 3685
  46705. 1
  46706. 8855
  46707. 1
  46708. 50367
  46709. 4
  46710. 5
  46711. 1
  46712. 5443
  46713. 2
  46714. done
  46715. 1
  46716. 6336
  46717. 1
  46718. 5400
  46719. 1
  46720. 50367
  46721. 4
  46722. 14
  46723. 4
  46724. 5
  46725. 1
  46726. 50367
  46727. 2
  46728. tell_lines
  46729. 1
  46730. 2487
  46731. 1
  46732. 6
  46733. 1
  46734. 50367
  46735. 4
  46736. 5
  46737. 1
  46738. 32361
  46739. 2
  46740. look_self
  46741. 1
  46742. 15
  46743. 1
  46744. 6792
  46745. 1
  46746. 50367
  46747. 4
  46748. 5
  46749. 1
  46750. 32361
  46751. 2
  46752. enterfunc
  46753. 1
  46754. 2
  46755. 1
  46756. 3
  46757. 1
  46758. 50367
  46759. 4
  46760. 5
  46761. 1
  46762. 32361
  46763. 2
  46764. enterfunc
  46765. 1
  46766. 2693
  46767. 1
  46768. 258
  46769. 1
  46770. 50367
  46771. 4
  46772. 5
  46773. 1
  46774. 50367
  46775. 2
  46776. moveto
  46777. 1
  46778. 50367
  46779. 1
  46780. 1
  46781. 1
  46782. 50367
  46783. 4
  46784. 5
  46785. 1
  46786. 50367
  46787. 2
  46788. moveto
  46789. 1
  46790. 47
  46791. 1
  46792. 6
  46793. 1
  46794. 50367
  46795. 4
  46796. 5
  46797. 1
  46798. 50367
  46799. 2
  46800. moveto
  46801. 1
  46802. 47
  46803. 1
  46804. 3133
  46805. 1
  46806. 50367
  46807. 4
  46808. 5
  46809. 1
  46810. 50367
  46811. 2
  46812. moveto
  46813. 1
  46814. 78
  46815. 1
  46816. 7069
  46817. 1
  46818. 50367
  46819. 4
  46820. 5
  46821. 1
  46822. 50367
  46823. 2
  46824. moveto
  46825. 1
  46826. 3685
  46827. 1
  46828. 8855
  46829. 1
  46830. 50367
  46831. 4
  46832. 5
  46833. 1
  46834. 26217
  46835. 2
  46836. move
  46837. 1
  46838. 2
  46839. 1
  46840. 7
  46841. 1
  46842. 50367
  46843. 4
  46844. 5
  46845. 1
  46846. 26217
  46847. 2
  46848. move
  46849. 1
  46850. 50367
  46851. 1
  46852. 26217
  46853. 1
  46854. 50367
  46855. 4
  46856. 5
  46857. 1
  46858. 26217
  46859. 2
  46860. invoke
  46861. 1
  46862. 2
  46863. 1
  46864. 7
  46865. 1
  46866. 50367
  46867. 4
  46868. 5
  46869. 1
  46870. 26217
  46871. 2
  46872. invoke
  46873. 1
  46874. 50367
  46875. 1
  46876. 26217
  46877. 1
  46878. 50367
  46879. 4
  46880. 5
  46881. 1
  46882. 35514
  46883. 2
  46884. d
  46885. 1
  46886. 2
  46887. 1
  46888. 3
  46889. 1
  46890. 50367
  46891. 4
  46892. 10
  46893. 4
  46894. 5
  46895. 1
  46896. 50367
  46897. 2
  46898. tell_lines
  46899. 1
  46900. 2487
  46901. 1
  46902. 6
  46903. 1
  46904. 50367
  46905. 4
  46906. 5
  46907. 1
  46908. 32361
  46909. 2
  46910. look_self
  46911. 1
  46912. 15
  46913. 1
  46914. 6792
  46915. 1
  46916. 50367
  46917. 4
  46918. 5
  46919. 1
  46920. 32361
  46921. 2
  46922. enterfunc
  46923. 1
  46924. 2
  46925. 1
  46926. 3
  46927. 1
  46928. 50367
  46929. 4
  46930. 5
  46931. 1
  46932. 32361
  46933. 2
  46934. enterfunc
  46935. 1
  46936. 2693
  46937. 1
  46938. 258
  46939. 1
  46940. 50367
  46941. 4
  46942. 5
  46943. 1
  46944. 50367
  46945. 2
  46946. moveto
  46947. 1
  46948. 50367
  46949. 1
  46950. 1
  46951. 1
  46952. 50367
  46953. 4
  46954. 5
  46955. 1
  46956. 50367
  46957. 2
  46958. moveto
  46959. 1
  46960. 47
  46961. 1
  46962. 6
  46963. 1
  46964. 50367
  46965. 4
  46966. 5
  46967. 1
  46968. 50367
  46969. 2
  46970. moveto
  46971. 1
  46972. 47
  46973. 1
  46974. 3133
  46975. 1
  46976. 50367
  46977. 4
  46978. 5
  46979. 1
  46980. 50367
  46981. 2
  46982. moveto
  46983. 1
  46984. 78
  46985. 1
  46986. 7069
  46987. 1
  46988. 50367
  46989. 4
  46990. 5
  46991. 1
  46992. 50367
  46993. 2
  46994. moveto
  46995. 1
  46996. 3685
  46997. 1
  46998. 8855
  46999. 1
  47000. 50367
  47001. 4
  47002. 5
  47003. 1
  47004. 5443
  47005. 2
  47006. done
  47007. 1
  47008. 6336
  47009. 1
  47010. 5400
  47011. 1
  47012. 50367
  47013. 4
  47014. 3
  47015. 4
  47016. 5
  47017. 1
  47018. 50367
  47019. 2
  47020. tell_lines
  47021. 1
  47022. 2487
  47023. 1
  47024. 6
  47025. 1
  47026. 50367
  47027. 4
  47028. 5
  47029. 1
  47030. 32361
  47031. 2
  47032. look_self
  47033. 1
  47034. 15
  47035. 1
  47036. 6792
  47037. 1
  47038. 50367
  47039. 4
  47040. 5
  47041. 1
  47042. 32361
  47043. 2
  47044. l
  47045. 1
  47046. 2693
  47047. 1
  47048. 258
  47049. 1
  47050. 50367
  47051. 4
  47052. 14
  47053. 4
  47054. 5
  47055. 1
  47056. 50367
  47057. 2
  47058. tell_lines
  47059. 1
  47060. 2487
  47061. 1
  47062. 6
  47063. 1
  47064. 50367
  47065. 4
  47066. 5
  47067. 1
  47068. 32361
  47069. 2
  47070. look_self
  47071. 1
  47072. 15
  47073. 1
  47074. 6792
  47075. 1
  47076. 50367
  47077. 4
  47078. 5
  47079. 1
  47080. 32361
  47081. 2
  47082. enterfunc
  47083. 1
  47084. 2
  47085. 1
  47086. 3
  47087. 1
  47088. 50367
  47089. 4
  47090. 5
  47091. 1
  47092. 32361
  47093. 2
  47094. enterfunc
  47095. 1
  47096. 2693
  47097. 1
  47098. 258
  47099. 1
  47100. 50367
  47101. 4
  47102. 5
  47103. 1
  47104. 50367
  47105. 2
  47106. moveto
  47107. 1
  47108. 50367
  47109. 1
  47110. 1
  47111. 1
  47112. 50367
  47113. 4
  47114. 5
  47115. 1
  47116. 50367
  47117. 2
  47118. moveto
  47119. 1
  47120. 47
  47121. 1
  47122. 6
  47123. 1
  47124. 50367
  47125. 4
  47126. 5
  47127. 1
  47128. 50367
  47129. 2
  47130. moveto
  47131. 1
  47132. 47
  47133. 1
  47134. 3133
  47135. 1
  47136. 50367
  47137. 4
  47138. 5
  47139. 1
  47140. 50367
  47141. 2
  47142. moveto
  47143. 1
  47144. 78
  47145. 1
  47146. 7069
  47147. 1
  47148. 50367
  47149. 4
  47150. 5
  47151. 1
  47152. 50367
  47153. 2
  47154. moveto
  47155. 1
  47156. 3685
  47157. 1
  47158. 8855
  47159. 1
  47160. 50367
  47161. 4
  47162. 5
  47163. 1
  47164. 26217
  47165. 2
  47166. move
  47167. 1
  47168. 2
  47169. 1
  47170. 7
  47171. 1
  47172. 50367
  47173. 4
  47174. 5
  47175. 1
  47176. 26217
  47177. 2
  47178. move
  47179. 1
  47180. 50367
  47181. 1
  47182. 26217
  47183. 1
  47184. 50367
  47185. 4
  47186. 5
  47187. 1
  47188. 26217
  47189. 2
  47190. invoke
  47191. 1
  47192. 2
  47193. 1
  47194. 7
  47195. 1
  47196. 50367
  47197. 4
  47198. 5
  47199. 1
  47200. 26217
  47201. 2
  47202. invoke
  47203. 1
  47204. 50367
  47205. 1
  47206. 26217
  47207. 1
  47208. 50367
  47209. 4
  47210. 5
  47211. 1
  47212. 35514
  47213. 2
  47214. down
  47215. 1
  47216. 2
  47217. 1
  47218. 3
  47219. 1
  47220. 50367
  47221. 4
  47222. 4
  47223. 4
  47224. 5
  47225. 1
  47226. 53502
  47227. 2
  47228. tell_lines
  47229. 1
  47230. 2487
  47231. 1
  47232. 6
  47233. 1
  47234. 53502
  47235. 4
  47236. 5
  47237. 1
  47238. 10202
  47239. 2
  47240. secure
  47241. 1
  47242. 49551
  47243. 1
  47244. 29557
  47245. 1
  47246. 53502
  47247. 4
  47248. 5
  47249. 1
  47250. 10202
  47251. 2
  47252. arm
  47253. 1
  47254. 49551
  47255. 1
  47256. 29557
  47257. 1
  47258. 53502
  47259. 4
  47260. 5
  47261. 1
  47262. 10202
  47263. 2
  47264. press
  47265. 1
  47266. 49551
  47267. 1
  47268. 29557
  47269. 1
  47270. 53502
  47271. 4
  47272. 6
  47273. 4
  47274. 5
  47275. 1
  47276. 57919
  47277. 2
  47278. tell_lines
  47279. 1
  47280. 2487
  47281. 1
  47282. 6
  47283. 1
  47284. 57919
  47285. 4
  47286. 5
  47287. 1
  47288. 20584
  47289. 2
  47290. secure
  47291. 1
  47292. 49551
  47293. 1
  47294. 29557
  47295. 1
  47296. 57919
  47297. 4
  47298. 5
  47299. 1
  47300. 20584
  47301. 2
  47302. arm
  47303. 1
  47304. 49551
  47305. 1
  47306. 29557
  47307. 1
  47308. 57919
  47309. 4
  47310. 5
  47311. 1
  47312. 20584
  47313. 2
  47314. say_parse
  47315. 1
  47316. 49551
  47317. 1
  47318. 29557
  47319. 1
  47320. 57919
  47321. 4
  47322. 5
  47323. 1
  47324. 20584
  47325. 2
  47326. announce
  47327. 1
  47328. 49551
  47329. 1
  47330. 29557
  47331. 1
  47332. 57919
  47333. 4
  47334. 5
  47335. 1
  47336. 20584
  47337. 2
  47338. say
  47339. 1
  47340. 2
  47341. 1
  47342. 3
  47343. 1
  47344. 57919
  47345. 38
  47346. 1
  47347. 5
  47348. 38
  47349. 4
  47350. 4
  47351. 1
  47352. 2
  47353. list_utilities
  47354. 38
  47355. 5
  47356. 4
  47357. 31
  47358. 2
  47359. append            (list,list,..) => result of concatenating the given lists
  47360. 2
  47361. reverse           (list)         => reversed list
  47362. 2
  47363. remove_duplicates (list)         => list with all duplicates removed
  47364. 2
  47365. compress          (list)         => list with consecutive duplicates removed
  47366. 2
  47367. setremove_all     (list,elt)     => list with all occurrences of elt removed
  47368. 2
  47369. find_insert       (sortedlist,e) => index of first element > e in sortedlist
  47370. 2
  47371. sort              (list[,keys])  => sorted list
  47372. 2
  47373. count             (elt,list)     => count of elt found in list.
  47374. 2
  47375. flatten           (list)         => flatten all recursive lists into one list
  47376. 2
  47377.  
  47378. 2
  47379. make              (n[,e])        => list of n copies of e
  47380. 2
  47381. range             (m,n)          => {m,m+1,...,n}
  47382. 2
  47383.  
  47384. 2
  47385. arrayset   (list,val,i[,j,k...]) => array modified so that list[i][j][k]==val
  47386. 2
  47387.  
  47388. 2
  47389. -- Mapping functions (take a list and do something to each element):
  47390. 2
  47391.  
  47392. 2
  47393. map_prop ({o...},prop)              => list of o.(prop)            for all o
  47394. 2
  47395. map_verb ({o...},verb[,args)        => list of o:(verb)(@args)     for all o
  47396. 2
  47397. map_arg  ([n,]obj,verb,{a...},args) => list of obj:(verb)(a,@args) for all a
  47398. 2
  47399.  
  47400. 2
  47401. -- Association list functions --
  47402. 2
  47403.  
  47404. 2
  47405. An association list (alist) is a list of pairs (2-element lists), though the following functions have been generalized for lists of n-tuples (n-element lists).  In each case i defaults to 1.
  47406. 2
  47407.  
  47408. 2
  47409. assoc        (targ,alist[,i]) => 1st tuple in alist whose i-th element is targ
  47410. 2
  47411. iassoc       (targ,alist[,i]) => index of same.
  47412. 2
  47413. assoc_prefix (targ,alist[,i]) => ... whose i-th element has targ as a prefix
  47414. 2
  47415. iassoc_prefix(targ,alist[,i]) => index of same.
  47416. 2
  47417. slice             (alist[,i]) => list of i-th elements
  47418. 2
  47419. sort_alist        (alist[,i]) => alist sorted on i-th elements.
  47420. 38
  47421. 5
  47422. 4
  47423. 2
  47424. 0
  47425. 123804
  47426. 0
  47427. 743584203
  47428. 2
  47429. 1
  47430. #57
  47431. command utilities
  47432.  
  47433. 16
  47434. 2
  47435. -1
  47436. -1
  47437. -1
  47438. 1
  47439. -1
  47440. 56
  47441. 17
  47442. object_match_failed
  47443. 2
  47444. 173
  47445. -1
  47446. player_match_result player_match_failed
  47447. 2
  47448. 173
  47449. -1
  47450. read
  47451. 2
  47452. 165
  47453. -1
  47454. read_lines
  47455. 2
  47456. 165
  47457. -1
  47458. yes_or_no
  47459. 2
  47460. 165
  47461. -1
  47462. read_lines_escape
  47463. 2
  47464. 173
  47465. -1
  47466. suspend
  47467. 2
  47468. 173
  47469. -1
  47470. running_out_of_time
  47471. 38
  47472. 173
  47473. -1
  47474. suspend_if_needed
  47475. 2
  47476. 173
  47477. -1
  47478. dump_lines
  47479. 38
  47480. 173
  47481. -1
  47482. explain_syntax
  47483. 2
  47484. 173
  47485. -1
  47486. do_huh
  47487. 2
  47488. 165
  47489. -1
  47490. suspend_database_add
  47491. 2
  47492. 173
  47493. -1
  47494. suspend_database_remove
  47495. 2
  47496. 173
  47497. -1
  47498. suspend_database_cleanup
  47499. 2
  47500. 173
  47501. -1
  47502. task_info
  47503. 2
  47504. 173
  47505. -1
  47506. suspend_database_display
  47507. 2
  47508. 173
  47509. -1
  47510. 1
  47511. suspend_database
  47512. 5
  47513. 4
  47514. 3
  47515. 4
  47516. 2
  47517. 0
  47518. 567973305
  47519. 4
  47520. 3
  47521. 4
  47522. 5
  47523. 1
  47524. -1
  47525. 2
  47526.  
  47527. 1
  47528. 31185
  47529. 1
  47530. -1
  47531. 1
  47532. 31185
  47533. 4
  47534. 5
  47535. 1
  47536. 31185
  47537. 2
  47538. eval_cmd_string
  47539. 1
  47540. 31185
  47541. 1
  47542. 217
  47543. 1
  47544. 31185
  47545. 4
  47546. 5
  47547. 1
  47548. 31185
  47549. 2
  47550. eval
  47551. 1
  47552. 31185
  47553. 1
  47554. 217
  47555. 1
  47556. 31185
  47557. 4
  47558. 2
  47559. 0
  47560. 780571535
  47561. 4
  47562. 6
  47563. 4
  47564. 5
  47565. 1
  47566. 8992
  47567. 2
  47568. suspend
  47569. 1
  47570. 47
  47571. 1
  47572. 8992
  47573. 1
  47574. 47
  47575. 4
  47576. 5
  47577. 1
  47578. 8992
  47579. 2
  47580. scan_features
  47581. 1
  47582. 47
  47583. 1
  47584. 8992
  47585. 1
  47586. 47
  47587. 4
  47588. 5
  47589. 1
  47590. 8992
  47591. 2
  47592. do_features
  47593. 1
  47594. 47
  47595. 1
  47596. 8992
  47597. 1
  47598. 47
  47599. 4
  47600. 5
  47601. 1
  47602. 8992
  47603. 2
  47604. do_survey
  47605. 1
  47606. 47
  47607. 1
  47608. 8992
  47609. 1
  47610. 47
  47611. 4
  47612. 5
  47613. 1
  47614. 8992
  47615. 2
  47616. survey_cycle
  47617. 1
  47618. 47
  47619. 1
  47620. 8992
  47621. 1
  47622. 47
  47623. 4
  47624. 5
  47625. 1
  47626. 8992
  47627. 2
  47628. @start-survey
  47629. 1
  47630. 47
  47631. 1
  47632. 8992
  47633. 1
  47634. 47
  47635. 4
  47636. 2
  47637. 0
  47638. 1776668127
  47639. 4
  47640. 4
  47641. 4
  47642. 5
  47643. 1
  47644. 8992
  47645. 2
  47646. suspend
  47647. 1
  47648. 47
  47649. 1
  47650. 8992
  47651. 1
  47652. 49807
  47653. 4
  47654. 5
  47655. 1
  47656. 8992
  47657. 2
  47658. count
  47659. 1
  47660. 47
  47661. 1
  47662. 8992
  47663. 1
  47664. 49807
  47665. 4
  47666. 5
  47667. 1
  47668. 8992
  47669. 2
  47670. scan
  47671. 1
  47672. 47
  47673. 1
  47674. 8992
  47675. 1
  47676. 49807
  47677. 4
  47678. 5
  47679. 1
  47680. 8992
  47681. 2
  47682. start
  47683. 1
  47684. 47
  47685. 1
  47686. 8992
  47687. 1
  47688. 49807
  47689. 2
  47690. 0
  47691. 5
  47692. 2
  47693. 4
  47694. 5
  47695. 2
  47696. 5
  47697. 4
  47698. 31
  47699. 2
  47700. $command_utils is the repository for verbs that are of general usefulness to authors of all sorts of commands.  For more details about any of these verbs, use `help $command_utils:<verb-name>'.
  47701. 2
  47702.  
  47703. 2
  47704. Detecting and Handling Failures in Matching
  47705. 2
  47706. -------------------------------------------
  47707. 2
  47708. :object_match_failed(match_result, name)
  47709. 2
  47710.     Test whether or not a :match_object() call failed and print messages if so.
  47711. 2
  47712. :player_match_failed(match_result, name)
  47713. 2
  47714.     Test whether or not a :match_player() call failed and print messages if so.
  47715. 2
  47716. :player_match_result(match_results, names)
  47717. 2
  47718.     ...similar to :player_match_failed, but does a whole list at once.
  47719. 2
  47720.  
  47721. 2
  47722. Reading Input from the Player
  47723. 2
  47724. -----------------------------
  47725. 2
  47726. :read()         -- Read one line of input from the player and return it.
  47727. 2
  47728. :yes_or_no([prompt])
  47729. 2
  47730.                 -- Prompt for and read a `yes' or `no' answer.
  47731. 2
  47732. :read_lines()   -- Read zero or more lines of input from the player.
  47733. 2
  47734. :dump_lines(lines) 
  47735. 2
  47736.                 -- Return list of lines quoted so that feeding them to 
  47737. 2
  47738.                    :read_lines() will reproduce the original lines.
  47739. 2
  47740.  
  47741. 2
  47742. Utilities for Suspending
  47743. 2
  47744. ------------------------
  47745. 2
  47746. :running_out_of_time()
  47747. 2
  47748.                 -- Return true if we're low on ticks or seconds.
  47749. 2
  47750. :suspend_if_needed(time)
  47751. 2
  47752.                 -- Suspend (and return true) if we're running out of time.
  47753. 2
  47754.  
  47755. 2
  47756. Client Support for Lengthy Commands
  47757. 2
  47758. -----------------------------------
  47759. 2
  47760. :suspend(args)  -- Handle PREFIX and SUFFIX for clients in long commands.
  47761. 2
  47762. 5
  47763. 4
  47764. 2
  47765. 0
  47766. 20546
  47767. 0
  47768. 743619820
  47769. 2
  47770. 1
  47771. #58
  47772. generic wizard
  47773.  
  47774. 16
  47775. 2
  47776. -1
  47777. -1
  47778. -1
  47779. 59
  47780. 2
  47781. 38
  47782. 30
  47783. @chown
  47784. 2
  47785. 81
  47786. -2
  47787. @shout
  47788. 2
  47789. 89
  47790. -2
  47791. @grant @grants* @transfer
  47792. 2
  47793. 89
  47794. 1
  47795. @programmer
  47796. 2
  47797. 25
  47798. -1
  47799. make-core-database
  47800. 2
  47801. 25
  47802. -1
  47803. @shutdown
  47804. 2
  47805. 89
  47806. -2
  47807. @dump-d*atabase
  47808. 2
  47809. 9
  47810. -1
  47811. @who-calls
  47812. 2
  47813. 89
  47814. -2
  47815. mcd_2
  47816. 2
  47817. 13
  47818. -1
  47819. @toad @toad! @toad!!
  47820. 2
  47821. 89
  47822. -2
  47823. @untoad @detoad
  47824. 2
  47825. 89
  47826. -2
  47827. @quota
  47828. 2
  47829. 81
  47830. 12
  47831. @players
  47832. 2
  47833. 89
  47834. -2
  47835. kill_aux_wizard_parse
  47836. 2
  47837. 173
  47838. -1
  47839. @grepcore @egrepcore
  47840. 2
  47841. 89
  47842. -2
  47843. @net-who @@who
  47844. 2
  47845. 89
  47846. -2
  47847. @make-player
  47848. 2
  47849. 89
  47850. -2
  47851. @abort-sh*utdown
  47852. 2
  47853. 89
  47854. -2
  47855. toad_msg toad_victim_msg programmer_msg programmer_victim_msg newt_msg newt_victim_msg
  47856. 2
  47857. 173
  47858. -1
  47859. moveto
  47860. 2
  47861. 165
  47862. -1
  47863. @newt
  47864. 2
  47865. 17
  47866. -1
  47867. @unnewt @denewt @get-better
  47868. 2
  47869. 81
  47870. -2
  47871. @register
  47872. 2
  47873. 89
  47874. -2
  47875. @new-password @newpassword
  47876. 2
  47877. 89
  47878. 12
  47879. @log
  47880. 2
  47881. 89
  47882. -2
  47883. @guests
  47884. 2
  47885. 25
  47886. -1
  47887. @rn mail_catch_up check_mail_lists current_message set_current_message get_current_message make_current_message kill_current_message
  47888. 2
  47889. 13
  47890. -1
  47891. @blacklist @graylist @redlist @unblacklist @ungraylist @unredlist @spooflist @unspooflist
  47892. 2
  47893. 89
  47894. -2
  47895. @corify
  47896. 2
  47897. 81
  47898. 13
  47899. @make-guest
  47900. 2
  47901. 25
  47902. -1
  47903. 8
  47904. newt_victim_msg
  47905. newt_msg
  47906. public_identity
  47907. programmer_msg
  47908. programmer_victim_msg
  47909. toad_victim_msg
  47910. toad_msg
  47911. mail_identity
  47912. 69
  47913. 2
  47914.  
  47915. 2
  47916. 5
  47917. 2
  47918. %n @newts %d (%[#d])
  47919. 2
  47920. 5
  47921. 1
  47922. -1
  47923. 2
  47924. 5
  47925. 2
  47926. %d is now a programmer.
  47927. 2
  47928. 5
  47929. 2
  47930. You are now a programmer.
  47931. 2
  47932. 5
  47933. 2
  47934. Have a nice life...
  47935. 2
  47936. 5
  47937. 2
  47938. %n @toads %d (%[#d])
  47939. 2
  47940. 5
  47941. 1
  47942. -1
  47943. 2
  47944. 4
  47945. 5
  47946. 38
  47947. 1
  47948. 5
  47949. 2
  47950. 5
  47951. 5
  47952. 2
  47953. 5
  47954. 5
  47955. 2
  47956. 5
  47957. 5
  47958. 2
  47959. 5
  47960. 5
  47961. 38
  47962. 1
  47963. 5
  47964. 2
  47965. 0
  47966. 5
  47967. 2
  47968. 5
  47969. 5
  47970. 2
  47971. 0
  47972. 5
  47973. 2
  47974. 1
  47975. 1
  47976. 25
  47977. 2
  47978. 5
  47979. 5
  47980. 2
  47981. 5
  47982. 5
  47983. 38
  47984. 1
  47985. 5
  47986. 38
  47987. 1
  47988. 5
  47989. 38
  47990. 0
  47991. 5
  47992. 38
  47993. 1
  47994. 5
  47995. 2
  47996. 5
  47997. 5
  47998. 2
  47999. 1
  48000. 5
  48001. 38
  48002. 1
  48003. 5
  48004. 2
  48005. 4
  48006. 5
  48007. 2
  48008. 0
  48009. 5
  48010. 2
  48011. 0
  48012. 5
  48013. 2
  48014. 5
  48015. 5
  48016. 2
  48017. 4
  48018. 5
  48019. 2
  48020. 5
  48021. 5
  48022. 2
  48023. 4
  48024. 5
  48025. 2
  48026. 4
  48027. 5
  48028. 2
  48029. 5
  48030. 5
  48031. 2
  48032. 5
  48033. 5
  48034. 2
  48035. 5
  48036. 5
  48037. 2
  48038. 5
  48039. 5
  48040. 2
  48041. 5
  48042. 5
  48043. 2
  48044. 5
  48045. 5
  48046. 2
  48047. 5
  48048. 5
  48049. 2
  48050. 5
  48051. 5
  48052. 2
  48053. 5
  48054. 5
  48055. 2
  48056. 4
  48057. 5
  48058. 2
  48059. 4
  48060. 5
  48061. 2
  48062. 1
  48063. 5
  48064. 2
  48065. 0
  48066. 5
  48067. 2
  48068. 5
  48069. 5
  48070. 2
  48071. 5
  48072. 5
  48073. 2
  48074. 5
  48075. 5
  48076. 2
  48077. 5
  48078. 5
  48079. 2
  48080. 5
  48081. 5
  48082. 2
  48083. 5
  48084. 5
  48085. 2
  48086. 5
  48087. 5
  48088. 2
  48089. 5
  48090. 5
  48091. 2
  48092. 5
  48093. 1
  48094. 11
  48095. 2
  48096. 5
  48097. 2
  48098. really impossible password to type
  48099. 2
  48100. 0
  48101. 5
  48102. 2
  48103. 5
  48104. 5
  48105. 2
  48106. 5
  48107. 5
  48108. 2
  48109. 5
  48110. 5
  48111. 2
  48112. 5
  48113. 5
  48114. 2
  48115. 5
  48116. 5
  48117. 2
  48118. 1
  48119. 5
  48120. 2
  48121. 4
  48122. 4
  48123. 1
  48124. 2
  48125. player
  48126. 2
  48127. 1
  48128. 2
  48129. You see a wizard who chooses not to reveal its true appearance.
  48130. 2
  48131. 5
  48132. 4
  48133. 2
  48134. 0
  48135. 74432
  48136. 0
  48137. 743619811
  48138. 2
  48139. 1
  48140. #59
  48141. generic programmer
  48142.  
  48143. 144
  48144. 2
  48145. -1
  48146. -1
  48147. -1
  48148. 4
  48149. 58
  48150. -1
  48151. 30
  48152. @prop*erty
  48153. 2
  48154. 81
  48155. -2
  48156. @chmod
  48157. 2
  48158. 81
  48159. -2
  48160. @args
  48161. 2
  48162. 81
  48163. -2
  48164. eval*-d
  48165. 2
  48166. 81
  48167. -2
  48168. @rmprop*erty
  48169. 2
  48170. 81
  48171. -2
  48172. @verb
  48173. 2
  48174. 81
  48175. -2
  48176. @rmverb
  48177. 2
  48178. 17
  48179. -1
  48180. @list
  48181. 2
  48182. 81
  48183. -2
  48184. @forked
  48185. 2
  48186. 17
  48187. -1
  48188. @kill
  48189. 2
  48190. 17
  48191. -1
  48192. @edit
  48193. 38
  48194. 89
  48195. -2
  48196. @copy @copy-x
  48197. 2
  48198. 81
  48199. 1
  48200. _kill_task_message
  48201. 2
  48202. 173
  48203. -1
  48204. @prog*ram
  48205. 2
  48206. 81
  48207. -2
  48208. @setenv
  48209. 2
  48210. 81
  48211. -2
  48212. @pros*pectus pros*pectus
  48213. 2
  48214. 85
  48215. -2
  48216. @d*isplay
  48217. 2
  48218. 17
  48219. -1
  48220. @db*size
  48221. 2
  48222. 9
  48223. -1
  48224. @gethelp
  48225. 2
  48226. 85
  48227. -2
  48228. @prospectusDB
  48229. 2
  48230. 85
  48231. -2
  48232. @grep @egrep
  48233. 2
  48234. 81
  48235. -2
  48236. @s*how
  48237. 2
  48238. 89
  48239. -2
  48240. @check-p*roperty
  48241. 2
  48242. 17
  48243. -1
  48244. set_eval_env
  48245. 2
  48246. 165
  48247. -1
  48248. @clearp*roperty @clprop*erty
  48249. 2
  48250. 17
  48251. -1
  48252. @disown @disinherit
  48253. 2
  48254. 89
  48255. -2
  48256. eval_cmd_string
  48257. 2
  48258. 173
  48259. -1
  48260. @dump
  48261. 2
  48262. 81
  48263. -2
  48264. #*
  48265. 2
  48266. 89
  48267. -2
  48268. eval_value_to_string
  48269. 2
  48270. 173
  48271. -1
  48272. 4
  48273. eval_subs
  48274. eval_time
  48275. eval_ticks
  48276. eval_env
  48277. 61
  48278. 4
  48279. 0
  48280. 38
  48281. 1
  48282. 0
  48283. 0
  48284. 2
  48285. 5
  48286. 0
  48287. 0
  48288. 2
  48289. 5
  48290. 2
  48291.  
  48292. 2
  48293. 5
  48294. 5
  48295. 2
  48296. 5
  48297. 5
  48298. 38
  48299. 1
  48300. 5
  48301. 2
  48302. 0
  48303. 5
  48304. 2
  48305. 5
  48306. 5
  48307. 2
  48308. 0
  48309. 5
  48310. 2
  48311. 1
  48312. 4
  48313. 4
  48314. 1
  48315. 24
  48316. 1
  48317. 30
  48318. 1
  48319. 22
  48320. 1
  48321. 23
  48322. 2
  48323. 5
  48324. 5
  48325. 2
  48326. 5
  48327. 5
  48328. 38
  48329. 1
  48330. 5
  48331. 38
  48332. 1
  48333. 5
  48334. 38
  48335. 0
  48336. 5
  48337. 38
  48338. 1
  48339. 5
  48340. 2
  48341. 5
  48342. 5
  48343. 2
  48344. 1
  48345. 5
  48346. 38
  48347. 1
  48348. 5
  48349. 2
  48350. 4
  48351. 5
  48352. 2
  48353. 0
  48354. 5
  48355. 2
  48356. 0
  48357. 5
  48358. 2
  48359. 5
  48360. 5
  48361. 2
  48362. 4
  48363. 5
  48364. 2
  48365. 5
  48366. 5
  48367. 2
  48368. 4
  48369. 5
  48370. 2
  48371. 4
  48372. 5
  48373. 2
  48374. 5
  48375. 5
  48376. 2
  48377. 5
  48378. 5
  48379. 2
  48380. 5
  48381. 5
  48382. 2
  48383. 5
  48384. 5
  48385. 2
  48386. 5
  48387. 5
  48388. 2
  48389. 5
  48390. 5
  48391. 2
  48392. 5
  48393. 5
  48394. 2
  48395. 5
  48396. 5
  48397. 2
  48398. 5
  48399. 5
  48400. 2
  48401. 4
  48402. 5
  48403. 2
  48404. 4
  48405. 5
  48406. 2
  48407. 1
  48408. 0
  48409. 20
  48410. 2
  48411. 0
  48412. 5
  48413. 2
  48414. 5
  48415. 5
  48416. 2
  48417. 5
  48418. 5
  48419. 2
  48420. 5
  48421. 5
  48422. 2
  48423. 5
  48424. 5
  48425. 2
  48426. 5
  48427. 5
  48428. 2
  48429. 5
  48430. 5
  48431. 2
  48432. 5
  48433. 5
  48434. 2
  48435. 5
  48436. 5
  48437. 2
  48438. 5
  48439. 1
  48440. 11
  48441. 2
  48442. 5
  48443. 5
  48444. 2
  48445. 0
  48446. 5
  48447. 2
  48448. 5
  48449. 5
  48450. 2
  48451. 5
  48452. 5
  48453. 2
  48454. 5
  48455. 5
  48456. 2
  48457. 5
  48458. 5
  48459. 2
  48460. 5
  48461. 5
  48462. 2
  48463. 1
  48464. 5
  48465. 2
  48466. 4
  48467. 4
  48468. 2
  48469. 2
  48470. generic
  48471. 2
  48472. programmer
  48473. 2
  48474. 1
  48475. 2
  48476. You see a player who is too experienced to have any excuse for not having a description.
  48477. 2
  48478. 5
  48479. 4
  48480. 2
  48481. 0
  48482. 70367
  48483. 0
  48484. 743619635
  48485. 2
  48486. 1
  48487. #60
  48488. code utilities
  48489.  
  48490. 16
  48491. 38
  48492. -1
  48493. -1
  48494. -1
  48495. 1
  48496. -1
  48497. 57
  48498. 48
  48499. eval_d
  48500. 2
  48501. 85
  48502. -2
  48503. 1
  48504. 2
  48505. 165
  48506. -1
  48507. tonum
  48508. 38
  48509. 173
  48510. -1
  48511. toobj
  48512. 38
  48513. 173
  48514. -1
  48515. toerr
  48516. 38
  48517. 173
  48518. -1
  48519. error_name
  48520. 38
  48521. 173
  48522. -1
  48523. show_object
  48524. 2
  48525. 165
  48526. -1
  48527. show_property
  48528. 2
  48529. 165
  48530. -1
  48531. show_verbdef
  48532. 2
  48533. 165
  48534. -1
  48535. explain_verb_syntax
  48536. 2
  48537. 173
  48538. -1
  48539. verb_p*erms verb_permi*ssions
  48540. 2
  48541. 173
  48542. -1
  48543. verb_loc*ation
  48544. 38
  48545. 173
  48546. -1
  48547. verb_documentation
  48548. 2
  48549. 165
  48550. -1
  48551. set_verb_documentation
  48552. 2
  48553. 173
  48554. -1
  48555. parse_propref
  48556. 2
  48557. 173
  48558. -1
  48559. parse_verbref
  48560. 2
  48561. 173
  48562. -1
  48563. parse_argspec
  48564. 38
  48565. 173
  48566. -1
  48567. prepositions
  48568. 38
  48569. 173
  48570. -1
  48571. short_prep
  48572. 38
  48573. 173
  48574. -1
  48575. full_prep
  48576. 38
  48577. 173
  48578. -1
  48579. get_prep
  48580. 38
  48581. 165
  48582. -1
  48583. _fix_preps
  48584. 38
  48585. 165
  48586. 1
  48587. find_verb_named
  48588. 2
  48589. 165
  48590. -1
  48591. find_last_verb_named
  48592. 2
  48593. 165
  48594. -1
  48595. find_callable_verb_named
  48596. 2
  48597. 165
  48598. -1
  48599. verbname_match(new)
  48600. 38
  48601. 173
  48602. -1
  48603. find_verbs_containing
  48604. 2
  48605. 173
  48606. -1
  48607. _find_verbs_containing
  48608. 2
  48609. 165
  48610. -1
  48611. find_verbs_matching
  48612. 2
  48613. 173
  48614. -1
  48615. _find_verbs_matching
  48616. 2
  48617. 165
  48618. -1
  48619. _grep_verb_code
  48620. 2
  48621. 165
  48622. -1
  48623. _egrep_verb_code
  48624. 2
  48625. 165
  48626. -1
  48627. _parse_audit_args
  48628. 38
  48629. 173
  48630. -1
  48631. help_db_list
  48632. 2
  48633. 165
  48634. -1
  48635. help_db_search
  48636. 38
  48637. 165
  48638. -1
  48639. corify_object
  48640. 38
  48641. 165
  48642. -1
  48643. substitute
  48644. 2
  48645. 173
  48646. -1
  48647. inside_quotes
  48648. 2
  48649. 173
  48650. -1
  48651. verb_or_property
  48652. 2
  48653. 165
  48654. -1
  48655. task_valid
  48656. 2
  48657. 165
  48658. -1
  48659. task_owner
  48660. 2
  48661. 173
  48662. -1
  48663. argstr
  48664. 2
  48665. 173
  48666. -1
  48667. verbname_match
  48668. 38
  48669. 173
  48670. -1
  48671. show_who_listing
  48672. 2
  48673. 165
  48674. -1
  48675. _egrep_verb_code_all
  48676. 2
  48677. 173
  48678. -1
  48679. _grep_verb_code_all
  48680. 2
  48681. 173
  48682. -1
  48683. _grep_verb_code_all
  48684. 38
  48685. 173
  48686. -1
  48687. verb_usage
  48688. 2
  48689. 165
  48690. -1
  48691. 10
  48692. prepositions
  48693. _version
  48694. _multi_preps
  48695. _other_preps_n
  48696. _other_preps
  48697. _short_preps
  48698. _all_preps
  48699. builtin_props
  48700. error_names
  48701. error_list
  48702. 14
  48703. 4
  48704. 15
  48705. 2
  48706. with/using
  48707. 2
  48708. at/to
  48709. 2
  48710. in front of
  48711. 2
  48712. in/inside/into
  48713. 2
  48714. on top of/on/onto/upon
  48715. 2
  48716. out of/from inside/from
  48717. 2
  48718. over
  48719. 2
  48720. through
  48721. 2
  48722. under/underneath/beneath
  48723. 2
  48724. behind
  48725. 2
  48726. beside
  48727. 2
  48728. for/about
  48729. 2
  48730. is
  48731. 2
  48732. as
  48733. 2
  48734. off/off of
  48735. 38
  48736. 5
  48737. 2
  48738. 1.7.5
  48739. 38
  48740. 5
  48741. 4
  48742. 7
  48743. 2
  48744. off
  48745. 2
  48746. from
  48747. 2
  48748. out
  48749. 2
  48750. on
  48751. 2
  48752. on top
  48753. 2
  48754. in
  48755. 2
  48756. in front
  48757. 38
  48758. 5
  48759. 4
  48760. 13
  48761. 0
  48762. 1
  48763. 0
  48764. 2
  48765. 0
  48766. 4
  48767. 0
  48768. 4
  48769. 0
  48770. 5
  48771. 0
  48772. 5
  48773. 0
  48774. 5
  48775. 0
  48776. 6
  48777. 0
  48778. 6
  48779. 0
  48780. 9
  48781. 0
  48782. 9
  48783. 0
  48784. 12
  48785. 0
  48786. 15
  48787. 38
  48788. 5
  48789. 4
  48790. 13
  48791. 2
  48792. using
  48793. 2
  48794. at
  48795. 2
  48796. inside
  48797. 2
  48798. into
  48799. 2
  48800. on top of
  48801. 2
  48802. onto
  48803. 2
  48804. upon
  48805. 2
  48806. out of
  48807. 2
  48808. from inside
  48809. 2
  48810. underneath
  48811. 2
  48812. beneath
  48813. 2
  48814. about
  48815. 2
  48816. off of
  48817. 38
  48818. 5
  48819. 4
  48820. 15
  48821. 2
  48822. with
  48823. 2
  48824. to
  48825. 2
  48826. in front of
  48827. 2
  48828. in
  48829. 2
  48830. on
  48831. 2
  48832. from
  48833. 2
  48834. over
  48835. 2
  48836. through
  48837. 2
  48838. under
  48839. 2
  48840. behind
  48841. 2
  48842. beside
  48843. 2
  48844. for
  48845. 2
  48846. is
  48847. 2
  48848. as
  48849. 2
  48850. off
  48851. 38
  48852. 5
  48853. 4
  48854. 28
  48855. 2
  48856. with
  48857. 2
  48858. using
  48859. 2
  48860. at
  48861. 2
  48862. to
  48863. 2
  48864. in front of
  48865. 2
  48866. in
  48867. 2
  48868. inside
  48869. 2
  48870. into
  48871. 2
  48872. on top of
  48873. 2
  48874. on
  48875. 2
  48876. onto
  48877. 2
  48878. upon
  48879. 2
  48880. out of
  48881. 2
  48882. from inside
  48883. 2
  48884. from
  48885. 2
  48886. over
  48887. 2
  48888. through
  48889. 2
  48890. under
  48891. 2
  48892. underneath
  48893. 2
  48894. beneath
  48895. 2
  48896. behind
  48897. 2
  48898. beside
  48899. 2
  48900. for
  48901. 2
  48902. about
  48903. 2
  48904. is
  48905. 2
  48906. as
  48907. 2
  48908. off
  48909. 2
  48910. off of
  48911. 38
  48912. 5
  48913. 4
  48914. 9
  48915. 2
  48916. name
  48917. 2
  48918. r
  48919. 2
  48920. w
  48921. 2
  48922. f
  48923. 2
  48924. programmer
  48925. 2
  48926. wizard
  48927. 2
  48928. owner
  48929. 2
  48930. location
  48931. 2
  48932. contents
  48933. 2
  48934. 1
  48935. 4
  48936. 15
  48937. 2
  48938. E_NONE
  48939. 2
  48940. E_TYPE
  48941. 2
  48942. E_DIV
  48943. 2
  48944. E_PERM
  48945. 2
  48946. E_PROPNF
  48947. 2
  48948. E_VERBNF
  48949. 2
  48950. E_VARNF
  48951. 2
  48952. E_INVIND
  48953. 2
  48954. E_RECMOVE
  48955. 2
  48956. E_MAXREC
  48957. 2
  48958. E_RANGE
  48959. 2
  48960. E_ARGS
  48961. 2
  48962. E_NACC
  48963. 2
  48964. E_INVARG
  48965. 2
  48966. E_QUOTA
  48967. 38
  48968. 5
  48969. 4
  48970. 15
  48971. 3
  48972. 0
  48973. 3
  48974. 1
  48975. 3
  48976. 2
  48977. 3
  48978. 3
  48979. 3
  48980. 4
  48981. 3
  48982. 5
  48983. 3
  48984. 6
  48985. 3
  48986. 7
  48987. 3
  48988. 8
  48989. 3
  48990. 9
  48991. 3
  48992. 10
  48993. 3
  48994. 11
  48995. 3
  48996. 12
  48997. 3
  48998. 13
  48999. 3
  49000. 14
  49001. 38
  49002. 5
  49003. 5
  49004. 38
  49005. 4
  49006. 4
  49007. 2
  49008. 2
  49009. code
  49010. 2
  49011. utils
  49012. 38
  49013. 5
  49014. 4
  49015. 45
  49016. 2
  49017. parse_propref("foo.bar")  => {"foo","bar"} (or 0 if arg. isn't a property ref.)
  49018. 2
  49019. parse_verbref("foo:bar")  => {"foo","bar"} (or 0 if arg. isn't a verb ref.)
  49020. 2
  49021. parse_argspec("any","in","front","of","this","baz"...)
  49022. 2
  49023.                           => {{"any", "in front of", "this"},{"baz"...}} 
  49024. 2
  49025.                                            (or string if args don't parse)
  49026. 2
  49027.  
  49028. 2
  49029. tonum(string)           => number (or E_TYPE if string is not a number)
  49030. 2
  49031. toobj(string)           => object (or E_TYPE if string is not an object)
  49032. 2
  49033. toerr(number or string) => error value (or 1 if out of range or unrecognized)
  49034. 2
  49035. error_name(error value) => name of error (e.g., error_name(E_PERM) => "E_PERM")
  49036. 2
  49037.  
  49038. 2
  49039. verb_perms()    => the current task_perms (as set by set_task_perms()).
  49040. 2
  49041. verb_location() => the object where the current verb is defined.
  49042. 2
  49043. verb_documentation([object,verbname]) => documentation at beginning of
  49044. 2
  49045.            verb code, if any -- default is the calling verb
  49046. 2
  49047.  
  49048. 2
  49049.    Preposition routines
  49050. 2
  49051.  
  49052. 2
  49053. prepositions()     => full list of prepostions
  49054. 2
  49055. full_prep ("in")   => "in/inside/into"
  49056. 2
  49057. short_prep("into") => "in"
  49058. 2
  49059. short_prep("in/inside/into") => "in"
  49060. 2
  49061. get_prep  ("off", "of", "the", "table") => {"off of", "the", "table"}
  49062. 2
  49063.  
  49064. 2
  49065.    Verb routines
  49066. 2
  49067.  
  49068. 2
  49069. verbname_match (fullname,name) => can `name' be used to call `fullname'
  49070. 2
  49071. find_verb_named          (object,name[,n]) => verb number or -1 if not found
  49072. 2
  49073. find_callable_verb_named (object,name[,n]) => verb number or -1 if not found
  49074. 2
  49075. find_verbs_containing (pattern[,object|objlist])
  49076. 2
  49077.  
  49078. 2
  49079.    Verbs that do the actual dirty work for @show:
  49080. 2
  49081.  
  49082. 2
  49083. show_object  (object)
  49084. 2
  49085. show_property(object,propname)
  49086. 2
  49087. show_verbdef (object,verbname)
  49088. 2
  49089.  
  49090. 2
  49091.    Dirty work for explain_syntax
  49092. 2
  49093.  
  49094. 2
  49095. explain_verb_syntax(thisname,verbname,@verbargs)
  49096. 2
  49097.  
  49098. 2
  49099.    A random but useful verb
  49100. 2
  49101.  
  49102. 2
  49103. verb_or_property(object,name[,@args]) => result of verb or property call,
  49104. 2
  49105.                                          or E_PROPNF
  49106. 38
  49107. 5
  49108. 4
  49109. 2
  49110. 0
  49111. 52397
  49112. 0
  49113. 743583974
  49114. 2
  49115. 1
  49116. #61
  49117. Help Database
  49118.  
  49119. 16
  49120. 38
  49121. -1
  49122. -1
  49123. -1
  49124. 32
  49125. -1
  49126. 45
  49127. 8
  49128. player_quota
  49129. 2
  49130. 173
  49131. -1
  49132. prog_quota
  49133. 2
  49134. 173
  49135. -1
  49136. get_topic
  49137. 2
  49138. 165
  49139. -1
  49140. find_topics
  49141. 2
  49142. 165
  49143. -1
  49144. full_index
  49145. 38
  49146. 173
  49147. -1
  49148. index_list
  49149. 38
  49150. 165
  49151. -1
  49152. wizard_list
  49153. 2
  49154. 165
  49155. -1
  49156. dump_topic
  49157. 38
  49158. 173
  49159. -1
  49160. 171
  49161. @locations
  49162. @uptime
  49163. @mailoptions
  49164. @sort-owned
  49165. @verify-owned
  49166. @add-owned
  49167. @mail-options
  49168. wizard-list
  49169. @wrap
  49170. full-index
  49171.  index
  49172. gen-index
  49173. mail-forwarding
  49174. @pagelength
  49175. @more
  49176. programming
  49177. @forward
  49178. @subscribe
  49179. @rn
  49180. @unsubscribe
  49181. @skip
  49182. negative_quota
  49183. zombie-messages
  49184. message-sequences
  49185. common_quota
  49186. @recreate
  49187. @linelength
  49188. room-messages
  49189. @unrmmail
  49190. @gaglist
  49191. ::
  49192. @comment
  49193. @remove-entrance
  49194. @remove-exit
  49195. @parents
  49196. @contents
  49197.  
  49198. spoofing
  49199. privacy
  49200. @realm
  49201. @resident
  49202. @examine
  49203. security
  49204. @sweep
  49205. @paranoid
  49206. @check
  49207. @reply
  49208. @eject
  49209. @quit
  49210. whereis
  49211. @suggest
  49212. @idea
  49213. @bug
  49214. @typo
  49215. @renumber
  49216. @notedit
  49217. editors
  49218. @prev
  49219. @unlock_for_open
  49220. @lock_for_open
  49221. @opacity
  49222. container-messages
  49223. @memory
  49224. "
  49225. :
  49226. @lastlog
  49227. @version
  49228. miscellaneous
  49229. insert
  49230. information
  49231. ?
  49232. put
  49233. remove
  49234. burn
  49235. letters
  49236. decrypt
  49237. encrypt
  49238. delete
  49239. erase
  49240. write
  49241. read
  49242. examine
  49243. hand
  49244. key-representation
  49245. keys
  49246. @unlock
  49247. @lock
  49248. locking
  49249. thing-messages
  49250. throw
  49251. take
  49252. @messages
  49253. pronouns
  49254. exit-messages
  49255. messages
  49256. descriptions
  49257. @describe
  49258. @add-entrance
  49259. @add-exit
  49260. topology
  49261. @classes
  49262. @audit
  49263. @count
  49264. @quota
  49265. @create
  49266. tinymud
  49267. @next
  49268. @answer
  49269. @rmmail
  49270. @read
  49271. @send
  49272. mail
  49273. @gripe
  49274. creation
  49275. @mail
  49276. @listgag
  49277. @ungag
  49278. @gag
  49279. go
  49280. @password
  49281. @sethome
  49282. @who
  49283. introduction
  49284. give
  49285. news
  49286. gagging
  49287. @dig
  49288. @move
  49289. inventory
  49290. @entrances
  49291. @exits
  49292. @gender
  49293. @recycle
  49294. @rename
  49295. containers
  49296. notes
  49297. look
  49298. drop
  49299. get
  49300. manipulation
  49301. help
  49302. rooms
  49303. movement
  49304. home
  49305. communication
  49306. say
  49307. whisper
  49308. page
  49309. emote
  49310. building
  49311. players
  49312. summary
  49313. @edit-options
  49314. @editoptions
  49315. @add-feature
  49316. @remove-feature
  49317. @features
  49318. features
  49319. @dump
  49320. me
  49321. @rmalias
  49322. @addalias
  49323. commands
  49324.  name
  49325.  alias
  49326. @setprop
  49327. @set
  49328. @peek
  49329. @subscribed
  49330. @request-character
  49331. player-names
  49332. 176
  49333. 4
  49334. 7
  49335. 2
  49336. Syntax:  @locations object
  49337. 2
  49338.  
  49339. 2
  49340. Prints out the names and object numbers of all containing objects.
  49341. 2
  49342.  
  49343. 2
  49344. Example:
  49345. 2
  49346.   @locations ur-Rog
  49347. 2
  49348.   ur-Rog(#6349)   ur-Rog's Display Case(#6355)   Editorial Boardroom(#5747)
  49349. 38
  49350. 5
  49351. 4
  49352. 4
  49353. 2
  49354. Syntax:  @uptime
  49355. 2
  49356.  
  49357. 2
  49358.    The @uptime command displays the amount of time since the last restart of the server.
  49359. 2
  49360.    Note to programmers:  The last restart time of the server is stored in $last_restart_time.
  49361. 38
  49362. 5
  49363. 4
  49364. 2
  49365. 2
  49366. *forward*
  49367. 2
  49368. @mail-options
  49369. 38
  49370. 1
  49371. 4
  49372. 3
  49373. 2
  49374. Syntax:  @sort-owned
  49375. 2
  49376.  
  49377. 2
  49378. Sorts your .owned_objects property so @audit shows up sorted.  See help @audit for more information.
  49379. 38
  49380. 5
  49381. 4
  49382. 3
  49383. 2
  49384. Syntax:  @verify-owned
  49385. 2
  49386.  
  49387. 2
  49388. Checks that all the objects in your .owned_objects property are actually owned by you, and effects repairs if needed.  See help @audit for more information.
  49389. 38
  49390. 5
  49391. 4
  49392. 3
  49393. 2
  49394. Syntax:  @add-owned <object>
  49395. 2
  49396.  
  49397. 2
  49398. Adds an object to your .owned_objects property in case it managed not to get updated properly upon creation of that object.  Checks to ensure that the objects is really owned by you and otherwise belongs in your .owned_objects property.  See help @audit for more information.
  49399. 38
  49400. 5
  49401. 4
  49402. 52
  49403. 2
  49404. Syntax:  @mail-option
  49405. 2
  49406.          @mail-option <option>
  49407. 2
  49408.  
  49409. 2
  49410. Synonym:  @mailoption
  49411. 2
  49412.  
  49413. 2
  49414. The first form displays all of your mail options
  49415. 2
  49416. The second displays just that one option, which may be either `@mail', `replyto', or one of the flags listed below.  The mail options control various annoying details of your mail reading and mail editing commands.
  49417. 2
  49418.  
  49419. 2
  49420. The remaining forms of this command are for setting your mail options:
  49421. 2
  49422.  
  49423. 2
  49424.          @mail-option +<flag>
  49425. 2
  49426.          @mail-option -<flag>
  49427. 2
  49428.          @mail-option !<flag>           (equivalent to -<flag>)
  49429. 2
  49430.  
  49431. 2
  49432. These respectively set and reset the specified flag
  49433. 2
  49434.  
  49435. 2
  49436.  -include      @reply's start out with a blank message body
  49437. 2
  49438.  +include      @reply's start with original message included
  49439. 2
  49440.  -all          @reply's go to sender only
  49441. 2
  49442.  +all          @reply's go to sender and all original recipients
  49443. 2
  49444.  -nosubject    @send forces you to provide a Subject: line
  49445. 2
  49446.  +nosubject    allow entering the mail editor without giving a subject line
  49447. 2
  49448.  -enter        start each mail editing session in the usual command mode.
  49449. 2
  49450.  +enter        start each mail editing session with an implicit `enter' command
  49451. 2
  49452.  -expert       novice mail user (various annoying messages will be printed)
  49453. 2
  49454.  +expert       expert mail user (suppress printing of annoying messages)
  49455. 2
  49456.  -sticky       each mail command applies by default to one's own collection
  49457. 2
  49458.  +sticky       each mail command applies by default to the same message 
  49459. 2
  49460.                  collection that the previous successful command did
  49461. 2
  49462.  
  49463. 2
  49464. For "sticky", `mail command' is one of @mail, @read, @prev, @next, @answer.
  49465. 2
  49466. All flags default to the `-' settings.  
  49467. 2
  49468.  
  49469. 2
  49470. Next, we have
  49471. 2
  49472.  
  49473. 2
  49474.          @mail-option  manymsgs [is] <number>
  49475. 2
  49476.          @mail-option  manymsgs=<number>
  49477. 2
  49478.          @mail-option -manymsgs
  49479. 2
  49480.  
  49481. 2
  49482. The first two forms specify that if you give a @mail or @read command asking for <number> or more messages, you will first be given a yes-or-no prompt to continue, the idea being that you many not actually have wanted to see that many messages.  The third form turns off this behavior.
  49483. 2
  49484.  
  49485. 2
  49486.          @mail-option  @mail [is] <message-sequence>
  49487. 2
  49488.  
  49489. 2
  49490. The "@mail" option determines what message-sequence the @mail command uses by 
  49491. 2
  49492. default.  Initially, this is "last:15", but other reasonable choices include
  49493. 2
  49494. "new" and "1-last"
  49495. 2
  49496.  
  49497. 2
  49498.          @mail-option  replyto [is] <recipient> [<recipient>...]
  49499. 2
  49500.          @mail-option -replyto
  49501. 2
  49502.  
  49503. 2
  49504. The first form specifies that a Reply-To: field is to be placed in all messages constructed by @send or @answer.  Note this can still be changed before sending via the mail room's reply-to command.  
  49505. 2
  49506. The second form resets this option so that no Reply-to: is initially inserted.
  49507. 38
  49508. 5
  49509. 4
  49510. 4
  49511. 2
  49512. *subst*
  49513. 2
  49514.  
  49515. 2
  49516. %;this:wizard_list()
  49517. 2
  49518.  
  49519. 38
  49520. 5
  49521. 4
  49522. 2
  49523. 2
  49524. *forward*
  49525. 2
  49526. @linelength
  49527. 38
  49528. 1
  49529. 4
  49530. 1
  49531. 2
  49532. *full_index*
  49533. 38
  49534. 5
  49535. 4
  49536. 1
  49537. 2
  49538. *index_list*
  49539. 38
  49540. 5
  49541. 4
  49542. 2
  49543. 2
  49544. *index*
  49545. 2
  49546. General Help Topics
  49547. 38
  49548. 5
  49549. 4
  49550. 30
  49551. 2
  49552. There are 3 personal properties that you can use to customize how your mail is composed and forwarded
  49553. 2
  49554.  
  49555. 2
  49556. .mail_forward 
  49557. 2
  49558.  -- list of objects that will receive any mail that gets sent to you.
  49559. 2
  49560.     Objects on this list should either be players or descendants of 
  49561. 2
  49562.     $mail_recipient.
  49563. 2
  49564.     If this list is nonempty, you will not receive any mail yourself unless
  49565. 2
  49566.     you are on it.  E.g., if Rog is #4292 and ur-Rog is #6349
  49567. 2
  49568.  
  49569. 2
  49570.   #6349.mail_forward={}            -- usual case; ur-Rog gets his own mail.
  49571. 2
  49572.   #6349.mail_forward={#4292}       -- Rog gets ur-Rog's mail instead.
  49573. 2
  49574.   #6349.mail_forward={#6349,#4292} -- ur-Rog gets mail and Rog gets a copy.
  49575. 2
  49576.   #6349.mail_forward={#-1}         -- ur-Rog's mail disappears without a trace.
  49577. 2
  49578.  
  49579. 2
  49580. .mail_notify
  49581. 2
  49582.  -- list of objects to be notified whenever mail is sent to you.
  49583. 2
  49584.     This list may include anything that has a :notify_mail() verb.
  49585. 2
  49586.     Notification will take place regardless of whether or how your mail
  49587. 2
  49588.     is forwarded.  
  49589. 2
  49590.  
  49591. 2
  49592. Thus, in the previous example
  49593. 2
  49594.  
  49595. 2
  49596.   #4292.mail_notify={#6349} --- means that ur-Rog will be told
  49597. 2
  49598.                                 whenever Rog is sent new mail.
  49599. 2
  49600.  
  49601. 2
  49602. .mail_options
  49603. 2
  49604.  -- this controls lots of miscellaneous things.  Use the @mail-option command
  49605. 2
  49606.     to view and set these options (see `help @mail-option')
  49607. 2
  49608.  
  49609. 2
  49610. See `help mail-resolve' for more detail on how mail forwarding and mail notification work.  See `help MR-subscribing' for information on how to change .mail_forward and .mail_notify on $mail_recipient children, where they are !c properties.
  49611. 38
  49612. 5
  49613. 4
  49614. 21
  49615. 2
  49616. Syntax:  @pagelength <number>
  49617. 2
  49618.          @pagelength
  49619. 2
  49620.  
  49621. 2
  49622. If the lines you see scroll off the top of your screen too quickly for you to
  49623. 2
  49624. read and your client program is such that any lines scrolling off the top are
  49625. 2
  49626. gone forever, you can use the @pagelength command to invoke page buffering to
  49627. 2
  49628. limit the number of lines sent at a time.  E.g., if your terminal has a 24 line
  49629. 2
  49630. screen, you can do @pagelength 24 and output will stop every 24 lines if you
  49631. 2
  49632. don't type any other commands.
  49633. 2
  49634.  
  49635. 2
  49636. You will need to use the @more command to continue reading output once it 
  49637. 2
  49638. has been stopped.  Make sure you read `help @more' before setting @pagelength.
  49639. 2
  49640.  
  49641. 2
  49642. @pagelength 0 means no page buffering will be done by the MOO.
  49643. 2
  49644.  
  49645. 2
  49646. By default the MOO will assume you have an infinitely wide terminal screen, so
  49647. 2
  49648. you may wish to set @linelength as well, and ensure wrapping is on with @wrap
  49649. 2
  49650. on.  (See help @linelength and help @wrap.)  As with word wrapping, you are
  49651. 2
  49652. best off running a client that can do its own page buffering; the MOO server's
  49653. 2
  49654. page buffering is inherently slower and many MUD's do not have page buffering
  49655. 2
  49656. at all.
  49657. 2
  49658. 1
  49659. 4
  49660. 19
  49661. 2
  49662. *subst*
  49663. 2
  49664. Syntax:  @more
  49665. 2
  49666.          @more rest
  49667. 2
  49668.          @more flush
  49669. 2
  49670.  
  49671. 2
  49672. If you have @pagelength set (see `help @pagelength') and some combination of events or commands produces sufficiently many lines of output, you will see a message of the form
  49673. 2
  49674.  
  49675. 2
  49676. %[strsub(player.more_msg,"%%n","37")]
  49677. 2
  49678.  
  49679. 2
  49680. indicating (in this case) 37 more lines of text waiting to be read.  
  49681. 2
  49682. At this point, you should give one of the @more commands above.  
  49683. 2
  49684.  
  49685. 2
  49686. @more without arguments prints sufficiently many lines to fill your screen,
  49687. 2
  49688. assuming you've set @pagelength correctly, unless there are not that many
  49689. 2
  49690. lines left to print.
  49691. 2
  49692.  
  49693. 2
  49694. @more rest will print all of the remaining lines, regardless of your @pagelength setting.  
  49695. 2
  49696.  
  49697. 2
  49698. @more flush discards all remaining lines
  49699. 2
  49700. 1
  49701. 4
  49702. 3
  49703. 2
  49704. MOO contains a rich programming language for the creation of interesting rooms, exits, and other objects.
  49705. 2
  49706.  
  49707. 2
  49708. Not every player is allowed to program in MOO, including (at the moment, anyway) you.  If you would like to be, find a wizard and convince them that you've got good ideas that the MOO needs.  Good luck!
  49709. 38
  49710. 5
  49711. 4
  49712. 3
  49713. 2
  49714. Syntax:  @forward <msg> [on *<collection>] to <recipient> [<recipient>...]
  49715. 2
  49716.  
  49717. 2
  49718. Takes the indicated message in your (or some other) message collection, creates a new message whose body is the original message (both headers and body) and sends it on to the given recipients.
  49719. 38
  49720. 5
  49721. 4
  49722. 23
  49723. 2
  49724. Syntax:  @subscribe *<collection>
  49725. 2
  49726.          @subscribe
  49727. 2
  49728.  
  49729. 2
  49730. The first form of this command does two things:
  49731. 2
  49732.  
  49733. 2
  49734. (1) it sets up a current message and a last-read-time for the given mail 
  49735. 2
  49736.     collection so that when next you log in, you will be informed about new 
  49737. 2
  49738.     mail that has appeared there.  Note that this happens automatically
  49739. 2
  49740.     whenever you @read messages on a given collection, so if this much is 
  49741. 2
  49742.     all you care about, you don't need to use this command; just do, e.g.,
  49743. 2
  49744.              @read last on *<collection>
  49745. 2
  49746.  
  49747. 2
  49748. (2) adds you to the .mail_notify list for that collection, so that you will
  49749. 2
  49750.     be notified *immediately* whenever new mail is sent there.
  49751. 2
  49752.  
  49753. 2
  49754. You can only @subscribe to collections that are readable by you.
  49755. 2
  49756. The second form of the command gives a list of collections available to you.
  49757. 2
  49758.  
  49759. 2
  49760. Note that this is entirely different from the Mail Room `subscribe' command
  49761. 2
  49762. which actually adds you to the .mail_forward list for a given collection/
  49763. 2
  49764. mailing-list, so that mail sent to the list actually shows up in your own
  49765. 2
  49766. mail collection.
  49767. 2
  49768. We're probably going to phase out the Mail Room `subscribe' command...
  49769. 38
  49770. 5
  49771. 4
  49772. 5
  49773. 2
  49774. Syntax:  @rn
  49775. 2
  49776.  
  49777. 2
  49778. For each collection of mail messages that you read other from your own, a last-read-time is kept.  This command tells you which collections (out of all those you have ever read) have recently had messages added to them, i.e., more recently than when you last did a @read, @prev, @next, or @skip on that collection.
  49779. 2
  49780.  
  49781. 2
  49782. Etymologists' note:  If you thought @rn had anything to do with the popular UNIX newsreading program `rn', it's just your imagination.
  49783. 38
  49784. 5
  49785. 4
  49786. 2
  49787. 2
  49788. *forward*
  49789. 2
  49790. @skip
  49791. 38
  49792. 5
  49793. 4
  49794. 8
  49795. 2
  49796. Syntax:  @skip [<collection>...]
  49797. 2
  49798.          @unsubscribe [<collection>...]
  49799. 2
  49800.  
  49801. 2
  49802. For each collection of mail messages that you read other from your own, a current message and a last-read-time is kept.  Normally, if you neglect to actually @read any messages on a collection other from your own, @rn (or :check_mail_lists) will continue to remind you that they are there.
  49803. 2
  49804.  
  49805. 2
  49806. The @skip command indicates that you're not interested in reading the rest of the messages that currently exist in that given collection.  
  49807. 2
  49808.  
  49809. 2
  49810. The @unsubscribe command flushes the current-message/last-read-time information completely, indicating that you are not only uninterested in the rest of the messages on that collection, but also likewise uninterested in anything else that may appear on that collection later on.  @unsubscribe also removes you from the collection's .mail_notify list.
  49811. 38
  49812. 5
  49813. 4
  49814. 10
  49815. 2
  49816. *subst*
  49817. 2
  49818. We recently reduced the initial quota for new players to %[$help:player_quota()].
  49819. 2
  49820. Those of you who were around before this are covered by a grandfather clause
  49821. 2
  49822. i.e., you get to keep your over-quota objects.  However this means that 
  49823. 2
  49824. your quota for creating new objects may now be *more than* used up, i.e.,
  49825. 2
  49826. negative.  In particular, this means that if you recycle an object, 
  49827. 2
  49828. you will not be able to @create one in its place.
  49829. 2
  49830.  
  49831. 2
  49832. You can, however, re-use your over-quota objects by using the @recreate 
  49833. 2
  49834. command instead (see `help recreate').
  49835. 38
  49836. 5
  49837. 4
  49838. 2
  49839. 2
  49840. *forward*
  49841. 2
  49842. @unrmmail
  49843. 38
  49844. 5
  49845. 4
  49846. 45
  49847. 2
  49848. Certain mail commands, including @mail, @read, and @rmmail, allow a <message-sequence> argument that indicates to which messages in one's collection the command is to apply.  Any combination of the following may appear as a <message-sequence> argument to any of the various mail commands (@mail, @read, @answer, @rmm).
  49849. 2
  49850.  
  49851. 2
  49852.   17        message number 17 if there is one (and likewise for other integers)
  49853. 2
  49854.   17..23    all messages numbered between 17 and 23 (inclusive), if any.
  49855. 2
  49856.   cur       the current message
  49857. 2
  49858.   prev      the message before
  49859. 2
  49860.   next      the message after
  49861. 2
  49862.   last      the final message if any (`$' is a synonym for `last')
  49863. 2
  49864.  
  49865. 2
  49866. You may use as many of these at once as sanity permits, e.g.,
  49867. 2
  49868.  
  49869. 2
  49870.   @mail cur 1..5 last
  49871. 2
  49872.  
  49873. 2
  49874. which will display the header for your current message, your messages in the range 1..5, and your last message.  Though some of these ranges may overlap, the header for any given message is only shown once in any event.
  49875. 2
  49876.  
  49877. 2
  49878. In addition, there are other message-sequence arguments that act as filters
  49879. 2
  49880. on whatever precedes them
  49881. 2
  49882.  
  49883. 2
  49884.  before:<date>               messages strictly before the given date
  49885. 2
  49886.  after:<date>                messages strictly after the given date
  49887. 2
  49888.  since:<date>                messages on or after the given date
  49889. 2
  49890.  until:<date>                messages on or before the given date
  49891. 2
  49892.  from:<player>[|<player...]  messages from the given player(s)
  49893. 2
  49894.  to:<recip>[|<recip>...]     messages to the given recipient(s)
  49895. 2
  49896.  subject:<string>            messages with <string> in the subject
  49897. 2
  49898.  body:<string>               messages with <string> in the body (SLOW!!!)
  49899. 2
  49900.  first:<number>              the first <number> messages
  49901. 2
  49902.  last:<number>               the last <number> messages
  49903. 2
  49904.  
  49905. 2
  49906. <date>  is either a weekday, an dd-Month, dd-Month-yy or dd-Month-yyyy date
  49907. 2
  49908. <recip> is either <player> or *<$mail_recipient kid>
  49909. 2
  49910.  
  49911. 2
  49912. Examples:
  49913. 2
  49914.  
  49915. 2
  49916.   @read from:G7|Gemba              read all messages from G7 or Gemba
  49917. 2
  49918.   @rmm to:yduJ|*Core               remove messages that are to yduJ or to *Core
  49919. 2
  49920.   @mail since:1-Jan before:1-Feb   show messages dated in January
  49921. 2
  49922.   @mail since:Tues                 show messages dated on or after Tuesday
  49923. 2
  49924.   @rmm subject:manners             remove msgs with `manners' in the subject:
  49925. 2
  49926.   @mail subject:"stupid idiots"    (search string contains a space => need "'s)
  49927. 2
  49928.   @rmm to:yduJ to:*Core            remove messages that are to yduJ and *Core
  49929. 2
  49930.   @mail from:Haakon last:5         show the last 5 messages from Haakon
  49931. 2
  49932.   @mail last:10 body:fribble       show those of the last 10 messages having
  49933. 2
  49934.                                    `fribble' in the body (one should always try
  49935. 2
  49936.                                    to narrow body searches in this way).
  49937. 38
  49938. 5
  49939. 4
  49940. 7
  49941. 2
  49942. Syntax:  @quota
  49943. 2
  49944.  
  49945. 2
  49946. Each player has a limit as to how many objects that player may create, called their 'quota'.  Every object they create lowers the quota by one and every object they recycle increases it by one.  If the quota goes to zero, then that player may not create any more objects (unless, of course, they recycle some first).
  49947. 2
  49948.  
  49949. 2
  49950. The @quota command prints out your current quota.
  49951. 2
  49952.  
  49953. 2
  49954. The quota mechanism is intended to solve a long-standing problem in many MUDs: database bloat.  The problem is that a large number of people build a large number of dull objects and areas that are subsequently never used or visited.  The database becomes quite large and difficult to manage without getting substantially more interesting.  With the quota system, we can make it possible for players to experiment and learn while simultaneously keeping random building to acceptable levels.
  49955. 2
  49956. 1
  49957. 4
  49958. 5
  49959. 2
  49960. Usage: @recreate <object> as <parent> named <name spec>
  49961. 2
  49962.  
  49963. 2
  49964. This is a combination of @create and @chparent.  It takes an existing object, completely strips it of any verbs, properties, and values for inherited properties.  This object is then reshaped into a child of the parent specified, as though @create had been called, but retaining the same object number as the original.
  49965. 2
  49966.  
  49967. 2
  49968. The <parent> and <name spec> arguments are as in @create.
  49969. 38
  49970. 5
  49971. 4
  49972. 22
  49973. 2
  49974. Syntax:  @wrap <on|off>
  49975. 2
  49976.          @wrap
  49977. 2
  49978.  
  49979. 2
  49980.          @linelength <number>
  49981. 2
  49982.          @linelength
  49983. 2
  49984.  
  49985. 2
  49986. If the lines you see get cut off at the edge of your screen (you don't have
  49987. 2
  49988. word-wrap), you can get LambdaMOO to split lines for you.  The @linelength
  49989. 2
  49990. command tells the MOO how many columns you have on your screen--you probably
  49991. 2
  49992. want @linelength 79--and "@wrap on" tells the MOO you want it to do word-
  49993. 2
  49994. wrap.
  49995. 2
  49996.  
  49997. 2
  49998. It's better if you can fix this problem without LambdaMOO's help, though,
  49999. 2
  50000. because the MOO's solution will be slower than a local solution, and
  50001. 2
  50002. because not all MUDs are willing to do word-wrap.
  50003. 2
  50004.  
  50005. 2
  50006. If you don't want the MOO to split lines for you, there might still be some
  50007. 2
  50008. use for the @linelength command.  Certain commands, like @who and @check,
  50009. 2
  50010. print truncated lines so they can print in neat columns.  The default for
  50011. 2
  50012. these is generally about 79 columns, which looks fine if you have an
  50013. 2
  50014. eighty-column screen.  If your screen is a different width, though, you
  50015. 2
  50016. can set @linelength and some of these commands will react accordingly.
  50017. 38
  50018. 5
  50019. 4
  50020. 13
  50021. 2
  50022. *subst*
  50023. 2
  50024. A few different messages can be set on a room object (see 'help messages' for instructions on doing so); they are printed to various audiences when a player or other object is ejected from the room.  (See 'help @eject'.)  The standard pronoun substitutions are made on each message before it is printed; see 'help pronouns' for details.
  50025. 2
  50026.  
  50027. 2
  50028. The default message is given in brackets after each name below:
  50029. 2
  50030.  
  50031. 2
  50032. @ejection  [%[$room.ejection_msg]]
  50033. 2
  50034.   Printed to the player doing the ejecting.
  50035. 2
  50036.  
  50037. 2
  50038. @victim_ejection  [%[$room.victim_ejection_msg]]
  50039. 2
  50040.   Printed to the object being ejected.
  50041. 2
  50042.  
  50043. 2
  50044. @oejection  [%[$room.oejection_msg]]
  50045. 2
  50046.   Printed to others in the room from which the object is being ejected.
  50047. 38
  50048. 5
  50049. 4
  50050. 13
  50051. 2
  50052. Syntax:  @unrmmail [list|expunge] [on *<collection>]
  50053. 2
  50054.  
  50055. 2
  50056. When you do @rmmail on a particular message collection, the messages removed don't go away immediately, but are rather saved elsewhere.  These "zombie" messages can be brought back or examined using the @UNrmmail command.
  50057. 2
  50058.  
  50059. 2
  50060. Without `list' or `expunge', @unrmm restores the zombie messages, thus undoing the effect of the most recent @rmmail command.  Only the most recent @rmmail can be undone in this way; messages deleted by any previous @rmmail commands on this same collection are lost and gone forever.
  50061. 2
  50062.  
  50063. 2
  50064. The `list' option merely lists the headers of the zombie messages without actually restoring them.
  50065. 2
  50066.  
  50067. 2
  50068. The `expunge' option banishes the zombie messages forever.
  50069. 2
  50070.  
  50071. 2
  50072. Note that the message numbers used by zombie messages are held in reserve against the possibility that you might @unrmm them some day; with such messages around, new messages received will be given higher numbers than you might have expected.  @renumber does an implicit @unrmm expunge.
  50073. 2
  50074.  
  50075. 2
  50076. `@unrmmail' and `@unrmmail expunge' on collections other than your own are only allowed when you have write access.  Likewise, `@unrmmail list' on other collections is only possible when they are readable by you.
  50077. 38
  50078. 5
  50079. 4
  50080. 2
  50081. 2
  50082. *forward*
  50083. 2
  50084. @listgag
  50085. 38
  50086. 5
  50087. 4
  50088. 2
  50089. 2
  50090. *forward*
  50091. 2
  50092. emote
  50093. 38
  50094. 5
  50095. 4
  50096. 2
  50097. 2
  50098. *forward*
  50099. 2
  50100. @typo
  50101. 38
  50102. 5
  50103. 4
  50104. 3
  50105. 2
  50106. Syntax:  @remove-entrance <entrance>
  50107. 2
  50108.  
  50109. 2
  50110. Remove the specified entrance from the current entrances list of the room.  Entrance may be either the name or object number of an entrance to this room.
  50111. 38
  50112. 5
  50113. 4
  50114. 3
  50115. 2
  50116. Syntax:  @remove-exit <exit>
  50117. 2
  50118.  
  50119. 2
  50120. Remove the specified exit from the current exits list of the room.  Exit may be either the name or object number of an exit from this room.
  50121. 38
  50122. 5
  50123. 4
  50124. 8
  50125. 2
  50126. Syntax:  @parents object
  50127. 2
  50128.  
  50129. 2
  50130. A quick way to find out the ancestry of an object.  Prints out the names and object numbers of all ancestors.
  50131. 2
  50132.  
  50133. 2
  50134. Example:
  50135. 2
  50136.   @parents Haakon
  50137. 2
  50138.   Haakon(#2)   generic wizard(#218)   generic programmer(#217)   generic 
  50139. 2
  50140.   player(#6)   Root Class(#1)
  50141. 38
  50142. 5
  50143. 4
  50144. 8
  50145. 2
  50146. Syntax:  @contents object
  50147. 2
  50148.  
  50149. 2
  50150. A quick way to find out the contents of an object.  Prints out the names and object numbers of all direct contents.  This can be useful when you need to refer to something by object number because something is wrong with its aliases.
  50151. 2
  50152.  
  50153. 2
  50154. Example:
  50155. 2
  50156.   @contents here
  50157. 2
  50158.   The Entrance Hall(#19) contains:
  50159. 2
  50160.   Strasbourg Clock(#71)   mirror at about head height(#7444)
  50161. 38
  50162. 5
  50163. 4
  50164. 5
  50165. 2
  50166. *forward*
  50167. 2
  50168. summary
  50169. 2
  50170.  
  50171. 2
  50172. Type 'help <topic>' for information on a particular topic.
  50173. 2
  50174.  
  50175. 38
  50176. 5
  50177. 4
  50178. 2
  50179. 2
  50180. *forward*
  50181. 2
  50182. security
  50183. 38
  50184. 1
  50185. 4
  50186. 15
  50187. 2
  50188. Some things you should be aware of:
  50189. 2
  50190.  
  50191. 2
  50192.  -*-*- OMNISCIENT WIZARDS AND SYSADMINS: -*-*-
  50193. 2
  50194. Wizards can look at absolutely *anything* in the MOO database.  
  50195. 2
  50196. The arch-wizard and the sysadmin for the MOO-server host have complete access not only to the MOO database itself but to many other possibly-relevant things.
  50197. 2
  50198. The above mentioned parties (wizards et al), while they will endeavor to be discreet about anything incidental that turns up, nevertheless reserve the right look at anything they want, if only for the sake of being able to resolve technical problems.
  50199. 2
  50200.  
  50201. 2
  50202.  -*-*- LOGGING: -*-*- 
  50203. 2
  50204. Some client programs (the "client" is the program you use to connect to the MOO, e.g., telnet, tinytalk, tinyfugue, emacs with mud.el...) are capable of logging everything that happens to the corresponding player.  In fact, with some clients this happens by default.  If a given player's client has logging enabled and said player is either in the room with you or is monitoring an object that is in the room with you, then *everything* you say and emote gets recorded.  Also, if you are in a room owned by someone else, all bets are off.  There is *no way* that the MOO server can know about what client a given player is using; thus, anyone who can hear you is a potential logger.
  50205. 2
  50206.  
  50207. 2
  50208. In and of itself this would not be a problem --- indeed, logs are often useful for reference purposes.  However, there is no guarantee that the log will not end up someplace where you'd rather it didn't, e.g., posted on the rec.games.mud Usenet newsgroup.  While it considered bad form (i.e., rude) to circulate or post a log without having the permission of at least the major participants in the activities logged, there is not a whole lot we can do on the technical side to prevent it from happening.
  50209. 2
  50210.  
  50211. 2
  50212. Be aware of the problem.  The @sweep command (see `help @sweep') attempts to determine what players can be listening at any given moment.  If anything, it errs on the side of paranoia.  Even so, it doesn't cover *all* possible avenues of eavesdropping, and there's no hope for it covering the situations like the one where someone manages to convince one of the participants in your discussion who kept a log that it really doesn't need to be kept private after all.
  50213. 2
  50214.  
  50215. 2
  50216. If you've got something really sensitive to discuss, you are best off doing it by encrypted email or in person.
  50217. 38
  50218. 5
  50219. 4
  50220. 17
  50221. 2
  50222. Syntax: @realm [owners] [from root] [missing descendants]
  50223. 2
  50224.  
  50225. 2
  50226. Displays a part of the parenting tree of objects on the MOO, i.e. all
  50227. 2
  50228. the descendants of a given object owned by particular players.
  50229. 2
  50230.  
  50231. 2
  50232. owners:      a list of players whose objects you are interested in. If
  50233. 2
  50234.              one of these is * or !, @realm will display objects only if
  50235. 2
  50236.              they belong to players you didn't mention. (defaults to you)
  50237. 2
  50238. root:        the object which is an ancestor of all the objects you are
  50239. 2
  50240.              interested in. (defaults to $root_class).
  50241. 2
  50242. descendants: a list of objects (descendants of root) which you are not
  50243. 2
  50244.              interested in. Neither they nor their descendants will be
  50245. 2
  50246.              displayed.
  50247. 2
  50248.  
  50249. 2
  50250. @realm also displays the objects which are ancestors of root, and, if it
  50251. 2
  50252. is not redundant, the owners of all objects. @realm has a habit of
  50253. 2
  50254. running out of ticks if you try displaying large chunks of the MOO.
  50255. 38
  50256. 5
  50257. 4
  50258. 13
  50259. 2
  50260. Syntax: @resident player
  50261. 2
  50262.         @resident !player
  50263. 2
  50264.         @resident
  50265. 2
  50266.  
  50267. 2
  50268. Adds or removes a player from the residents list of a room.  The residents list controls who is allowed to use @sethome in that room.  This defaults to just the owner of the room; by manipulating the residents list you may allow additional players to use that room as their home.
  50269. 2
  50270.  
  50271. 2
  50272. @resident player adds that player to the list.  
  50273. 2
  50274. @resident !player removes that player from the list.
  50275. 2
  50276. @resident with no arguments simply displays the current list (which may be "none", indicating no additional people besides the owner may use that room as their home).
  50277. 2
  50278.  
  50279. 2
  50280. See also help @sethome.
  50281. 2
  50282.  
  50283. 2
  50284. Hints for programmers: The verb $room:accept_for_abode is called by @sethome.  By overriding this verb you can give different criteria to @sethome.  It should return 1 for allowed and 0 for denied.
  50285. 38
  50286. 5
  50287. 4
  50288. 12
  50289. 2
  50290. Syntax:  @examine <object>
  50291. 2
  50292.          @exam <object>
  50293. 2
  50294.  
  50295. 2
  50296. Prints several useful pieces of information about the named object, including the following:
  50297. 2
  50298.         + its full name, aliases, and object number
  50299. 2
  50300.         + its owner's name and object number
  50301. 2
  50302.         + its description
  50303. 2
  50304.         + its key expression (if it is locked and if you own it)
  50305. 2
  50306.         + its contents and their object numbers
  50307. 2
  50308.         + the 'obvious' verbs defined on it
  50309. 2
  50310.  
  50311. 2
  50312. [Note to programmers: the 'obvious' verbs are those that are readable and that can be invoked as commands.  To keep a verb off this list, either make it unreadable (see 'help @chmod') or, if it shouldn't be used as a command, give it 'args' of 'this none this' (see 'help @args').]
  50313. 38
  50314. 5
  50315. 4
  50316. 5
  50317. 2
  50318. There are several commands available to determine the origins of messages and to check that your communications with other players are secure. Help is available on the following topics:
  50319. 2
  50320.  
  50321. 2
  50322. @paranoid -- keeping a record of messages your character hears.
  50323. 2
  50324. @check    -- looking at that record to determine responsibility for messages.
  50325. 2
  50326. @sweep    -- checking who is listening in on your conversation.
  50327. 38
  50328. 5
  50329. 4
  50330. 3
  50331. 2
  50332. Syntax: @sweep
  50333. 2
  50334.  
  50335. 2
  50336. Used when you wish to have a private conversation, and are concerned someone may be listening in. @sweep tries to list the avenues by which information may be leaving the room. In a manner analogous to @check, it assumes that you don't want to hear about your own verbs, or those belonging to wizards, who presumably wouldn't stoop to bugging.
  50337. 38
  50338. 5
  50339. 4
  50340. 6
  50341. 2
  50342. Syntax:  @paranoid
  50343. 2
  50344.          @paranoid off
  50345. 2
  50346.          @paranoid immediate
  50347. 2
  50348.          @paranoid <number>
  50349. 2
  50350.  
  50351. 2
  50352. In immediate mode, the monitor prepends everything you hear with the name of the character it considers responsible for the message. Otherwise, it keeps records of the last <number> (defaults to 20) lines you have heard. These records can be accessed by the @check command.
  50353. 38
  50354. 5
  50355. 4
  50356. 23
  50357. 2
  50358. Syntax:   @check <options>
  50359. 2
  50360.  
  50361. 2
  50362. where <options> is one or more of:
  50363. 2
  50364. -- the number of lines to be displayed
  50365. 2
  50366. -- a player's name, someone to be "trusted" during the assignment of responsibility for the message.
  50367. 2
  50368. -- a player's named prefixed by !, someone not to be "trusted".
  50369. 2
  50370.  
  50371. 2
  50372.           @check-full <options>
  50373. 2
  50374. where <options is either 
  50375. 2
  50376. -- the number of lines to be displayed
  50377. 2
  50378. -- a search string: only lines containing that string will be displayed.
  50379. 2
  50380.  
  50381. 2
  50382. Used when you are suspicious about the origin of some of the messages your character has just heard.
  50383. 2
  50384.  
  50385. 2
  50386. Output from @check is in columns that contain, in order, the monitor's best guess as to:
  50387. 2
  50388.     what object the message came from,
  50389. 2
  50390.     what verb on that object that was responsible,
  50391. 2
  50392.     whose permissions that verb was running with, and
  50393. 2
  50394.     the beginning of the actual message.
  50395. 2
  50396.  
  50397. 2
  50398. Output from @check-full is in columns that contains a description of all the verbs that were responsible for the noise heard, not just the best guess as to who was responsible.
  50399. 2
  50400.  
  50401. 2
  50402. @check operates by examining the list of verbs that were involved in delivering the message, and assigning responsibility to the first owner it sees who is not "trusted".  By default, it trusts you and all the wizards.  It uses the records maintained by @paranoid, so you must have used that command before you received the message.
  50403. 38
  50404. 5
  50405. 4
  50406. 2
  50407. 2
  50408. *forward*
  50409. 2
  50410. @answer
  50411. 38
  50412. 5
  50413. 4
  50414. 10
  50415. 2
  50416. Syntax: @eject <object>
  50417. 2
  50418.         @eject <object> from <place>
  50419. 2
  50420.  
  50421. 2
  50422. This command is used to remove unwanted objects from places you own.  Players thus removed are unceremoniously dumped in their homes (unless that's this room, in which case they are dumped in the default player starting place).  Other kinds of objects are checked for a .home property and sent there if possible, otherwise they get thrown into #-1.  Unlike @move, @eject does *not* check to see if the object wants to be moved, and with the destination being what it is, there is no question of the destination refusing the move, either.  Generally, you should only resort to @eject if @move doesn't work.
  50423. 2
  50424.  
  50425. 2
  50426. The first form of the command removes the object from the current room.  The second form removes the object from the specified place (which, in most cases, you'll have to specify as an object number).  In either case, this command only works if you own the room/entity from which the object is being ejected.
  50427. 2
  50428.  
  50429. 2
  50430. "@eject ... from me" suffices to get rid of some unwanted object in your inventory.
  50431. 2
  50432.  
  50433. 2
  50434. See 'help room-messages' for a list of messages one can set regarding the @eject command.
  50435. 38
  50436. 5
  50437. 4
  50438. 3
  50439. 2
  50440. Syntax:  @quit
  50441. 2
  50442.  
  50443. 2
  50444. Disconnect from the MOO.  This breaks your network connection and leaves your player sleeping.  Disconnecting in most parts of the MOO automatically returns your player to its designated home (see 'help home').
  50445. 38
  50446. 1
  50447. 4
  50448. 4
  50449. 2
  50450. Syntax:  whereis [<player> [<player>...]]
  50451. 2
  50452.         @whereis [<player> [<player>...]]
  50453. 2
  50454.  
  50455. 2
  50456. Returns the current location of each of the specified players, or of all players if not arguments given.
  50457. 38
  50458. 5
  50459. 4
  50460. 2
  50461. 2
  50462. *forward*
  50463. 2
  50464. @typo
  50465. 38
  50466. 5
  50467. 4
  50468. 2
  50469. 2
  50470. *forward*
  50471. 2
  50472. @typo
  50473. 38
  50474. 5
  50475. 4
  50476. 2
  50477. 2
  50478. *forward*
  50479. 2
  50480. @typo
  50481. 38
  50482. 5
  50483. 4
  50484. 12
  50485. 2
  50486. Syntax:  @typo    [<text>]
  50487. 2
  50488.          @bug     [<text>]
  50489. 2
  50490.          @suggest [<text>]
  50491. 2
  50492.          @idea    [<text>]
  50493. 2
  50494.          @comment [<text>]
  50495. 2
  50496.  
  50497. 2
  50498. If <text> is given, a one-line message is sent to the owner of the room, presumably about something that you've noticed.  If <text> is not given, we assume you have more to say than can fit comfortably on a single line; the usual mail editor is invoked.  The convention is that @typo is for typographical errors on the room or objects found therein, @bug is for anomalous or nonintuitive behaviour of some sort, @idea/@suggest for any particular brainstorms or criticisms you might happen to have, and @comment for anything else.
  50499. 2
  50500.  
  50501. 2
  50502. If you're sending a bug report to someone because you got an error traceback when you used some object of theirs, please give them enough information to work on the problem.  In particular, please tell them *exactly* what you typed and *all* of the error messages that were printed to you, including the entire traceback, up to the line `(End of traceback.)'.  Without this information, it is nearly impossible for the programmer to discover, let alone fix, the problem.
  50503. 2
  50504.  
  50505. 2
  50506. The usual mail editor is only invoked for this command when in rooms that allow free entry, i.e., rooms that are likely to allow you back after you are done editing your message.  Otherwise these commands will require <text> and only let you do one-line messages.  
  50507. 2
  50508. Most adventuring scenario rooms fall into this latter category.
  50509. 38
  50510. 5
  50511. 4
  50512. 5
  50513. 2
  50514. Syntax:  @renumber [<collection>]
  50515. 2
  50516.  
  50517. 2
  50518. Renumbers the messages in your collection to go from 1 to however many you have at the moment.  The optional argument allows you to renumber the messages stored in some other collection (@renumber, like @rmmail, requires write access).
  50519. 2
  50520.  
  50521. 2
  50522. Note that if you have zombie messages from a previous @rmmail command (see `help zombie-messages'), these will be expunged.
  50523. 38
  50524. 5
  50525. 4
  50526. 8
  50527. 2
  50528. Syntax:  @notedit <note-object>
  50529. 2
  50530.          @notedit <object>.<property>
  50531. 2
  50532.  
  50533. 2
  50534. Enters the MOO Note Editor to edit the text on the named object
  50535. 2
  50536. For the first form, <note-object> must be a descendant of $note.  
  50537. 2
  50538. For the second form, <object>.<property> can be any string-valued or text-valued (i.e., list of strings) property on any object.
  50539. 2
  50540.  
  50541. 2
  50542. See 'help editors' for more detail.
  50543. 38
  50544. 5
  50545. 4
  50546. 40
  50547. 2
  50548. One can always enter an editor by teleporting to it, or you can use one of the commands provided
  50549. 2
  50550.  
  50551. 2
  50552.     @edit     <object>:<verb>    invokes the Verb Editor (edits verb code)
  50553. 2
  50554.     @notedit  <note_object>      invokes the Note Editor (edits note text)
  50555. 2
  50556.     @notedit  <object>.<prop>    invokes the Note Editor (edits text property)
  50557. 2
  50558.     @send     <list of recipients>        invokes the Mailer (edits a mail msg)
  50559. 2
  50560.     @answer   [<msg_number>] [<flags>...] invokes the Mailer (edits a reply)
  50561. 2
  50562.  
  50563. 2
  50564. This will transport you to one of several special rooms that have editing commands available.  These editors are admittedly not as good as EMACS, but for those with no other editing capability on their host systems, they are better than nothing.
  50565. 2
  50566.  
  50567. 2
  50568. There is a generic editor that provides basic editing commands that are applicable to all editors.  Documentation for these commands can be obtained by typing `help <topic>' within the editor:
  50569. 2
  50570.  
  50571. 2
  50572.     abort              emote/:            pause              send      (M) 
  50573. 2
  50574.     also-to (M)        fill               prev               showlists (M) 
  50575. 2
  50576.     compile (V)        insert             print     (M)      subject   (M) 
  50577. 2
  50578.     copy               join               quit               subst         
  50579. 2
  50580.     delete             list               ranges             to    (M)     
  50581. 2
  50582.     done               move               save      (N)      what          
  50583. 2
  50584.     edit    (V,N)      next               say/"              who   (M)     
  50585. 2
  50586.  
  50587. 2
  50588. In addition, individual editors provide their own additional commands for loading text from places, saving text to places, and various other specialized functions which are denoted in the above list with (M),(N),(V) according as they apply to the mail editor, the note editor, or the verb editor, respectively.
  50589. 2
  50590.  
  50591. 2
  50592. Note that a given editor only allows you one session at a time (ie. one verb, one note, or one mail message).  If you leave an editor without either aborting or compiling/saving/sending the item you're working on, that editor remembers what you are doing next time you enter it, whether you enter it by teleporting or by using the appropriate command.  Note that editors are periodically flushed so anything left there for sufficiently long will eventually go away.
  50593. 2
  50594.  
  50595. 2
  50596. A player may have his own .edit_options property which is a list containing one or more (string) flags from the following list
  50597. 2
  50598.  
  50599. 2
  50600.   quiet_insert
  50601. 2
  50602.       suppresses those annoying "Line n added." or "Appended..." messages
  50603. 2
  50604.       that one gets in response to 'say' or 'emote'.  This is useful if you're
  50605. 2
  50606.       entering a long list of lines, perhaps via some macro on your client,
  50607. 2
  50608.       and you don't want to see an equally long list of "Line n added..."
  50609. 2
  50610.       messages.  What you do want, however is some indication that this all
  50611. 2
  50612.       got through, which is why the "." command is an abbreviation for insert.
  50613. 2
  50614.  
  50615. 2
  50616.   eval_subs
  50617. 2
  50618.       Enables the verb editor to process your eval_subs property when
  50619. 2
  50620.       compiling your verb.  See `help eval' for more information about
  50621. 2
  50622.       the eval_subs property.
  50623. 2
  50624.  
  50625. 2
  50626. There will be more options, some day.
  50627. 38
  50628. 5
  50629. 4
  50630. 3
  50631. 2
  50632. Syntax:  @prev [on <collection>]
  50633. 2
  50634.  
  50635. 2
  50636. Print the 'previous' message in a given email collection (defaults to your own).  The mail system's notion of your 'current message' for that collection is decremented.  Thus, e.g., one can review all of one's previous messages one-by-one simply by typing '@prev' repeatedly.
  50637. 38
  50638. 5
  50639. 4
  50640. 6
  50641. 2
  50642. Syntax:
  50643. 2
  50644.   @unlock_for_open <container>
  50645. 2
  50646.  
  50647. 2
  50648. Clears the lock which restricts who may open <container>.  See 'help locking' for general information about locking. 
  50649. 2
  50650.  
  50651. 2
  50652. See 'help containers' for information on containers.
  50653. 38
  50654. 5
  50655. 4
  50656. 6
  50657. 2
  50658. Syntax:
  50659. 2
  50660.   @lock_for_open <container> with <key expression>
  50661. 2
  50662.  
  50663. 2
  50664. Set the lock on <container> which restricts who can open it.  See 'help locking' for general information about locking and 'help keys' for the syntax and semantics of key expressions.
  50665. 2
  50666.  
  50667. 2
  50668. See 'help containers' for information on containers.
  50669. 38
  50670. 5
  50671. 4
  50672. 9
  50673. 2
  50674. Syntax:
  50675. 2
  50676.   @opacity <container> is <integer>
  50677. 2
  50678.  
  50679. 2
  50680. The opacity can take on one of three values:
  50681. 2
  50682.    0:  The container is transparent and you can always see into it.
  50683. 2
  50684.    1:  The container is opaque, and you cannot see into it when closed
  50685. 2
  50686.    2:  The container is a black hole, and you can never see into it whether closed or open.  
  50687. 2
  50688.  
  50689. 2
  50690. The default @opacity is 1.
  50691. 38
  50692. 5
  50693. 4
  50694. 49
  50695. 2
  50696. *subst*
  50697. 2
  50698. Several kinds of messages can be set on a container object; they are printed to various audiences at certain times whenever an attempt is made to use the container.  The ones whose names begin with 'o' are always shown prefixed with the name of the player making the attempt and a single space character.  The standard pronoun substitutions (with respect to the player) are made on each message before it is printed; see 'help pronouns' for details.
  50699. 2
  50700.  
  50701. 2
  50702. The default message is given in brackets after each name below:
  50703. 2
  50704.  
  50705. 2
  50706. @empty[%[$container.empty_msg]]
  50707. 2
  50708.   Printed in place of the contents list when the container is empty.
  50709. 2
  50710.  
  50711. 2
  50712. @open  [%[$container.open_msg]]
  50713. 2
  50714.   Printed to the player who successfully opens the container.
  50715. 2
  50716.  
  50717. 2
  50718. @oopen  [%[$container.oopen_msg]]
  50719. 2
  50720.   Printed to others in the same room if the player successfully opens the container.
  50721. 2
  50722.  
  50723. 2
  50724. @open_fail  [%[$container.open_fail_msg]]
  50725. 2
  50726.   Printed to the player who cannot open the container.
  50727. 2
  50728.  
  50729. 2
  50730. @oopen_fail  [%[$container.oopen_fail_msg]]
  50731. 2
  50732.   Printed to others in the room when a player fails to open a container.
  50733. 2
  50734.  
  50735. 2
  50736. @close  [%[$container.close_msg]]
  50737. 2
  50738.   Printed to the player who closes a container.
  50739. 2
  50740.  
  50741. 2
  50742. @oclose  [%[$container.oclose_msg]]
  50743. 2
  50744.   Printed to others in the room when a player closes a container.
  50745. 2
  50746.  
  50747. 2
  50748. @put  [%[$container.put_msg]]
  50749. 2
  50750.   Printed to a player when an object is successfully placed in a container.
  50751. 2
  50752.  
  50753. 2
  50754. @oput  [%[$container.oput_msg]]
  50755. 2
  50756.   Printed to others in the room when a player successfully places an object in a container.
  50757. 2
  50758.  
  50759. 2
  50760. @put_fail  [%[$container.put_fail_msg]]
  50761. 2
  50762.   Printed when a player fails to put an object in a container.
  50763. 2
  50764.  
  50765. 2
  50766. @oput_fail  [%[$container.oput_fail_msg]]
  50767. 2
  50768.   Printed to others in the room when a player fails to place an object in a container.
  50769. 2
  50770.  
  50771. 2
  50772. @remove  [%[$container.remove_msg]]
  50773. 2
  50774.   Printed when a player succeeds in removing an object from a container.
  50775. 2
  50776.  
  50777. 2
  50778. @oremove  [%[$container.oremove_msg]]
  50779. 2
  50780.   Printed to others in the room when a player succeeds in removing an object from a container.
  50781. 2
  50782.  
  50783. 2
  50784. @remove_fail  [%[$container.remove_fail_msg]]
  50785. 2
  50786.   Printed when a player fails to remove an object from a container.
  50787. 2
  50788.  
  50789. 2
  50790. @oremove_fail  [%[$container.oremove_fail_msg]]
  50791. 2
  50792.   Printed to others in the room when a player fails to remove an object from a container.
  50793. 38
  50794. 5
  50795. 4
  50796. 3
  50797. 2
  50798. Syntax:  @memory
  50799. 2
  50800.  
  50801. 2
  50802. Prints out all information available on the current memory-usage behavior of the MOO server.  Probably only a wizard, if anyone, cares about this.
  50803. 38
  50804. 1
  50805. 4
  50806. 2
  50807. 2
  50808. *forward*
  50809. 2
  50810. say
  50811. 38
  50812. 1
  50813. 4
  50814. 2
  50815. 2
  50816. *forward*
  50817. 2
  50818. emote
  50819. 38
  50820. 1
  50821. 4
  50822. 6
  50823. 2
  50824. Syntax:  @lastlog
  50825. 2
  50826.          @lastlog <player>
  50827. 2
  50828.  
  50829. 2
  50830. The first form prints out a list of all players, roughly sorted by how long it's been since that player last connected to the MOO.  For each player, the precise time of their last connection is printed.
  50831. 2
  50832.  
  50833. 2
  50834. The second form only shows the last-connection time for the named player.
  50835. 38
  50836. 1
  50837. 4
  50838. 3
  50839. 2
  50840. Syntax:  @version
  50841. 2
  50842.  
  50843. 2
  50844. Prints out the version number for the currently-executing MOO server.
  50845. 38
  50846. 1
  50847. 4
  50848. 4
  50849. 2
  50850. Here are a few commands of occasional utility that didn't fit into any of the neat categories for the rest of the help system:
  50851. 2
  50852.  
  50853. 2
  50854. @version -- printing the MOO server version number
  50855. 2
  50856. @lastlog -- finding out when some player last connected to the MOO
  50857. 38
  50858. 1
  50859. 4
  50860. 2
  50861. 2
  50862. *forward*
  50863. 2
  50864. put
  50865. 38
  50866. 1
  50867. 4
  50868. 2
  50869. 2
  50870. *forward*
  50871. 2
  50872. help
  50873. 38
  50874. 1
  50875. 4
  50876. 2
  50877. 2
  50878. *forward*
  50879. 2
  50880. help
  50881. 38
  50882. 1
  50883. 4
  50884. 4
  50885. 2
  50886. Syntax:  put <object> into <container>
  50887. 2
  50888.          insert <object> in <container>
  50889. 2
  50890.  
  50891. 2
  50892. Moves the named object into the named container.  Sometimes the owners of the object and/or the container will not allow you to do this.
  50893. 38
  50894. 1
  50895. 4
  50896. 2
  50897. 2
  50898. *forward*
  50899. 2
  50900. take
  50901. 38
  50902. 1
  50903. 4
  50904. 3
  50905. 2
  50906. Syntax:  burn <letter>
  50907. 2
  50908.  
  50909. 2
  50910. Destroy the named letter irretrievably.  Only players who can read the letter can do this.
  50911. 38
  50912. 1
  50913. 4
  50914. 1
  50915. 2
  50916. A letter is a special kind of note (see 'help notes') with the added feature that it can be recycled by anyone who can read it.  This is often useful for notes from one player to another.  You create the letter as a child of the generic letter, $letter (see 'help @create' and 'help write'), encrypt it so that only you and the other player can read it (see 'help encrypt') and then either give it to the player in question or leave it where they will find it.  Once they've read it, they can use the 'burn' command to recycle the letter; see 'help burn' for details.
  50917. 38
  50918. 1
  50919. 4
  50920. 3
  50921. 2
  50922. Syntax:  decrypt <note>
  50923. 2
  50924.  
  50925. 2
  50926. Removes any restriction on who may read the named note or letter.  Only the owner of a note may do this.
  50927. 38
  50928. 1
  50929. 4
  50930. 3
  50931. 2
  50932. Syntax:  encrypt <note> with <key-expression>
  50933. 2
  50934.  
  50935. 2
  50936. Restricts the set of players who can read the named note or letter to those for whom the given key expression is true.  See 'help keys' for information on the syntax and semantics of key expressions.  Only the owner of a note may do this.
  50937. 38
  50938. 1
  50939. 4
  50940. 3
  50941. 2
  50942. Syntax:  delete <line-number> from <note>
  50943. 2
  50944.  
  50945. 2
  50946. Removes a single line of text from a note.  The first line of text is numbered 1, the second is 2, and so on.  Only the owner of a note may do this.
  50947. 38
  50948. 1
  50949. 4
  50950. 3
  50951. 2
  50952. Syntax:  erase <note>
  50953. 2
  50954.  
  50955. 2
  50956. Deletes all of the text written on a note or letter.  Only the owner of a note may do this.
  50957. 38
  50958. 1
  50959. 4
  50960. 3
  50961. 2
  50962. Syntax:  write "<any text>" on <note>
  50963. 2
  50964.  
  50965. 2
  50966. Adds a line of text to the named note or letter.  Only the owner of a note may do this.
  50967. 38
  50968. 1
  50969. 4
  50970. 3
  50971. 2
  50972. Syntax:  read <note>
  50973. 2
  50974.  
  50975. 2
  50976. Prints the text written on the named object, usually a note or letter.  Some notes are encrypted so that only certain players may read them.
  50977. 38
  50978. 1
  50979. 4
  50980. 10
  50981. 2
  50982. Syntax:  examine <object>
  50983. 2
  50984.          exam <object>
  50985. 2
  50986.  
  50987. 2
  50988. Prints several useful pieces of information about the named object, including the following:
  50989. 2
  50990.         + its full name, object number, and aliases
  50991. 2
  50992.         + its owner's name
  50993. 2
  50994.         + its description
  50995. 2
  50996.         + its key expression (if it is locked and if you own it)
  50997. 2
  50998.         + its contents
  50999. 2
  51000.         + the 'obvious' verbs defined on it
  51001. 38
  51002. 1
  51003. 4
  51004. 2
  51005. 2
  51006. *forward*
  51007. 2
  51008. give
  51009. 38
  51010. 1
  51011. 4
  51012. 10
  51013. 2
  51014. The representation of key expressions is very simple and makes it easy to construct new keys on the fly.
  51015. 2
  51016.  
  51017. 2
  51018. Objects are represented by their object numbers and all other kinds of key expressions are represented by lists.  These lists have as their first element a string drawn from the following set:
  51019. 2
  51020.         "&&"     "||"     "!"     "?"
  51021. 2
  51022. For the first two of these, the list should be three elements long; the second and third elements are the representations of the key expressions on the left- and right-hand sides of the appropriate operator.  In the third case, "!", the list should be two elements long; the second element is again a representation of the operand.  Finally, in the "?" case, the list is also two elements long but the second element must be an object number.
  51023. 2
  51024.  
  51025. 2
  51026. As an example, the key expression
  51027. 2
  51028.         #45  &&  ?#46  &&  (#47  ||  !#48)
  51029. 2
  51030. would be represented as follows:
  51031. 2
  51032.         {"&&", {"&&", #45, {"?", #46}}, {"||", #47, {"!", #48}}}
  51033. 38
  51034. 1
  51035. 4
  51036. 24
  51037. 2
  51038. LambdaMOO supports a simple but powerful notation for specifying locks on objects, encryption on notes, and other applications.  The idea is to describe a constraint that must be satisfied concerning what some object must be or contain in order to use some other object.
  51039. 2
  51040.  
  51041. 2
  51042. The constraint is given in the form of a logical expression, made up of object numbers connected with the operators 'and', 'or', and 'not' (written '&&', '||', and '!', for compatibility with the MOO programming language).  When writing such expressions, though, one usually does not use object numbers directly, but rather gives their names, as with most MOO commands.
  51043. 2
  51044.  
  51045. 2
  51046. These logical expressions (called 'key expressions') are always evaluated in the context of some particular 'candidate' object, to see if that object meets the constraint.  To do so, we consider the candidate object, along with every object it contains (and the ones those objects contain, and so on), to be 'true' and all other objects to be 'false'.
  51047. 2
  51048.  
  51049. 2
  51050. As an example, suppose the player Munchkin wanted to lock the exit leading to his home so that only he and the holder of his magic wand could use it.  Further, suppose that Munchkin was object #999 and the wand was #1001.  Munchkin would use the '@lock' command to lock the exit with the following key expression:
  51051. 2
  51052.         me || magic wand
  51053. 2
  51054. and the system would understand this to mean
  51055. 2
  51056.         #999 || #1001
  51057. 2
  51058. That is, players could only use the exit if they were (or were carrying) either #999 or #1001.
  51059. 2
  51060.  
  51061. 2
  51062. To encrypt a note so that it could only be read by Munchkin or someone carrying his book, his bell, and his candle, Munchkin would use the 'encrypt' command with the key expression
  51063. 2
  51064.         me || (bell && book && candle)
  51065. 2
  51066.  
  51067. 2
  51068. Finally, to keep players from taking a large gold coffin through a particularly narrow exit, Munchkin would use this key expression:
  51069. 2
  51070.         ! coffin
  51071. 2
  51072. That is, the expression would be false for any object that was or was carrying the coffin.
  51073. 2
  51074.  
  51075. 2
  51076. There is one other kind of clause that can appear in a key expression:
  51077. 2
  51078.         ? <object>
  51079. 2
  51080. This is evaluated by testing whether the given object is unlocked for the candidate object; if so, this clause is true, and otherwise, it is false.  This allows you to have several locks all sharing some single other one; when the other one is changed, all of the locks change their behavior simultaneously.
  51081. 2
  51082.  
  51083. 2
  51084. [Note to programmers: The internal representation of key expressions, as stored in .key on every object, for example, is very simple and easy to construct on the fly.  For details, see 'help key-representation'.]
  51085. 38
  51086. 1
  51087. 4
  51088. 3
  51089. 2
  51090. Syntax:  @unlock <object>
  51091. 2
  51092.  
  51093. 2
  51094. Clear any lock that might exist on the given object.  See 'help locking' for general information about locking.
  51095. 38
  51096. 1
  51097. 4
  51098. 5
  51099. 2
  51100. Syntax:  @lock <object> with <key expression>
  51101. 2
  51102.  
  51103. 2
  51104. Set a lock on <object> to restrict its use.  See 'help locking' for general information about locking and 'help keys' for the syntax and semantics of key expressions.
  51105. 2
  51106.  
  51107. 2
  51108. N.B.  In the case of rooms, you are actually better off setting room.free_entry to 0 thus preventing teleportation and then @locking the various entrances.  The problem with @locking the room itself is that this can make it impossible to drop objects in the room.
  51109. 38
  51110. 1
  51111. 4
  51112. 21
  51113. 2
  51114. It is frequently useful to restrict the use of some object.  For example, one might want to keep people from using a particular exit unless they're carrying a bell, a book, and a candle.  Alternatively, one might allow anyone to use the exit unless they're carrying that huge golden coffin in the corner.  LambdaMOO supports a general locking mechanism designed to make such restrictions easy to implement, usually without any programming.
  51115. 2
  51116.  
  51117. 2
  51118. Every object supports a notion of being 'locked' with respect to certain other objects.  For example, the exit above might be locked for any object that was carrying the coffin object but unlocked for all other objects.  In general, if some object 'A' is locked for another object, 'B', then 'B' is usually prevented from using 'A'.  Of course, the meaning of 'use' in this context depends upon the kind of object.
  51119. 2
  51120.  
  51121. 2
  51122. The various standard classes of objects use locking as follows:
  51123. 2
  51124.   + Rooms and containers refuse to allow any object inside them if they're locked for it.
  51125. 2
  51126.   + Exits refuse to transport any object that they're locked for.
  51127. 2
  51128.   + Things (including notes and letters) cannot be moved to locations that they're locked for.
  51129. 2
  51130.  
  51131. 2
  51132. There are two sides to locking:
  51133. 2
  51134.   + How is it specified whether one object is locked for another one?
  51135. 2
  51136.   + What is the effect of an object being locked?
  51137. 2
  51138. Note that these two questions are entirely independent: one could invent a brand-new way to specify locking, but the effect of an exit being locked would be unchanged.
  51139. 2
  51140.  
  51141. 2
  51142. [Note to programmers: the interface between these two sides is the verb x:is_unlocked_for(y), which is called by x to determine if it is locked for the object y.  The way in which 'is_unlocked_for' is implemented is entirely independent of the ways in which x uses its results.  Note that you can play on either side of this interface with your own objects, either defining new implementations of 'is_unlocked_for' that match your particular circumstances or having your objects interpret their being locked in new ways.]
  51143. 2
  51144.  
  51145. 2
  51146. There is a default way to specify locks on objects; the following help topics cover the relevant commands:
  51147. 2
  51148.  
  51149. 2
  51150. @lock -- setting a lock on an object
  51151. 2
  51152. @unlock -- clearing the lock on an object
  51153. 2
  51154. keys -- describes the language used to describe lock keys
  51155. 38
  51156. 1
  51157. 4
  51158. 28
  51159. 2
  51160. *subst*
  51161. 2
  51162. Several kinds of messages can be set on 'things', objects that have $thing as an ancestor (see 'help messages' for instructions on doing so).  They are printed to various audiences under various circumstances when an attempt is made to 'take' or 'drop' a thing.  The ones whose names begin with 'o' are always shown prefixed with the name of the player making the attempt and a single space character.  The standard pronoun substitutions (with respect to the player) are made on each message before it is printed; see 'help pronouns' for details.
  51163. 2
  51164.  
  51165. 2
  51166. The default message is given in brackets after each name below:
  51167. 2
  51168.  
  51169. 2
  51170. @take_failed  [%[$thing.take_failed_msg]]
  51171. 2
  51172.   Printed to a player who fails to take the object.
  51173. 2
  51174.  
  51175. 2
  51176. @otake_failed [%[$thing.otake_failed_msg]]
  51177. 2
  51178.   Printed to others in the same room if a player fails to take the object.
  51179. 2
  51180.  
  51181. 2
  51182. @take_succeeded  [%[$thing.take_succeeded_msg]]
  51183. 2
  51184.   Printed to a player who succeeds in taking the object.
  51185. 2
  51186.  
  51187. 2
  51188. @otake_succeeded  [%[$thing.otake_succeeded_msg]]
  51189. 2
  51190.   Printed to others in the same room if a player succeeds in taking the object.
  51191. 2
  51192.  
  51193. 2
  51194. @drop_failed  [%[$thing.drop_failed_msg]]
  51195. 2
  51196.   Printed to a player who fails to drop the object.
  51197. 2
  51198.  
  51199. 2
  51200. @odrop_failed [%[$thing.odrop_failed_msg]]
  51201. 2
  51202.   Printed to others in the same room if a player fails to drop the object.
  51203. 2
  51204.  
  51205. 2
  51206. @drop_succeeded  [%[$thing.drop_succeeded_msg]]
  51207. 2
  51208.   Printed to a player who succeeds in dropping the object.
  51209. 2
  51210.  
  51211. 2
  51212. @odrop_succeeded  [%[$thing.odrop_succeeded_msg]]
  51213. 2
  51214.   Printed to others in the room if a player succeeds in dropping the object.
  51215. 38
  51216. 1
  51217. 4
  51218. 2
  51219. 2
  51220. *forward*
  51221. 2
  51222. drop
  51223. 38
  51224. 1
  51225. 4
  51226. 9
  51227. 2
  51228. Syntax:  take <object>
  51229. 2
  51230.          get <object>
  51231. 2
  51232.          take <object> from <container>
  51233. 2
  51234.          get <object> from <container>
  51235. 2
  51236.          remove <object> from <container>
  51237. 2
  51238.  
  51239. 2
  51240. The first two forms pick up the named object and place it in your inventory.  Sometimes the owner of the object won't allow it to be picked up for some reason.
  51241. 2
  51242.  
  51243. 2
  51244. The remaining forms move the named object from inside the named container (see 'help containers') into your inventory.  As before, sometimes the owner of an object will not allow you to do this.
  51245. 38
  51246. 1
  51247. 4
  51248. 3
  51249. 2
  51250. Syntax:  @messages <object>
  51251. 2
  51252.  
  51253. 2
  51254. List all of the messages that can be set on the named object and their current values.  See 'help messages' for more details.
  51255. 38
  51256. 1
  51257. 4
  51258. 67
  51259. 2
  51260. Some kinds of messages are not printed directly to players; they are allowed to contain special characters marking places to include the appropriate pronoun for some player.  For example, a builder might have a doorway that's very short, so that people have to crawl to get through it.  When they do so, the builder wants a little message like this to be printed:
  51261. 2
  51262.  
  51263. 2
  51264.         Balthazar crawls through the little doorway, bruising his knee.
  51265. 2
  51266.  
  51267. 2
  51268. The problem is the use of 'his' in the message; what if the player in question is female?  The correct setting of the 'oleave' message on that doorway is as follows:
  51269. 2
  51270.  
  51271. 2
  51272.         "crawls through the little doorway, bruising %p knee."
  51273. 2
  51274.  
  51275. 2
  51276. The '%p' in the message will be replaced by either 'his', 'her', or 'its', depending upon the gender of the player.  
  51277. 2
  51278.  
  51279. 2
  51280. As it happens, you can also refer to elements of the command line (e.g., direct and indirect objects) the object issuing the message, and the location where this is all happening.  In addition one can refer to arbitrary string properties on these objects, or get the object numbers themselves.
  51281. 2
  51282.  
  51283. 2
  51284. The complete set of substitutions is as follows:
  51285. 2
  51286.  
  51287. 2
  51288.         %% => `%'  (just in case you actually want to talk about percentages).
  51289. 2
  51290.     Names:
  51291. 2
  51292.         %n => the player
  51293. 2
  51294.         %t => this object (i.e., the object issuing the message,... usually)
  51295. 2
  51296.         %d => the direct object from the command line
  51297. 2
  51298.         %i => the indirect object from the command line
  51299. 2
  51300.         %l => the location of the player
  51301. 2
  51302.     Pronouns:
  51303. 2
  51304.         %s => subject pronoun:          either `he',  `she', or `it'
  51305. 2
  51306.         %o => object pronoun:           either `him', `her', or `it'
  51307. 2
  51308.         %p => posessive pronoun (adj):  either `his', `her', or `its'  
  51309. 2
  51310.         %q => posessive pronoun (noun): either `his', `hers', or `its'
  51311. 2
  51312.         %r => reflexive pronoun:  either `himself', `herself', or `itself'
  51313. 2
  51314.     General properties:
  51315. 2
  51316.         %(foo) => player.foo 
  51317. 2
  51318.         %[tfoo], %[dfoo], %[ifoo], %[lfoo]
  51319. 2
  51320.                => this.foo, dobj.foo, iobj.foo, and player.location.foo
  51321. 2
  51322.     Object numbers:
  51323. 2
  51324.         %#  => player's object number
  51325. 2
  51326.         %[#t], %[#d], %[#i], %[#l]
  51327. 2
  51328.             => object numbers for this, direct obj, indirect obj, and location.
  51329. 2
  51330.  
  51331. 2
  51332. In addition there is a set of capitalized substitutions for use at the 
  51333. 2
  51334. beginning of sentences.  These are, respectively, 
  51335. 2
  51336.  
  51337. 2
  51338.    %N, %T, %D, %I, %L for object names, 
  51339. 2
  51340.    %S, %O, %P, %Q, %R for pronouns, and
  51341. 2
  51342.    %(Foo), %[dFoo] (== %[Dfoo] == %[DFoo]),... for general properties
  51343. 2
  51344.  
  51345. 2
  51346. Note: there is a special exception for player .name's which are assumed to
  51347. 2
  51348. already be capitalized as desired.
  51349. 2
  51350.  
  51351. 2
  51352. There may be situations where the standard algorithm, i.e., upcasing the first letter, yields something incorrect, in which case a "capitalization" for a particular string property can be specified explicitly.  If your object has a ".foo" property that is like this, you need merely add a ".fooc" (in general .(propertyname+"c")) specifying the correct capitalization.  This will also work for player .name's if you want to specify a capitalization that is different from your usual .name
  51353. 2
  51354.  
  51355. 2
  51356. Example:  
  51357. 2
  51358. Rog makes a hand-grenade with a customizable explode message.
  51359. 2
  51360. Suppose someone sets grenade.explode_msg to:
  51361. 2
  51362.  
  51363. 2
  51364.   "%N(%#) drops %t on %p foot.  %T explodes.  
  51365. 2
  51366.    %L is engulfed in flames."
  51367. 2
  51368.  
  51369. 2
  51370. If the current location happens to be #3443 ("yduJ's Hairdressing Salon"),
  51371. 2
  51372. the resulting substitution may produce, eg.,
  51373. 2
  51374.  
  51375. 2
  51376.   "Rog(#4292) drops grenade on his foot.  Grenade explodes.  
  51377. 2
  51378.    YduJ's Hairdressing Salon is engulfed in flames."
  51379. 2
  51380.  
  51381. 2
  51382. which contains an incorrect capitalization.  
  51383. 2
  51384. yduJ may remedy this by setting #3443.namec="yduJ's Hairdressing Salon".
  51385. 2
  51386.  
  51387. 2
  51388. Note for programmers:  
  51389. 2
  51390.  In programs, use $string_utils:pronoun_sub().
  51391. 2
  51392.  %n actually calls player:title() while %(name) refers to player.name directly.
  51393. 38
  51394. 1
  51395. 4
  51396. 22
  51397. 2
  51398. *subst*
  51399. 2
  51400. Several kinds of messages can be set on an exit object (see 'help messages' for instructions on doing so); they are printed to various audiences at certain times whenever an attempt is made to go through the exit.  The ones whose names begin with 'o' are always shown prefixed with the name of the player making the attempt and a single space character.  The standard pronoun substitutions (with respect to the player) are made on each message before it is printed; see 'help pronouns' for details.
  51401. 2
  51402.  
  51403. 2
  51404. The default message is given in brackets after each name below:
  51405. 2
  51406.  
  51407. 2
  51408. @leave  [%[$exit.leave_msg]]
  51409. 2
  51410.   Printed to the player just before they successfully use the exit.
  51411. 2
  51412.  
  51413. 2
  51414. @oleave  [%[$exit.oleave_msg||"has left."]]
  51415. 2
  51416.   Printed to others in the source room when a player successfully uses the exit.
  51417. 2
  51418.  
  51419. 2
  51420. @arrive  [%[$exit.arrive_msg]]
  51421. 2
  51422.   Printed to the player just after they successfully use the exit.
  51423. 2
  51424.  
  51425. 2
  51426. @oarrive  [%[$exit.oarrive_msg||"has arrived."]]
  51427. 2
  51428.   Printed to others in the destination room when a player successfully uses the exit.
  51429. 2
  51430.  
  51431. 2
  51432. @nogo  [%[$exit.nogo_msg||"You can't go that way."]]
  51433. 2
  51434.   Printed to the player when they fail in using the exit.
  51435. 2
  51436.  
  51437. 2
  51438. @onogo  [%[$exit.onogo_msg]]
  51439. 2
  51440.   Printed to others when a player fails in using the exit.
  51441. 38
  51442. 1
  51443. 4
  51444. 18
  51445. 2
  51446. Most objects have messages that are printed when a player succeeds or fails in manipulating the object in some way.  Of course, the kinds of messages printed are specific to the kinds of manipulations and those, in turn, are specific to the kind of object.  Regardless of the kind of object, though, there is a uniform means for listing the kinds of messages that can be set and then for setting them.
  51447. 2
  51448.  
  51449. 2
  51450. The '@messages' command prints out all of the messages you can set on any object you own.  Type 'help @messages' for details.
  51451. 2
  51452.  
  51453. 2
  51454. To set a particular message on one of your objects use a command with this form:
  51455. 2
  51456.         @<message-name> <object> is "<message>"
  51457. 2
  51458. where '<message-name>' is the name of the message being set, <object> is the name or number of the object on which you want to set that message, and <message> is the actual text.
  51459. 2
  51460.  
  51461. 2
  51462. For example, consider the 'leave' message on an exit; it is printed to a player when they successfully use the exit to leave a room.  To set the 'leave' message on the exit 'north' from the current room, use the command
  51463. 2
  51464.         @leave north is "You wander in a northerly way out of the room."
  51465. 2
  51466.  
  51467. 2
  51468. [Note to programmers: This class of commands automatically applies to any property whose name ends in '_msg'.  Thus, in the example above, the command is setting the 'leave_msg' property of the named exit.  You can get such a command to work on new kinds of objects simply by giving the appropriate properties names that end in '_msg'.  Additionally, in many cases the _msg property is accompanied by a _msg verb, which defaultly returns the named property, but which is available to be customized in more complex ways than allowed by simple string substitution.  You should check for the particular property you're considering whether the verb form exists (typically with @list).]
  51469. 2
  51470.  
  51471. 2
  51472. The following help topics describe the uses of the various messages available on standard kinds of objects:
  51473. 2
  51474.  
  51475. 2
  51476. container-messages -- the messages on objects that can contain other objects
  51477. 2
  51478. exit-messages -- the messages on exit objects
  51479. 2
  51480. thing-messages -- the messages on objects that can be taken and dropped
  51481. 38
  51482. 1
  51483. 4
  51484. 5
  51485. 2
  51486. Most objects have one or more descriptive pieces of text associated with them; these texts are printed under various circumstances depending on the kind of text.  For example, every object has a 'description' text that is printed whenever a player looks at the object.  The following help topics discuss the commands for manipulating these descriptive texts on your objects:
  51487. 2
  51488.  
  51489. 2
  51490. @rename -- setting the name and aliases of your objects
  51491. 2
  51492. @describe -- setting what others see when they look at your objects
  51493. 2
  51494. messages -- listing and setting the other descriptive texts on an object
  51495. 38
  51496. 1
  51497. 4
  51498. 13
  51499. 2
  51500. Syntax:  @describe <object> as <description>
  51501. 2
  51502.  
  51503. 2
  51504. Sets the description string of <object> to <description>.  This is the string that is printed out whenever someone uses the 'look' command on <object>.  To describe yourself, use 'me' as the <object>.
  51505. 2
  51506.  
  51507. 2
  51508. Example:
  51509. 2
  51510. Munchkin types this:
  51511. 2
  51512.   @describe me as "A very fine fellow, if a bit on the short side."
  51513. 2
  51514. People who type 'look Munchkin' now see this:
  51515. 2
  51516.   A very fine fellow, if a bit on the short side.
  51517. 2
  51518.  
  51519. 2
  51520. Note for programmers:
  51521. 2
  51522. The description of an object is kept in its .description property.  
  51523. 2
  51524. For descriptions of more than one paragraph, .description can be a list of strings.
  51525. 38
  51526. 1
  51527. 4
  51528. 3
  51529. 2
  51530. Syntax:  @add-entrance <exit-object-number>
  51531. 2
  51532.  
  51533. 2
  51534. Add the exit with the given object number as a recognized entrance to the current room (that is, one whose use is not considered teleportation).  Usually, @dig does this for you, but it doesn't if you don't own the room in question.  Instead, it tells you the object number of the new exit and you have to find the owner of the room and get them to use the @add-entrance command to link it up.
  51535. 38
  51536. 1
  51537. 4
  51538. 3
  51539. 2
  51540. Syntax:  @add-exit <exit-object-number>
  51541. 2
  51542.  
  51543. 2
  51544. Add the exit with the given object number as a conventional exit from the current room (that is, an exit that can be invoked simply by typing its name, like 'east').  Usually, @dig does this for you, but it doesn't if you don't own the room in question.  Instead, it tells you the object number of the new exit and you have to find the owner of the room and get them to use the @add-exit command to link it up.
  51545. 38
  51546. 1
  51547. 4
  51548. 8
  51549. 2
  51550. The topology of the MOO universe is determined by the rooms that exist and the exits that connect them.  Several commands are available for creating and discovering the topology of the MOO.  Help on them is available under the following topics:
  51551. 2
  51552.  
  51553. 2
  51554. @dig -- creating new rooms and exits
  51555. 2
  51556. @add-exit -- adding other players' exits from your rooms
  51557. 2
  51558. @add-entrance -- adding other player's entrances to your rooms
  51559. 2
  51560. @exits -- listing all of the conventional exits from your rooms
  51561. 2
  51562. @entrances -- listing all of the conventional entrances to your rooms
  51563. 2
  51564. @resident -- listing or changing the residents of your rooms
  51565. 38
  51566. 1
  51567. 4
  51568. 8
  51569. 2
  51570. Syntax:  @classes
  51571. 2
  51572.          @classes <class-name> ...
  51573. 2
  51574.  
  51575. 2
  51576. The wizards have identified several useful classes of objects in the database.  The @classes command is used to see which classes exist and what their member objects are.
  51577. 2
  51578.  
  51579. 2
  51580. The first form simply lists all of the defined classes along with short descriptions of the membership of each.
  51581. 2
  51582.  
  51583. 2
  51584. The second form prints an indented listing of that subset of the object parent/child hierarchy containing the objects in the class(es) you specify.
  51585. 38
  51586. 1
  51587. 4
  51588. 27
  51589. 2
  51590. Syntax:  @audit [<player>] [for <string>] [from <number>] [to <number>] 
  51591. 2
  51592.  
  51593. 2
  51594. `@audit'        prints a report of all of the objects you own.
  51595. 2
  51596. `@audit player' prints the same report for another player.
  51597. 2
  51598.  
  51599. 2
  51600. The `for' string restricts the search to objects whose names begin with that string.
  51601. 2
  51602. It is also possible to restrict the range of object numbers to include only those above a given number (`from') or below a given number (`to').
  51603. 2
  51604.  
  51605. 2
  51606. All forms of @audit print a report:
  51607. 2
  51608.  
  51609. 2
  51610.    #14 Gemba                          [The Pool]
  51611. 2
  51612.   #144 Popgun                         [Gemba]
  51613. 2
  51614.  #1479 Cockatoo                      *[The Living Room]
  51615. 2
  51616.  #1673 Bottom of Swimming Pool       
  51617. 2
  51618.  #2147 Cavern                        <-*west
  51619. 2
  51620.  #2148 tunnel                         Bottom of Swimming ->Cavern
  51621. 2
  51622.  
  51623. 2
  51624. The first column is the object's number, the second its name. The third column shows the object's location: Gemba is in The Pool, and is carrying the Popgun (#144).
  51625. 2
  51626. For exits, the third column shows source ->dest.
  51627. 2
  51628. For rooms, the third column shows any entrances owned by someone else.
  51629. 2
  51630. Object location, exit sources and destinations owned by another player are preceded by a *.
  51631. 2
  51632.  
  51633. 2
  51634. @audit uses a property .owned_objects on the player, for speed.  This property is updated at the time of each object creation and destruction and ownership change.  The verb @auditdb (same args as @audit) actually searches through the entire database for objects.
  51635. 2
  51636.  
  51637. 2
  51638. See also @verify-owned, @sort-owned, and @add-owned.
  51639. 2
  51640.  
  51641. 2
  51642. See also @prospectus, which gives some additional information.
  51643. 38
  51644. 1
  51645. 4
  51646. 3
  51647. 2
  51648. Syntax:  @count
  51649. 2
  51650.  
  51651. 2
  51652. Prints out the number of objects you own.  Do not be surprised if this is one larger than you think it should be: remember that your player object is owned by you as well, even though you didn't create it in the usual way.
  51653. 38
  51654. 1
  51655. 4
  51656. 4
  51657. 2
  51658. *forward*
  51659. 2
  51660. common_quota
  51661. 2
  51662.  
  51663. 2
  51664. To get a larger quota, talk to a wizard.  They will take a look at what you've done with the objects you've built so far and make a determination about whether or not it would be a net gain for the MOO community if you were to build some more things.  If so, they will increase your quota; if not, they will try to explain some ways in which you could build things that were more useful, entertaining, or otherwise interesting to other players.  Wizards may be more impressed by objects which are interactive and employ a fair number of verbs.
  51665. 38
  51666. 1
  51667. 4
  51668. 12
  51669. 2
  51670. Syntax:  @create <class-name> named "<names>"
  51671. 2
  51672.          @create <parent-object> named "<names>"
  51673. 2
  51674.  
  51675. 2
  51676. The main command for creating objects other than rooms and exits (for them, see 'help @dig'; it's much more convenient).
  51677. 2
  51678.  
  51679. 2
  51680. The first argument specifies the 'parent' of the new object: loosely speaking, the 'kind' of object you're creating.  <class-name> is one of the four standard classes of objects: $note, $letter, $thing, or $container.  As time goes on, more 'standard classes' may be added.  If the parent you have in mind for your new object isn't one of these, you may use the parent's name (if it's in the same room as you) or else its object number (e.g., #4562).
  51681. 2
  51682.  
  51683. 2
  51684. The <names> are given in the same format as in the @rename command:
  51685. 2
  51686.         <name-and-alias>,<alias>,...,<alias> [preferred]
  51687. 2
  51688.         <name>:<alias>,...,<alias> [not preferred]
  51689. 2
  51690.  
  51691. 2
  51692. See 'help @rename' for a discussion of the difference between a name and an alias.
  51693. 38
  51694. 1
  51695. 4
  51696. 45
  51697. 2
  51698. This is yduJ's table of tinymud commands and their equivalents in LambdaMOO.  A longer document, with discussions of the different verbs and how they have changed, is available via FTP from parcftp.xerox.com as pub/MOO/contrib/TinyMUD-LambdaMOO-equivs.  All the commands mentioned here have help nodes on LambdaMOO.
  51699. 2
  51700.  
  51701. 2
  51702. The following commands are basically the same in MOO and MUD.
  51703. 2
  51704.  
  51705. 2
  51706.     drop(throw), get(take), go, help, home, inventory, look, news, say (",:)
  51707. 2
  51708.  
  51709. 2
  51710.  
  51711. 2
  51712. The following commands have no equivalent:
  51713. 2
  51714.  
  51715. 2
  51716.     kill, rob, score, @force
  51717. 2
  51718.  
  51719. 2
  51720.  
  51721. 2
  51722. The following commands have the same names and do similar things, but are changed in some way (both syntactic and semantic differences, sometimes quite substantial differences):
  51723. 2
  51724.  
  51725. 2
  51726.     @examine, give, page, read, whisper, @create, @dig,
  51727. 2
  51728.     @lock, @password, @unlock, @describe
  51729. 2
  51730.  
  51731. 2
  51732.  
  51733. 2
  51734. The following commands have rough equivalents in LambdaMOO but the name is different:
  51735. 2
  51736.  
  51737. 2
  51738.     TinyMUD name            LambdaMOO name
  51739. 2
  51740.     ------------            --------------
  51741. 2
  51742.     QUIT                    @quit
  51743. 2
  51744.     gripe                   @gripe
  51745. 2
  51746.     goto/move               go
  51747. 2
  51748.     WHO                     @who
  51749. 2
  51750.     @fail                   @take_failed, @nogo, @drop_failed
  51751. 2
  51752.     @find                   @audit
  51753. 2
  51754.     @link                   @dig, @sethome, @add-exit, @add-entrance
  51755. 2
  51756.     @name                   @rename
  51757. 2
  51758.     @ofail                  @otake_failed, @onogo, @odrop_failed
  51759. 2
  51760.     @open                   @dig
  51761. 2
  51762.     @osuccess               @oleave, @oarrive, @otake_succeeded, 
  51763. 2
  51764.                             @odrop_succeeded
  51765. 2
  51766.     @success                @leave, @arrive, @take_succeeded
  51767. 2
  51768.                             @drop_succeeded
  51769. 2
  51770.     @teleport               @move
  51771. 2
  51772.  
  51773. 2
  51774.  
  51775. 2
  51776. Here are some commands for which no equivalent exists, or for which the equivalent is a complicated set of actions.
  51777. 2
  51778.  
  51779. 2
  51780.     @set, @stats, @unlink
  51781. 2
  51782.  
  51783. 2
  51784.  
  51785. 2
  51786. Documentation on most of the LambdaMOO commands mentioned above can be acquired using 'help <command-name>'.  A notable exception is the commands like @oarrive and @take_failed that set textual messages on objects.  These are described under 'help messages'.
  51787. 38
  51788. 1
  51789. 4
  51790. 3
  51791. 2
  51792. Syntax:  @next [on <collection>]
  51793. 2
  51794.  
  51795. 2
  51796. Print the `next' message in a given email collection (defaults to your own).  The mail system's notion of your 'current message' for that collection is incremented.  Thus, e.g., one can read all of one's new messages one-by-one simply by typing '@next' repeatedly.
  51797. 38
  51798. 1
  51799. 4
  51800. 13
  51801. 2
  51802. Syntax:  @answer [<message-number>] [sender] [all] [include] [noinclude]
  51803. 2
  51804.  
  51805. 2
  51806. Synonym: @reply
  51807. 2
  51808.  
  51809. 2
  51810. Prepares for you to compose a MOO email message to the players who either received or composed the indicated message from your collection.  The usual editor is invoked (see `help editors' for details).  The subject line for the new message will be initialized from that of the indicated message.  If you leave off the message number, the reply will be to your current message, if that exists.  In fact you may give a general message-sequence (see `help message-sequences') argument here, provided that it indicates only a single message (e.g., `@answer last:1')
  51811. 2
  51812.  
  51813. 2
  51814. If there is a Reply-to: field in the message you are @answer'ing, its contents will be used to initialize the To: line of your reply.  Otherwise, a To: line is determined depending on whether you specified `sender' or `all' in the command line (or your .mail_options).
  51815. 2
  51816.  
  51817. 2
  51818. `include' includes the text of the original message in your reply, `noinclude' does not.  
  51819. 2
  51820.  
  51821. 2
  51822. `sender', `all', `include', and `noinclude' can each be abbreviated (e.g., `@answer i').
  51823. 2
  51824.  
  51825. 2
  51826. Defaults are `sender' and `noinclude', but you can change this by setting your .mail-options (see `help mail-options').  
  51827. 38
  51828. 5
  51829. 4
  51830. 10
  51831. 2
  51832. Syntax:  @rmmail [<message-sequence>] [from *<recipient>]
  51833. 2
  51834.  
  51835. 2
  51836. Deletes the indicated messages from your MOO email collection.
  51837. 2
  51838. By default, your current message is deleted.
  51839. 2
  51840. See `help message-sequence' for the full list of possible arguments.
  51841. 2
  51842. You get the message numbers for use here by typing the '@mail' command.
  51843. 2
  51844.  
  51845. 2
  51846. There is no confirmation for this action, so be careful.  While it is true that @unrmmail will be able to bring back the messages deleted by the last @rmm, any messages deleted before then are really gone, i.e., irrecoverable.  See `help @unrmmail' for more information.
  51847. 2
  51848.  
  51849. 2
  51850. This command may be used on other mail recipients (children of $mail_recipient), but only ones to which you have write access (you either have to own it or be on good terms with whoever does...).
  51851. 38
  51852. 5
  51853. 4
  51854. 14
  51855. 2
  51856. Syntax:  @read <message-number>
  51857. 2
  51858.          @read
  51859. 2
  51860.          @peek ...
  51861. 2
  51862.  
  51863. 2
  51864. Prints the contents of the indiciated messages from your MOO email collection.  You get the message numbers for use here by typing the '@mail' command, which prints a table of contents for your entire MOO email collection.  If no arguments are given to @read, then the 'current message' in your collection is printed.  In any case, the 'current message' after @read finishes is the last one printed.
  51865. 2
  51866.  
  51867. 2
  51868. The most general form of the @read command is
  51869. 2
  51870.  
  51871. 2
  51872.          @read <message-sequence> [on *<collection>]  
  51873. 2
  51874.  
  51875. 2
  51876. where <message-sequence> is as described in `help message-sequences'.
  51877. 2
  51878. As with the @mail command you may @read messages on any publically readable collection (child of $mail_recipient).
  51879. 2
  51880.  
  51881. 2
  51882. The @peek command is a variant of @read that works no differently except that it refrains from setting your `current message'.  This is useful, for example, if you want to see some particular message on a collection without losing track of where you are in it.
  51883. 38
  51884. 5
  51885. 4
  51886. 10
  51887. 2
  51888. Syntax:  @send <recipient> [<recipient> ...]  [subj[ect]="<subject>"]
  51889. 2
  51890.  
  51891. 2
  51892. Prepares for you to compose a MOO email message to the recipients named on the command line.  A recipient can be specified by giving a player name or object-id, or a '*' followed by the name or object-id of some non-player mail recipient (e.g., a mailing list or a mail folder) -- a list of such non-player recipients is available from within the mailroom with the 'showlists' command.
  51893. 2
  51894.  
  51895. 2
  51896. The usual editor is invoked.   
  51897. 2
  51898. You will be prompted for a subject line if you did not specify one in the @send command (see `help mail_options' for how to avoid this).
  51899. 2
  51900. Use `say' (") to insert lines in the body of your message.  
  51901. 2
  51902. See `help editors' for details.
  51903. 2
  51904.  
  51905. 2
  51906. Giving this command without arguments resumes editing the previous unsent draft message if one exists.
  51907. 38
  51908. 5
  51909. 4
  51910. 33
  51911. 2
  51912. The MOO email system allows you to send and receive messages to and from other players.  It provides commands to view and manage your own collection of saved messages and, in addition, to browse through other collections that may be available (e.g.,archives of public mailing lists).  Help is available on the following commands:
  51913. 2
  51914.  
  51915. 2
  51916. @mail     -- seeing a table of contents for a collection of email messages
  51917. 2
  51918. @read     -- reading individual messages 
  51919. 2
  51920. @next     -- reading the 'next'     message
  51921. 2
  51922. @prev     -- reading the 'previous' message
  51923. 2
  51924.  
  51925. 2
  51926. @send     -- composing and sending a message to other players
  51927. 2
  51928. @answer   -- replying to one of the messages in a collection
  51929. 2
  51930. @forward  -- resending one of the messages in a collection somewhere else
  51931. 2
  51932.  
  51933. 2
  51934. @rmmail   -- discarding some subset of a collection
  51935. 2
  51936. @unrmmail -- undoing the most recent @rmm on a collection
  51937. 2
  51938. @renumber -- renumbering the messages in a collection
  51939. 2
  51940.  
  51941. 2
  51942. @mail-option -- describes and sets various customization flags
  51943. 2
  51944.  
  51945. 2
  51946. help mail-forwarding
  51947. 2
  51948.  -- describes mail forwarding
  51949. 2
  51950. help message-sequences
  51951. 2
  51952.  -- describes message-sequences arguments to @mail, @read, @rmm, and @answer.
  51953. 2
  51954.  
  51955. 2
  51956. For viewing collections other from your own, the following commands are useful:
  51957. 2
  51958.  
  51959. 2
  51960. @rn          -- list those collections that have new messages on them
  51961. 2
  51962. @subscribe   -- indicate that you want @rn to report on a given collection
  51963. 2
  51964.                   and add yourself to its .mail_notify list
  51965. 2
  51966. @skip        -- ignore any remaining new messages in a given collection
  51967. 2
  51968. @unsubscribe -- ignore a given collection entirely from now on
  51969. 2
  51970.                   and remove yourself from its .mail_notify list
  51971. 2
  51972. @unsubscribed-- show the mailing lists that you aren't subscribed to.
  51973. 2
  51974. @subscribed  -- like @rn, but shows all lists that you are subscribed to
  51975. 2
  51976.                 even if they have no new activity
  51977. 38
  51978. 5
  51979. 4
  51980. 13
  51981. 2
  51982. Syntax:  @gripe <anything> ...
  51983. 2
  51984.  
  51985. 2
  51986. Puts you into the MOO mail system to register a complaint (or, conceivably, a compliment) with the wizards.  The rest of the command line (the <anything> ... part) is used as the subject line for the message.  More information on using the MOO mail system is given once you're in it.
  51987. 2
  51988.  
  51989. 2
  51990. You may hear back from the wizards eventually; see 'help @mail' for how to read their reply.
  51991. 2
  51992.  
  51993. 2
  51994. Example:
  51995. 2
  51996. Munchkin types:
  51997. 2
  51998.   @gripe The little bird
  51999. 2
  52000.   "How come I can't ever see the little bird in the cuckoo clock?
  52001. 2
  52002.   "        -- A frustrated player
  52003. 2
  52004.   send
  52005. 2
  52006. and, somewhat later, the wizards reply with a note about being sure to look while the clock is chiming.
  52007. 38
  52008. 5
  52009. 4
  52010. 11
  52011. 2
  52012. The primary means for players to extend the MOO is for them to create new objects with interesting behavior.  There are convenient commands for creating and recycling objects and for keeping track of the objects you've created.  Help is available on these commands in the following topics:
  52013. 2
  52014.  
  52015. 2
  52016. @dig -- conveniently building new rooms and exits
  52017. 2
  52018. @create -- making other kinds of objects
  52019. 2
  52020. @recycle -- destroying objects you no longer want
  52021. 2
  52022. @quota -- determining how many more objects you can build
  52023. 2
  52024. @count -- determining how many objects you already own
  52025. 2
  52026. @audit -- listing all of your objects
  52027. 2
  52028. @classes -- listing all of the public classes available for your use
  52029. 2
  52030. @realm -- listing the parenting tree for objects owned by one or more players
  52031. 2
  52032. @move -- moving your objects from place to place
  52033. 38
  52034. 1
  52035. 4
  52036. 16
  52037. 2
  52038. Syntax:  @mail
  52039. 2
  52040.          @mail new            (to see recent messages)
  52041. 2
  52042.          @mail 1-$            (to see *all* messages)
  52043. 2
  52044.  
  52045. 2
  52046. Shows a table of contents for your MOO email message collection.  You are notified when you connect to the MOO if there are any such messages.  A little arrow indicates the mail system's notion of your 'current message'.  
  52047. 2
  52048. The first form lists all of your messages or the last 15 if you have more than that many; the second form lists only those messages after your `current message'.  The third form shows your entire collection.
  52049. 2
  52050.  
  52051. 2
  52052. If you have a large number of mail messages, you can give arguments so that @mail only lists the messages you're interested in.  You can also list messages residing on mail recipients which are public or for which you have read access.
  52053. 2
  52054. The general format is
  52055. 2
  52056.  
  52057. 2
  52058.          @mail <message-sequence> [on *<recipient>]
  52059. 2
  52060.  
  52061. 2
  52062. <recipient> must name some child of $mail_recipient (e.g., a mailing list);
  52063. 2
  52064. <message-sequence> can be a sequence of message numbers; you can also scan the recipient for articles that fit a given description, as specified in `help message-sequences'.
  52065. 2
  52066.  
  52067. 2
  52068. Note that if you view mail on some other recipient and have "sticky" in your .mail_options (see `help mail-options'), all further mail commands (e.g., @read, @next, @rmm,...) will apply to that recipient.  In this case use `@mail on me' to go back to looking at your own mail.
  52069. 38
  52070. 1
  52071. 4
  52072. 4
  52073. 2
  52074. Syntax:  @listgag
  52075. 2
  52076.          @gaglist
  52077. 2
  52078.  
  52079. 2
  52080. Shows you a list of the players and objects currently on your 'gag list'.  You don't see any messages that result from actions initiated by the players or objects on this list.  In particular, you will not hear them if they try to speak, emote, or whisper to you.  See 'help gagging' for an explanation of gagging in general.
  52081. 38
  52082. 1
  52083. 4
  52084. 9
  52085. 2
  52086. Syntax:  @ungag <player or object>
  52087. 2
  52088.          @ungag everyone
  52089. 2
  52090.  
  52091. 2
  52092. Remove the given player or object (or, in the second form, everyone) from your 'gag list'.  You will once again see any messages that result from actions initiated by the ungagged player(s) or objects.  In particular, you will once again be able to hear them if they speak, emote, or whisper to you.  See 'help gagging' for an explanation of gagging in general.
  52093. 2
  52094.  
  52095. 2
  52096. Example:
  52097. 2
  52098. Munchkin types:
  52099. 2
  52100.   @ungag Grover
  52101. 2
  52102. and is once again able to hear Grover's witty remarks.  Sigh...
  52103. 38
  52104. 1
  52105. 4
  52106. 12
  52107. 2
  52108. Syntax:  @gag <player or object> [<player or object>...]
  52109. 2
  52110.  
  52111. 2
  52112. Add the given players to your 'gag list'.  You will no longer see any messages that result from actions initiated by these players.  In particular, you will not hear them if they try to speak, emote, or whisper to you.  See 'help gagging' for an explanation of gagging in general.
  52113. 2
  52114.  
  52115. 2
  52116. Example:
  52117. 2
  52118. Munchkin types:
  52119. 2
  52120.   @gag Grover
  52121. 2
  52122. and no longer hears anything that Grover says.  What a relief!
  52123. 2
  52124.  
  52125. 2
  52126. If you specify an object, then any text originating from that object will not be printed.  Example:  Noisy Robot prints "Hi there" every 15 seconds.   In order to avoid seeing that, Munchkin types:
  52127. 2
  52128.   @gag Noisy
  52129. 2
  52130. and no longer hears that robot!  (Munchkin must be in the same room as Noisy Robot for this to work, or know its object number.)
  52131. 38
  52132. 1
  52133. 4
  52134. 8
  52135. 2
  52136. Syntax: go <direction> ...
  52137. 2
  52138.  
  52139. 2
  52140. Invokes the named exits in the named order, moving through many rooms in a single command.
  52141. 2
  52142.  
  52143. 2
  52144. Example:
  52145. 2
  52146. Munchkin types:
  52147. 2
  52148.   go n e e u e e s e
  52149. 2
  52150. and moves quite rapidly from the Living Room all the way to the Bovine Illuminati Atrium, all in one command.
  52151. 38
  52152. 1
  52153. 4
  52154. 7
  52155. 2
  52156. Syntax: @password <old-password> <new-password>
  52157. 2
  52158.  
  52159. 2
  52160. Changes your player's password (as typed in the 'connect' command when you log in to the MOO) to <new-password>.  For security reasons, you are required to type your current (soon to be old) password as the first argument.
  52161. 2
  52162.  
  52163. 2
  52164. Your password is stored in an encrypted form in the MOO database; in principle, not even the wizards can tell what it is, though they can change it, of course.  It is recommended that your password not be your name or a common word; MOO passwords have been stolen or cracked in the past and characters have been made unhappy by such theft.  Your password is your security; choose a safe one.
  52165. 2
  52166.  
  52167. 2
  52168. Only the first 8 characters of a password are significant.
  52169. 38
  52170. 1
  52171. 4
  52172. 3
  52173. 2
  52174. Syntax: @sethome
  52175. 2
  52176.  
  52177. 2
  52178. Sets your designated home (see `help home') to be the room you're in now.  If the current room wouldn't allow you to teleport in, then the `@sethome' command nicely refuses to set your home there.  This avoids later, perhaps unpleasant, surprises.  Additionally, your home must be a room that will allow you to stay there.  Rooms which you own will do this, as will rooms to which you have been added as a resident.  See the @resident command for help on adding someone as a resident to a room you own.
  52179. 38
  52180. 1
  52181. 4
  52182. 9
  52183. 2
  52184. *subst*
  52185. 2
  52186. Syntax: @who
  52187. 2
  52188.         @who <player> [<player> ... ]
  52189. 2
  52190.  
  52191. 2
  52192. The first form lists all of the currently-connected players, along with the amount of time they've been connected, the amount of time they've been idle, and their present location in the MOO.
  52193. 2
  52194.  
  52195. 2
  52196. The second form, in which a list of player names is given, shows information for just those players.  For any listed players that are not connected, we show the last login time instead of the connect/idle times.
  52197. 2
  52198.  
  52199. 2
  52200. @who refers to the @who_location message (see 'help messages') on each player's location in order to determine what should be printed in the location column.  Pronoun substitutions are done on this string in the usual manner (see 'help pronouns').  The default value is "%[$room.who_location_msg]" (i.e., the room name).
  52201. 38
  52202. 1
  52203. 4
  52204. 17
  52205. 2
  52206. LambdaMOO is a kind of virtual reality, in which players move about from place to place manipulating their environment in what we hope are amusing, entertaining, or enlightening ways.
  52207. 2
  52208.  
  52209. 2
  52210. LambdaMOO is more of a pastime than a game in the usual sense; there is no `score' kept, there are no specific goals to attain in general, and there's no competition involved.  LambdaMOO participants explore the virtual world, talk to the other participants, try out the weird gadgets that others have built, and create new places and things for others to encounter and enjoy.
  52211. 2
  52212.  
  52213. 2
  52214. Most commands have the form of simple English sentences:
  52215. 2
  52216.     <verb>
  52217. 2
  52218.     <verb>  <direct object>
  52219. 2
  52220.     <verb>  <direct object>  <preposition>  <indirect object>
  52221. 2
  52222. Don't use English articles (e.g. 'a', 'an', or 'the') in your commands; the MOO won't understand them.  You can refer to yourself as 'me' and the room you're in as 'here'.
  52223. 2
  52224.  
  52225. 2
  52226. The first five kinds of commands you'll want to know are listed below.  Type 'help <topic-name>' for details on any of them:
  52227. 2
  52228.  
  52229. 2
  52230. look -- getting a description of the current room or any other object
  52231. 2
  52232. say -- speaking to the other players in the same room as you
  52233. 2
  52234. @who -- showing which players are currently connected to the MOO
  52235. 2
  52236. movement -- how to move around in the MOO, from room to room
  52237. 2
  52238. @quit -- disconnecting from the MOO
  52239. 38
  52240. 1
  52241. 4
  52242. 4
  52243. 2
  52244. Syntax:  give <object> to <player>
  52245. 2
  52246.          hand <object> to <player>
  52247. 2
  52248.  
  52249. 2
  52250. Move an object from your contents to that of another player.  This doesn't change the ownership of the object.  Some players may refuse to accept gifts and some objects may refuse to be given.
  52251. 38
  52252. 5
  52253. 4
  52254. 3
  52255. 2
  52256. Syntax:  news
  52257. 2
  52258.  
  52259. 2
  52260. Read the latest edition of the LambdaMOO Times, which carries articles concerning recent changes to the MOO server or to the main public classes, or whatever the wizards feel like writing about.
  52261. 38
  52262. 5
  52263. 4
  52264. 5
  52265. 2
  52266. Occasionally, you may run into a situation in which you'd rather not hear from certain other players.  It might be that they're being annoying, or just that whatever they're doing makes a lot of noise.  Gagging a player will stop you from hearing the results of any task initiated by that player.  You can also gag a specific object, if you want to hear what the owner of that object says, but not the output from their noisy robot.  The commands to use gagging are listed below; detailed help is available on each of them:
  52267. 2
  52268.  
  52269. 2
  52270. @gag -- add one or more players to your gag list
  52271. 2
  52272. @ungag -- remove a player from your gag list
  52273. 2
  52274. @listgag -- list the players you currently have gagged
  52275. 38
  52276. 5
  52277. 4
  52278. 24
  52279. 2
  52280. Syntax:  @dig "<new-room-name>"
  52281. 2
  52282.          @dig <exit-spec> to "<new-room-name>"
  52283. 2
  52284.          @dig <exit-spec> to <old-room-object-number>
  52285. 2
  52286.  
  52287. 2
  52288. This is the basic building tool.  The first form of the command creates a new room with the given name.  The new room is not connected to anywhere else; it is floating in limbo.  The @dig command tells you its object number, though, so you can use the @move command to get there easily.
  52289. 2
  52290.  
  52291. 2
  52292. The second form of the command not only creates the room, but one or two exits linking your current location to (and possibly from) the new room.  An <exit-spec> has one of the following two forms:
  52293. 2
  52294.         <names>
  52295. 2
  52296.         <names>|<names>
  52297. 2
  52298. where the first form is used when you only want to create one exit, from your current room to the new room, and the second form when you also want an exit back, from the new room to your current room.  In any case, the <names> piece is just a list of names for the exit, separated by commas; these are the names of the commands players can type to use the exit.  It is usually a good idea to include explicitly the standard abbreviations for direction names (e.g., 'n' for 'north', 'se' for 'southeast', etc.).  DO NOT put spaces in the names of exits; they are useless in MOO.
  52299. 2
  52300.  
  52301. 2
  52302. The third form of the command is just like the second form except that no new room is created; you instead specify by object number the other room to/from which the new exits will connect.
  52303. 2
  52304.  
  52305. 2
  52306. NOTE: You must own the room at one end or the other of the exits you create.  If you own both, everything is hunky-dorey.  If you own only one end, then after creating the exits you should write down their object numbers.  You must then get the owner of the other room to use @add-exit and @add-entrance to link your new exits to their room.
  52307. 2
  52308.  
  52309. 2
  52310. Examples:
  52311. 2
  52312.     @dig "The Conservatory"
  52313. 2
  52314. creates a new room named "The Conservatory" and prints out its object number.
  52315. 2
  52316.     @dig north,n to "The North Pole"
  52317. 2
  52318. creates a new room and also an exit linking the player's current location to the new room; players would say either 'north' or 'n' to get from here to the new room.  No way to get back from that room is created.
  52319. 2
  52320.     @dig west,w|east,e,out to "The Department of Auto-Musicology"
  52321. 2
  52322. creates a new room and two exits, one taking players from here to the new room (via the commands 'west' or 'w') and one taking them from the new room to here (via 'east', 'e', or 'out').
  52323. 2
  52324.     @dig up,u to #7164
  52325. 2
  52326. creates an exit leading from the player's current room to #7164, which must be an existing room.
  52327. 38
  52328. 5
  52329. 4
  52330. 5
  52331. 2
  52332. Syntax:  @move <thing> to <place>
  52333. 2
  52334.  
  52335. 2
  52336. Move the specified object to the specified location.  This is not guaranteed to work; in particular, the object must agree to be moved and the destination must agree to allow the object in.  This is usually the case, however.  The special case where <thing> is 'me' is useful for teleporting yourself around.
  52337. 2
  52338.  
  52339. 2
  52340. If @move doesn't work and you own the room where the object is located, try using @eject instead.
  52341. 38
  52342. 5
  52343. 4
  52344. 4
  52345. 2
  52346. Syntax:  inventory
  52347. 2
  52348.          i
  52349. 2
  52350.  
  52351. 2
  52352. Prints a list showing every object you're carrying.
  52353. 38
  52354. 5
  52355. 4
  52356. 3
  52357. 2
  52358. Syntax:  @entrances
  52359. 2
  52360.  
  52361. 2
  52362. Prints a list of all recognized entrances to the current room (but only if you own the room).  A recognized entrance is one whose use is not considered to be teleportation.
  52363. 38
  52364. 5
  52365. 4
  52366. 3
  52367. 2
  52368. Syntax:  @exits
  52369. 2
  52370.  
  52371. 2
  52372. Prints a list of all conventional exits from the current room (but only if you own the room).  A conventional exit is one that can be used simply by typing its name, like 'east'.
  52373. 38
  52374. 5
  52375. 4
  52376. 8
  52377. 2
  52378. Syntax: @gender <gender>
  52379. 2
  52380.         @gender
  52381. 2
  52382.  
  52383. 2
  52384. The first form, with an argument, defines your player to have the gender <gender>.  If <gender> is one of the standard genders (e.g., 'male', 'female', 'neuter',...), your various pronouns will also be set appropriately, making exits and certain other objects behave more pleasantly for you.
  52385. 2
  52386.  
  52387. 2
  52388. The second form tells you the current definition of your player's gender, your current pronouns, and the complete list of standard genders.
  52389. 2
  52390.  
  52391. 2
  52392. It should be noted that some of the "genders" on the standard gender list need verb conjugation in order to work properly and much of the MOO isn't set up for this (...yet).  For example, you should expect to see `they is' a fair amount if you @gender yourself `plural'.
  52393. 38
  52394. 5
  52395. 4
  52396. 3
  52397. 2
  52398. Syntax:  @recycle <object-name-or-number>
  52399. 2
  52400.  
  52401. 2
  52402. Destroys the indicated object utterly and irretrievably.  Naturally, you may only do this to objects that you own.
  52403. 38
  52404. 5
  52405. 4
  52406. 20
  52407. 2
  52408. Syntax: @rename <object>        to [name-and-alias],<alias>,...,<alias>
  52409. 2
  52410.         @rename <object>        to [name]:<alias>,...,<alias>
  52411. 2
  52412.         @rename <object>:<verb> to <new-verb-name>
  52413. 2
  52414.  
  52415. 2
  52416. The first two forms are used to change the name and aliases of an object.  The name is what will be used in most printed descriptions of the object.  The aliases are the names by which players can refer to the object in commands.  Typically you want to include the name in the aliases, as the MOO parser only checks .aliases when matching, so the first syntax is generally preferred.
  52417. 2
  52418.  
  52419. 2
  52420. If you leave out the "name" part of the list, @rename will leave the object's name as it is, and only change the aliases.
  52421. 2
  52422.  
  52423. 2
  52424. Note that for renaming players, more stringent rules apply.  See `help player-names'.  Certain other kinds of objects (e.g., mail recipients) also enforce their own rules w.r.t what they can be named.
  52425. 2
  52426.  
  52427. 2
  52428. Examples:
  52429. 2
  52430. Munchkin names his dog:
  52431. 2
  52432.   @rename #4237 to "Rover the Wonder Dog":Rover,dog
  52433. 2
  52434. Now we'll see 'Rover the Wonder Dog' if we're in the same room as him and we can refer to him as either 'Rover' or just 'dog' in our commands, like 'pet dog'.
  52435. 2
  52436.  
  52437. 2
  52438. Munchkin changes his dog's aliases:
  52439. 2
  52440.   @rename #4237 to ,Rover,dog,Rover the Wonder Dog
  52441. 2
  52442. The name remains the same--we still see 'Rover the Wonder Dog'--but now any of 'Rover', 'dog', or 'Rover the Wonder Dog' can be used to refer to him.  This can help reduce confusion.
  52443. 2
  52444.  
  52445. 2
  52446. The third form of the @rename command is for use by programmers, to change the name of a verb they own.  If the <new-verb-name> contains spaces, the verb will have multiple names, one for each space-separated word.
  52447. 38
  52448. 5
  52449. 4
  52450. 15
  52451. 2
  52452. Containers are objects that allow you to store other objects inside them.  The following help topics cover verbs that can be used with containers:
  52453. 2
  52454.  
  52455. 2
  52456. put -- putting an object into a container
  52457. 2
  52458. remove -- taking an object out of a container
  52459. 2
  52460.  
  52461. 2
  52462. Containers may be open or closed, using the verbs 'open container' and 'close container'.  Containers have a separate lock to determine if a player may open them.  See the following help topics:
  52463. 2
  52464.  
  52465. 2
  52466. @lock_for_open -- setting the lock for opening a container
  52467. 2
  52468. @unlock_for_open -- clearing the lock
  52469. 2
  52470.  
  52471. 2
  52472. You can make a container by creating a child of the standard container, $container (see 'help @create').
  52473. 2
  52474.  
  52475. 2
  52476. Containers have a large number of messages which get printed when players act upon them.  See 'help container-messages' for more information.
  52477. 2
  52478.  
  52479. 2
  52480. Containers have opacity.  See 'help @opacity' for more information.
  52481. 38
  52482. 1
  52483. 4
  52484. 15
  52485. 2
  52486. Notes are objects that can have text written on them to be read later.  They are useful for leaving messages to people, or for documenting your creations.
  52487. 2
  52488.  
  52489. 2
  52490. The following help topics cover verbs that can be used with notes:
  52491. 2
  52492.  
  52493. 2
  52494. read -- reading the text on the note
  52495. 2
  52496. write -- adding text to a note
  52497. 2
  52498. erase -- removing all the text from a note
  52499. 2
  52500. delete -- deleting one line of text from a note
  52501. 2
  52502.  
  52503. 2
  52504. @notedit -- general editing on the text of a note
  52505. 2
  52506.  
  52507. 2
  52508. encrypt -- restricting who can read a note
  52509. 2
  52510. decrypt -- undoing a previous encryption
  52511. 2
  52512.  
  52513. 2
  52514. You can make a note by creating a child of the standard note, $note (see 'help @create').  Note that, like most objects, only the owner of a note can recycle it.  If you'd like to make it possible for a reader of your note to destroy it (this is a common desire for notes to other individual players), then you might want to look at 'help letters'.
  52515. 38
  52516. 5
  52517. 4
  52518. 11
  52519. 2
  52520. Syntax: look
  52521. 2
  52522.         look <object>
  52523. 2
  52524.         look <object> in <container>
  52525. 2
  52526.  
  52527. 2
  52528. Show a description of something.
  52529. 2
  52530.  
  52531. 2
  52532. The first form, with no arguments, shows you the name and description of the room you're in, along with a list of the other objects that are there.
  52533. 2
  52534.  
  52535. 2
  52536. The second form lets you look at a specific object.  Most objects have descriptions that may be read this way.  You can look at your own description using 'look me'.  You can set the description for an object or room, including yourself, with the 'describe' command (see 'help describe').
  52537. 2
  52538.  
  52539. 2
  52540. The third form shows you the description of an object that is inside some other object, including objects being carried by another player.
  52541. 38
  52542. 5
  52543. 4
  52544. 4
  52545. 2
  52546. Syntax:  drop <object>
  52547. 2
  52548.          throw <object>
  52549. 2
  52550.  
  52551. 2
  52552. Remove an object you are carrying from your inventory and put it in your current room.  Occasionally you may find that the owner of the room won't allow you to do this.
  52553. 38
  52554. 5
  52555. 4
  52556. 2
  52557. 2
  52558. *forward*
  52559. 2
  52560. take
  52561. 38
  52562. 5
  52563. 4
  52564. 17
  52565. 2
  52566. Objects usually have verbs defined on them that allow players to manipulate and use them in various ways. Standard ones are:
  52567. 2
  52568.  
  52569. 2
  52570. get  -- pick an object up and place it in your inventory
  52571. 2
  52572. drop -- remove an object from your inventory and place it in the room
  52573. 2
  52574. put  -- take an object from your inventory and place it in a container
  52575. 2
  52576. give -- hand an object to some other player
  52577. 2
  52578. look -- see what an object looks like
  52579. 2
  52580.  
  52581. 2
  52582. You can see what objects you're carrying with the 'inventory' command; see 'help inventory' for details.
  52583. 2
  52584.  
  52585. 2
  52586. Some specialized objects will have other commands. The programmer of the object will usually provide some way for you to find out what the commands are.  One way that works for most objects is the 'examine' command; see 'help examine' for details.
  52587. 2
  52588.  
  52589. 2
  52590. The following specialized objects have help entries you should consult:
  52591. 2
  52592.  
  52593. 2
  52594. notes -- objects that allow text to be written on them and read later
  52595. 2
  52596. letters -- notes that a recipient can burn after reading
  52597. 2
  52598. containers -- objects that may contain other objects
  52599. 38
  52600. 5
  52601. 4
  52602. 18
  52603. 2
  52604. Syntax:  help
  52605. 2
  52606.          help <topic>
  52607. 2
  52608.          help index
  52609. 2
  52610.  
  52611. 2
  52612. Print out entries from the online documentation system.  The commands `?' and `information' (usually abbreviated `info') are synonyms for `help'.
  52613. 2
  52614.  
  52615. 2
  52616. The first form prints out a summary table of contents for the entire help system.  
  52617. 2
  52618.  
  52619. 2
  52620. The second form prints out the documentation available on the given topic.  Many help system entries contain references to other entries accessible in this way.  The topic name may be abbreviated; if there is no topic exactly matching the name you give, the help system checks for topics for which the name is a prefix, perhaps with the addition or omission of an initial `@', or perhaps with some confusion beween dashes (-) and underscores (_), e.g., 
  52621. 2
  52622.       `bui' instead of `building', 
  52623. 2
  52624.       `who' instead of `@who', 
  52625. 2
  52626.      `@wri' instead of `write',
  52627. 2
  52628.   `add_ent' instead of `@add-entrance',
  52629. 2
  52630.  `unlock-'  instead of `@unlock_for_open'
  52631. 2
  52632.  
  52633. 2
  52634. If the abbreviation you give is ambiguous, you will be presented with a list of the matching complete topic names.
  52635. 2
  52636.  
  52637. 2
  52638. The `help index' commands prints out a list of indices for the various help databases.  Each index gives a list of topics available on that database.  It is sometimes easier to find the topics you're interested in this way, rather than tracing through the chain of cross references.
  52639. 38
  52640. 1
  52641. 4
  52642. 1
  52643. 2
  52644. Rooms may be made by builders, using the DIG verb. By default, all rooms are instances of _the_ room, $room, or #3, which you can examine to see how it works. If you require a room to have a more specific behaviour, you can make a subclass of room.
  52645. 38
  52646. 1
  52647. 4
  52648. 5
  52649. 2
  52650. The descriptions of most rooms outline the directions in which exits exist.  Typical directions include the eight compass points ('north', 'south', 'east', 'west', 'northeast', 'southeast', 'northwest', and 'southwest'), 'up', 'down', and 'out'.
  52651. 2
  52652.  
  52653. 2
  52654. To go in a particular direction, simply type the name of that direction (e.g, 'north', 'up').  The name of the direction can usually be abbreviated to one or two characters (e.g., 'n', 'sw').  You can also type 'go <direction>' to move; this is particularly useful if you know you're going to type several movement commands in a row (see 'help go').
  52655. 2
  52656.  
  52657. 2
  52658. In addition to such vanilla movement, some areas may contain objects allowing teleportation and almost all areas permit the use of the 'home' command to teleport you to your designated home (see 'help home' for more details).
  52659. 38
  52660. 1
  52661. 4
  52662. 6
  52663. 2
  52664. *subst*
  52665. 2
  52666. Syntax: home
  52667. 2
  52668.  
  52669. 2
  52670. Instantly teleports you to your designated home room.
  52671. 2
  52672. Initially, this room is %[tostr($player_start.name," (",$player_start,")")].
  52673. 2
  52674. You can change your designated home; see 'help @sethome' for details.
  52675. 38
  52676. 1
  52677. 4
  52678. 15
  52679. 2
  52680. There are several commands available to allow you to communicate with your fellow MOOers.  Help is available on the following communication-related topics:
  52681. 2
  52682.  
  52683. 2
  52684. say      -- talking to the other connected players in the room
  52685. 2
  52686. whisper  -- talking privately to someone in the same room
  52687. 2
  52688. page     -- yelling to someone anywhere in the MOO
  52689. 2
  52690. emote    -- non-verbal communication with others in the same room
  52691. 2
  52692. gagging  -- screening out noise generated by certain other players
  52693. 2
  52694. news     -- reading the wizards' most recent set of general announcements
  52695. 2
  52696. @gripe   -- sending complaints to the wizards
  52697. 2
  52698. @typo @bug @idea @suggest
  52699. 2
  52700.          -- sending complaints/ideas to the owner of the current room
  52701. 2
  52702. whereis  -- locating other players
  52703. 2
  52704. @who     -- finding out who is currently logged in
  52705. 2
  52706. mail     -- the MOO email system
  52707. 2
  52708. security -- the facilities for detecting forged messages and eavesdropping.
  52709. 38
  52710. 1
  52711. 4
  52712. 12
  52713. 2
  52714. Syntax:  say <anything> ...
  52715. 2
  52716.          "<anything> ...
  52717. 2
  52718.  
  52719. 2
  52720. Says <anything> out loud, so that everyone in the same room hears it.  This is so commonly used that there's a special abbreviation for it: any command-line beginning with a double-quote ('"') is treated as a 'say' command.
  52721. 2
  52722.  
  52723. 2
  52724. Example:
  52725. 2
  52726. Munchkin types this:
  52727. 2
  52728.   "This is a great MOO!
  52729. 2
  52730. Munchkin sees this:
  52731. 2
  52732.   You say, "This is a great MOO!"
  52733. 2
  52734. Others in the same room see this:
  52735. 2
  52736.   Munchkin says, "This is a great MOO!"
  52737. 38
  52738. 1
  52739. 4
  52740. 2
  52741. 2
  52742. whisper "<text>" to <player>
  52743. 2
  52744. sends the message "<yourname> whispers, "<text>" to you " to <player>, if they are in the room.
  52745. 38
  52746. 1
  52747. 4
  52748. 27
  52749. 2
  52750. *subst*
  52751. 2
  52752. Syntax:  page <player> [[with] <text>]
  52753. 2
  52754.  
  52755. 2
  52756. Sends a message to a connected player, telling them your location and, optionally, <text>.
  52757. 2
  52758.  
  52759. 2
  52760. Example:
  52761. 2
  52762. Munchkin types:
  52763. 2
  52764.         page Frebble with "Where are you?"
  52765. 2
  52766. Frebble sees:
  52767. 2
  52768.         You sense that Munchkin is looking for you in the Kitchen.
  52769. 2
  52770.         He pages, "Where are you?"
  52771. 2
  52772. Munchkin sees:
  52773. 2
  52774.         Your message has been received.
  52775. 2
  52776.  
  52777. 2
  52778. Advanced Features:
  52779. 2
  52780. Page refers to the following messages on the players involved (see 'help messages'):
  52781. 2
  52782.  
  52783. 2
  52784. @page_origin [%[$player.page_origin_msg]]
  52785. 2
  52786.   Determines how the recipient is told of your location.
  52787. 2
  52788.  
  52789. 2
  52790. @page_echo   [%[$player.page_echo_msg]]
  52791. 2
  52792.   Determines the response received by anyone who pages you.
  52793. 2
  52794.  
  52795. 2
  52796. @page_absent [%[$player.page_absent_msg]]
  52797. 2
  52798.   Determines the response received by anyone who tries to page you when you aren't connected.
  52799. 2
  52800.  
  52801. 2
  52802. All of these undergo the usual pronoun substitutions (see 'help pronouns') except that in both cases the direct object (%d) refers to the recipent of the page and the indirect object (%i) refers to the sender.  You should only change these messages if you want to add to the Virtual Reality feel of the MOO for your character.
  52803. 38
  52804. 1
  52805. 4
  52806. 18
  52807. 2
  52808. Syntax:  emote <anything> ...
  52809. 2
  52810.          :<anything> ...
  52811. 2
  52812.          ::<anything> ...
  52813. 2
  52814.  
  52815. 2
  52816. Announces <anything> to everyone in the same room, prepending your name.  This is commonly used to express various non-verbal forms of communication.  In fact, it is so commonly used that there's a special abbreviation for it: any command-line beginning with ':' is treated as an 'emote' command.
  52817. 2
  52818.  
  52819. 2
  52820. The alternate form, '::' (less commonly 'emote :'), does not insert the space between the player name and the text.
  52821. 2
  52822.  
  52823. 2
  52824. Examples:
  52825. 2
  52826. Munchkin types this:
  52827. 2
  52828.   :wishes he were much taller...
  52829. 2
  52830. Everyone in the same room sees this:
  52831. 2
  52832.   Munchkin wishes he were much taller...
  52833. 2
  52834.  
  52835. 2
  52836. Munchkin types this:
  52837. 2
  52838.   ::'s eyes are green.
  52839. 2
  52840. Everyone in the same room sees this:
  52841. 2
  52842.   Munchkin's eyes are green.
  52843. 38
  52844. 1
  52845. 4
  52846. 6
  52847. 2
  52848. There are a number of commands available to players for building new parts of the MOO.  Help on them is available under the following topics:
  52849. 2
  52850.  
  52851. 2
  52852. creation -- making, unmaking, and listing your rooms, exits, and other objects
  52853. 2
  52854. topology -- making and listing the connections between rooms and exits
  52855. 2
  52856. descriptions -- setting the names and descriptive texts for new objects
  52857. 2
  52858. locking -- controlling use of and access to your objects
  52859. 38
  52860. 1
  52861. 4
  52862. 8
  52863. 2
  52864. There are a number of commands for modifying various characteristics of the object representing you in the MOO, your 'player'.  Help on them is available in the following topics:
  52865. 2
  52866.  
  52867. 2
  52868. @describe -- setting what others see when they look at you
  52869. 2
  52870. @gender -- changing your player's gender
  52871. 2
  52872. @password -- changing your player's password
  52873. 2
  52874. @sethome -- changing your designated home room
  52875. 2
  52876. @rename -- changing your name and/or aliases
  52877. 2
  52878. @linelength -- adding word-wrap to the lines you see
  52879. 38
  52880. 1
  52881. 4
  52882. 18
  52883. 2
  52884. Help is available on the following general topics:
  52885. 2
  52886.  
  52887. 2
  52888. introduction -- what's going on here and some basic commands
  52889. 2
  52890. index -- index into the help system
  52891. 2
  52892.  
  52893. 2
  52894. players -- setting characteristics of yourself
  52895. 2
  52896. movement -- moving yourself between rooms
  52897. 2
  52898. communication -- communicating with other players
  52899. 2
  52900. manipulation -- moving or using other objects
  52901. 2
  52902. miscellaneous -- commands that don't fit anywhere else
  52903. 2
  52904.  
  52905. 2
  52906. building -- extending the MOO
  52907. 2
  52908. programming -- writing code in the MOO programming language
  52909. 2
  52910. editors -- editing text and code in the MOO
  52911. 2
  52912.  
  52913. 2
  52914. @pagelength -- what to do if lines scroll off your screen too fast
  52915. 2
  52916. @linelength -- what to do if lines are truncated
  52917. 2
  52918. tinymud -- a list of equivalences between MOO and TinyMUD concepts/commands
  52919. 38
  52920. 5
  52921. 4
  52922. 21
  52923. 2
  52924. Syntax:  @edit-option
  52925. 2
  52926.          @edit-option <option>
  52927. 2
  52928.  
  52929. 2
  52930. Synonym:  @editoption
  52931. 2
  52932.  
  52933. 2
  52934. The edit options customize the behavior of the various editors (mail editor, verb editor, etc...) to your particular taste.  The first form of this command displays all of your edit options.  The second form displays just that one option, one of the flags listed below.
  52935. 2
  52936.  
  52937. 2
  52938. The remaining forms of this command are for setting your edit options:
  52939. 2
  52940.  
  52941. 2
  52942.          @edit-option +<flag>
  52943. 2
  52944.          @edit-option -<flag>
  52945. 2
  52946.          @edit-option !<flag>           (equivalent to -<flag>)
  52947. 2
  52948.  
  52949. 2
  52950. These respectively set and reset the specified flag
  52951. 2
  52952.  
  52953. 2
  52954. -quiet_insert    insert (") and append (:) echo back the line numbers
  52955. 2
  52956. +quiet_insert    insert (") and append (:) produce no output
  52957. 2
  52958. -eval_subs       (VERB EDITOR) ignore .eval_subs when compiling verbs
  52959. 2
  52960. +eval_subs       (VERB EDITOR) apply .eval_subs to verbs being compiled
  52961. 2
  52962. -local           Use in-MOO text editors.
  52963. 2
  52964. +local           Ship text to client for local editing.
  52965. 38
  52966. 5
  52967. 4
  52968. 2
  52969. 2
  52970. *forward*
  52971. 2
  52972. @edit-options
  52973. 38
  52974. 5
  52975. 4
  52976. 4
  52977. 2
  52978. Usage:  @add-feature  <object>
  52979. 2
  52980.  @remove-feature <object>
  52981. 2
  52982.  
  52983. 2
  52984. Add or remove a feature from your list.  A feature is an object which provides additional commands you can use.  For more information, see `help features'.
  52985. 38
  52986. 5
  52987. 4
  52988. 2
  52989. 2
  52990. *forward*
  52991. 2
  52992. @add-feature
  52993. 38
  52994. 5
  52995. 4
  52996. 3
  52997. 2
  52998. Usage:  @features [<name>] [for <player>]
  52999. 2
  53000.  
  53001. 2
  53002. List all of <player>'s features matching <name>, or all of <player>'s features if <name> is not supplied.  <player> defaults to you.  See `help features' for more information.
  53003. 38
  53004. 5
  53005. 4
  53006. 3
  53007. 2
  53008. Features are objects that provide you with commands not covered by the ordinary player objects.  The advantage of using features is that you can mix and match the things you like; whereas if you like a command that's defined on a player class, you have to also get all the commands it defines, and all the commands its ancestors define.
  53009. 2
  53010.  
  53011. 2
  53012. You can list your features with the @features command, and add or remove features from your list with the @add-feature and @remove-feature commands.
  53013. 38
  53014. 5
  53015. 4
  53016. 7
  53017. 2
  53018. Syntax:  @dump <object> [with [id=#<id>] [noprops] [noverbs] [create]]
  53019. 2
  53020.  
  53021. 2
  53022. This spills out all the properties and verbs on an object, calling suspend at appropriate intervals.
  53023. 2
  53024.    id=#<id> -- specifies an idnumber to use in place of the object's actual id (for porting to another MOO)
  53025. 2
  53026.    noprops  -- don't show properties.
  53027. 2
  53028.    noverbs  -- don't show verbs.
  53029. 2
  53030.    create   -- indicates that a @create command should be generated and all of the verbs be introduced with @verb rather than @args; the default assumption is that the object already exists and you're just doing this to have a look at it.
  53031. 2
  53032. 1
  53033. 4
  53034. 1
  53035. 2
  53036. The MOO helps those who help themselves.  Try starting with `help summary'.
  53037. 38
  53038. 5
  53039. 4
  53040. 7
  53041. 2
  53042. Syntax: @rmalias <alias>[,...,<alias>] from <object>
  53043. 2
  53044.         @rmalias <alias>[,...,<alias>] from <object>:<verb>
  53045. 2
  53046.  
  53047. 2
  53048. The first form is used to remove aliases from an object.  If the object is a valid player, space and commas will be assumed to be separations between unwanted aliases.  Otherwise, only commas will be assumed to be separations.
  53049. 2
  53050. Note that @rmalias will not affect the object's name, only its aliases.
  53051. 2
  53052.  
  53053. 2
  53054. The second form is for use by programmers, to remove aliases from a verb they own.  All spaces and commas are assumed to be separations between unwanted aliases.
  53055. 38
  53056. 5
  53057. 4
  53058. 22
  53059. 2
  53060. Syntax: @addalias <alias>[,...,<alias>] to <object>
  53061. 2
  53062.         @addalias <alias>[,...,<alias>] to <object>:<verb>
  53063. 2
  53064.  
  53065. 2
  53066. The first form is used to add aliases to an object's list of aliases.  You can separate multiple aliases with commas.  The aliases will be checked against the object's current aliases and all aliases not already in the object's list of aliases will be added.
  53067. 2
  53068.  
  53069. 2
  53070. Example:
  53071. 2
  53072. Muchkin wants to add new aliases to Rover the Wonder Dog:
  53073. 2
  53074.   @addalias Dog,Wonder Dog to Rover
  53075. 2
  53076. Since Rover the Wonder Dog already has the alias "Dog" but does not have the alias "Wonder Dog", Munchkin sees:
  53077. 2
  53078.   Rover the Wonder Dog(#4237) already has the alias Dog.
  53079. 2
  53080.   Alias Wonder Dog added to Rover the Wonder Dog(#4237).
  53081. 2
  53082.  
  53083. 2
  53084. If the object is a player, spaces will also be assumed to be separations between aliases and each alias will be checked against the Player Name Database to make sure no one else is using it. Any already used aliases will be identified.
  53085. 2
  53086.  
  53087. 2
  53088. Example:
  53089. 2
  53090. Munchkin wants to add his nicknames to his own list of aliases:
  53091. 2
  53092.   @addalias Foobar Davey to me
  53093. 2
  53094. @Addalias recognizes that Munchkin is trying to add an alias to a valid player and checks the aliases against the Player Name Database.  Unfortunately, DaveTheMan is already using the alias "Davey" so Munchkin sees:
  53095. 2
  53096.   DaveTheMan(#5432) is already using the alias Davey
  53097. 2
  53098.   Alias Foobar added to Munchkin(#1523).
  53099. 2
  53100.  
  53101. 2
  53102. The second form of the @addalias command is for use by programmers, to add aliases to a verb they own.  All commas and spaces are assumed to be separations between aliases.
  53103. 38
  53104. 5
  53105. 4
  53106. 5
  53107. 2
  53108. *forward*
  53109. 2
  53110. summary
  53111. 2
  53112.  
  53113. 2
  53114. Type 'help <topic>' for information on a particular topic.
  53115. 2
  53116.  
  53117. 38
  53118. 5
  53119. 4
  53120. 4
  53121. 2
  53122. Every object (including players, rooms, exits) has a name and a set of aliases. The object name is commonly used to display an object in various contexts. The object aliases are used to refer to an object when players type commands.
  53123. 2
  53124. Help is available on the following commands:
  53125. 2
  53126. @rename -- change the names or aliases of an object or yourself.
  53127. 2
  53128. @addalias, @rmalias -- add and remove aliases.
  53129. 38
  53130. 5
  53131. 4
  53132. 2
  53133. 2
  53134. *forward*
  53135. 2
  53136.  name
  53137. 38
  53138. 5
  53139. 4
  53140. 4
  53141. 2
  53142. Syntax:  @set <object>.<prop-name> to <value>
  53143. 2
  53144.  
  53145. 2
  53146. Changes the value of the specified object's property to the given value.
  53147. 2
  53148. You must have permission to modify the property, either because you own the property or if it is writable.
  53149. 38
  53150. 5
  53151. 4
  53152. 3
  53153. 2
  53154. *forward*
  53155. 2
  53156. @setprop
  53157. 2
  53158. @set is a valid abbreviation for @setprop.
  53159. 38
  53160. 5
  53161. 4
  53162. 2
  53163. 2
  53164. *forward*
  53165. 2
  53166. @read
  53167. 38
  53168. 5
  53169. 4
  53170. 3
  53171. 2
  53172. Syntax: @subscribed
  53173. 2
  53174.  
  53175. 2
  53176. Like @rn, but shows you ALL mailing lists to which you are subscribed, even those which have new messages.
  53177. 38
  53178. 5
  53179. 4
  53180. 5
  53181. 2
  53182. Usage:  @request <player-name> for <email-address>
  53183. 2
  53184.  
  53185. 2
  53186. This command available to Guest characters only.
  53187. 2
  53188.  
  53189. 2
  53190. The @request command requests a new character, registered for your email address. Please use your primary address for this, as your password will be sent to the address provided.
  53191. 38
  53192. 5
  53193. 4
  53194. 6
  53195. 2
  53196. *subst*
  53197. 2
  53198. A player name must be a single word, must not contain any spaces, backslashes, or quotes, nor can it begin with the characters #, *, (, or ).  Finally it cannot be one that is in use by any other player nor any of the words on the following list:
  53199. 2
  53200.  
  53201. 2
  53202. %;;lns={};for l in ($string_utils:columnize({@$player_db.stupid_names,@$player_db.reserved},6)) lns={@lns,"  "+l}; endfor return lns;
  53203. 2
  53204.  
  53205. 2
  53206. Note that these rules apply as well to your single-word aliases, since those can equally well be used to refer to you in commands that match on player names (@who, whereis, ...).  There are no restrictions on your multi-word aliases, however the commands that expect player names will not recognize them.
  53207. 38
  53208. 5
  53209. 5
  53210. 38
  53211. 5
  53212. 5
  53213. 38
  53214. 4
  53215. 4
  53216. 0
  53217. 38
  53218. 5
  53219. 4
  53220. 9
  53221. 2
  53222. The object $help is the main help database.  For every help topic there is a corresponding property on $help, interpreted as follows:
  53223. 2
  53224.  
  53225. 2
  53226. $help.(topic) = string           - one-line help text.
  53227. 2
  53228. $help.(topic) = {"*verb*",@args} - call this:verb(args,{}) to get text
  53229. 2
  53230. $help.(topic) = any other list   - multi-line help text
  53231. 2
  53232.  
  53233. 2
  53234. There is also a "" property which applies in the case of `help' typed without any arguments.
  53235. 2
  53236.  
  53237. 2
  53238. See the description of $generic_help for more detail.
  53239. 38
  53240. 5
  53241. 4
  53242. 2
  53243. 0
  53244. 127209
  53245. 0
  53246. 743583956
  53247. 2
  53248. 1
  53249. #62
  53250. Recycling Center
  53251.  
  53252. 16
  53253. 38
  53254. -1
  53255. -1
  53256. -1
  53257. 5
  53258. -1
  53259. 74
  53260. 11
  53261. _recreate
  53262. 2
  53263. 173
  53264. -1
  53265. _recycle
  53266. 2
  53267. 173
  53268. -1
  53269. _create
  53270. 2
  53271. 165
  53272. -1
  53273. addhist
  53274. 2
  53275. 173
  53276. -1
  53277. show*-history
  53278. 2
  53279. 37
  53280. -1
  53281. request
  53282. 2
  53283. 153
  53284. 5
  53285. setup_toad
  53286. 2
  53287. 173
  53288. -1
  53289. add_orphan
  53290. 38
  53291. 173
  53292. -1
  53293. remove_orphan
  53294. 38
  53295. 173
  53296. -1
  53297. valid
  53298. 2
  53299. 173
  53300. -1
  53301. init_for_core
  53302. 2
  53303. 173
  53304. -1
  53305. 4
  53306. orphans
  53307. announce_removal_msg
  53308. nhist
  53309. history
  53310. 16
  53311. 4
  53312. 0
  53313. 38
  53314. 1
  53315. 2
  53316.  
  53317. 38
  53318. 5
  53319. 0
  53320. 50
  53321. 38
  53322. 0
  53323. 4
  53324. 51
  53325. 4
  53326. 2
  53327. 1
  53328. 2
  53329. 1
  53330. 82
  53331. 4
  53332. 2
  53333. 1
  53334. 2
  53335. 1
  53336. 80
  53337. 4
  53338. 2
  53339. 1
  53340. 2
  53341. 1
  53342. 81
  53343. 4
  53344. 2
  53345. 1
  53346. 2
  53347. 1
  53348. 88
  53349. 4
  53350. 2
  53351. 1
  53352. 2
  53353. 1
  53354. 87
  53355. 4
  53356. 2
  53357. 1
  53358. 2
  53359. 1
  53360. 92
  53361. 4
  53362. 2
  53363. 1
  53364. 2
  53365. 1
  53366. 101
  53367. 4
  53368. 2
  53369. 1
  53370. 2
  53371. 1
  53372. 113
  53373. 4
  53374. 2
  53375. 1
  53376. 2
  53377. 1
  53378. 137
  53379. 4
  53380. 2
  53381. 1
  53382. 77
  53383. 1
  53384. 157
  53385. 4
  53386. 2
  53387. 1
  53388. 77
  53389. 1
  53390. 155
  53391. 4
  53392. 2
  53393. 1
  53394. 77
  53395. 1
  53396. 156
  53397. 4
  53398. 2
  53399. 1
  53400. 2
  53401. 1
  53402. 146
  53403. 4
  53404. 2
  53405. 1
  53406. 2
  53407. 1
  53408. 78
  53409. 4
  53410. 2
  53411. 1
  53412. 2
  53413. 1
  53414. 158
  53415. 4
  53416. 2
  53417. 1
  53418. 2
  53419. 1
  53420. 164
  53421. 4
  53422. 2
  53423. 1
  53424. 2
  53425. 1
  53426. 170
  53427. 4
  53428. 2
  53429. 1
  53430. 2
  53431. 1
  53432. 145
  53433. 4
  53434. 2
  53435. 1
  53436. 2
  53437. 1
  53438. 144
  53439. 4
  53440. 2
  53441. 1
  53442. 228
  53443. 1
  53444. 174
  53445. 4
  53446. 2
  53447. 1
  53448. 2
  53449. 1
  53450. 173
  53451. 4
  53452. 2
  53453. 1
  53454. 228
  53455. 1
  53456. 266
  53457. 4
  53458. 2
  53459. 1
  53460. 228
  53461. 1
  53462. 265
  53463. 4
  53464. 2
  53465. 1
  53466. 228
  53467. 1
  53468. 298
  53469. 4
  53470. 2
  53471. 1
  53472. 2
  53473. 1
  53474. 308
  53475. 4
  53476. 2
  53477. 1
  53478. 2
  53479. 1
  53480. 316
  53481. 4
  53482. 2
  53483. 1
  53484. 2
  53485. 1
  53486. 327
  53487. 4
  53488. 2
  53489. 1
  53490. 2
  53491. 1
  53492. 327
  53493. 4
  53494. 2
  53495. 1
  53496. 2
  53497. 1
  53498. 327
  53499. 4
  53500. 2
  53501. 1
  53502. 2
  53503. 1
  53504. 329
  53505. 4
  53506. 2
  53507. 1
  53508. 147
  53509. 1
  53510. 335
  53511. 4
  53512. 2
  53513. 1
  53514. 2
  53515. 1
  53516. 335
  53517. 4
  53518. 2
  53519. 1
  53520. 2
  53521. 1
  53522. 335
  53523. 4
  53524. 2
  53525. 1
  53526. 2
  53527. 1
  53528. 338
  53529. 4
  53530. 2
  53531. 1
  53532. 2
  53533. 1
  53534. 335
  53535. 4
  53536. 2
  53537. 1
  53538. 77
  53539. 1
  53540. 335
  53541. 4
  53542. 2
  53543. 1
  53544. 77
  53545. 1
  53546. 339
  53547. 4
  53548. 2
  53549. 1
  53550. 77
  53551. 1
  53552. 338
  53553. 4
  53554. 2
  53555. 1
  53556. 2
  53557. 1
  53558. 344
  53559. 4
  53560. 2
  53561. 1
  53562. 2
  53563. 1
  53564. 344
  53565. 4
  53566. 2
  53567. 1
  53568. 147
  53569. 1
  53570. 328
  53571. 4
  53572. 2
  53573. 1
  53574. 2
  53575. 1
  53576. 344
  53577. 4
  53578. 2
  53579. 1
  53580. 2
  53581. 1
  53582. 349
  53583. 4
  53584. 2
  53585. 1
  53586. 2
  53587. 1
  53588. 349
  53589. 4
  53590. 2
  53591. 1
  53592. 2
  53593. 1
  53594. 352
  53595. 4
  53596. 2
  53597. 1
  53598. 2
  53599. 1
  53600. 352
  53601. 4
  53602. 2
  53603. 1
  53604. 2
  53605. 1
  53606. 352
  53607. 4
  53608. 2
  53609. 1
  53610. 2
  53611. 1
  53612. 353
  53613. 4
  53614. 2
  53615. 1
  53616. 2
  53617. 1
  53618. 426
  53619. 4
  53620. 2
  53621. 1
  53622. 2
  53623. 1
  53624. 427
  53625. 4
  53626. 2
  53627. 1
  53628. 2
  53629. 1
  53630. 130
  53631. 38
  53632. 0
  53633. 5
  53634. 38
  53635. 5
  53636. 5
  53637. 38
  53638. 5
  53639. 5
  53640. 38
  53641. 5
  53642. 5
  53643. 38
  53644. 5
  53645. 5
  53646. 38
  53647. 5
  53648. 5
  53649. 38
  53650. 5
  53651. 5
  53652. 38
  53653. 5
  53654. 5
  53655. 38
  53656. 5
  53657. 5
  53658. 38
  53659. 4
  53660. 4
  53661. 2
  53662. 2
  53663. Recycling Center
  53664. 2
  53665. Center
  53666. 38
  53667. 5
  53668. 2
  53669. Object reuse. Call $recycler:_create() to create an object (semantics the same as create()), $recycler:_recycle() to recycle an object. Will create a new object if nothing available in its contents. Note underscores, to avoid builtin :recycle() verb called when objects are recycled. Uses $building_utils:recreate() to prepare objects.
  53670. 38
  53671. 5
  53672. 4
  53673. 2
  53674. 0
  53675. 8708
  53676. 0
  53677. 743586009
  53678. 2
  53679. 1
  53680. #63
  53681. Generic Garbage Object
  53682.  
  53683. 16
  53684. 2
  53685. -1
  53686. -1
  53687. -1
  53688. -1
  53689. -1
  53690. -1
  53691. 4
  53692. description
  53693. 2
  53694. 173
  53695. -1
  53696. look_self
  53697. 2
  53698. 173
  53699. -1
  53700. title titlec
  53701. 2
  53702. 173
  53703. -1
  53704. tell
  53705. 2
  53706. 173
  53707. -1
  53708. 1
  53709. aliases
  53710. 1
  53711. 4
  53712. 1
  53713. 2
  53714. garbage
  53715. 2
  53716. 1
  53717. #64
  53718. Mail Options
  53719.  
  53720. 16
  53721. 38
  53722. -1
  53723. -1
  53724. -1
  53725. 67
  53726. -1
  53727. 65
  53728. 10
  53729. actual
  53730. 38
  53731. 173
  53732. -1
  53733. parse_@mail
  53734. 38
  53735. 173
  53736. -1
  53737. parse_sticky parse_manymsgs
  53738. 38
  53739. 173
  53740. -1
  53741. parse_replyto
  53742. 38
  53743. 173
  53744. -1
  53745. show_manymsgs
  53746. 38
  53747. 173
  53748. -1
  53749. show_sticky
  53750. 38
  53751. 173
  53752. -1
  53753. show_@mail
  53754. 38
  53755. 173
  53756. -1
  53757. show_replyto
  53758. 38
  53759. 173
  53760. -1
  53761. show
  53762. 38
  53763. 173
  53764. -1
  53765. check_replyto
  53766. 38
  53767. 173
  53768. -1
  53769. 8
  53770. show_include
  53771. show_all
  53772. show_nosubject
  53773. show_expert
  53774. show_enter
  53775. type_manymsgs
  53776. type_@mail
  53777. type_replyto
  53778. 16
  53779. 4
  53780. 2
  53781. 2
  53782. Original message will not be included in replies
  53783. 2
  53784. Original message will be included in replies
  53785. 38
  53786. 5
  53787. 4
  53788. 2
  53789. 2
  53790. Replies will go to original sender only.
  53791. 2
  53792. Replies will go to original sender and all previous recipients.
  53793. 38
  53794. 5
  53795. 4
  53796. 2
  53797. 2
  53798. Mail editor will initially require a subject line.
  53799. 2
  53800. Mail editor will not initially require a subject line.
  53801. 38
  53802. 5
  53803. 4
  53804. 2
  53805. 2
  53806. Novice mail user...
  53807. 2
  53808. Expert mail user...
  53809. 38
  53810. 5
  53811. 4
  53812. 2
  53813. 2
  53814. Mail editor will not start with an implicit `enter' command.
  53815. 2
  53816. Mail editor will start with an implicit `enter' command.
  53817. 38
  53818. 5
  53819. 4
  53820. 1
  53821. 0
  53822. 0
  53823. 38
  53824. 5
  53825. 4
  53826. 2
  53827. 0
  53828. 2
  53829. 4
  53830. 1
  53831. 0
  53832. 2
  53833. 38
  53834. 5
  53835. 4
  53836. 2
  53837. 0
  53838. 1
  53839. 4
  53840. 1
  53841. 0
  53842. 1
  53843. 38
  53844. 5
  53845. 4
  53846. 9
  53847. 2
  53848. include
  53849. 2
  53850. all
  53851. 2
  53852. nosubject
  53853. 2
  53854. expert
  53855. 2
  53856. enter
  53857. 2
  53858. sticky
  53859. 2
  53860. @mail
  53861. 2
  53862. manymsgs
  53863. 2
  53864. replyto
  53865. 38
  53866. 1
  53867. 2
  53868. !include!noinclude!all!sender!nosubject!expert!enter!sticky!@mail!manymsgs!replyto!
  53869. 38
  53870. 1
  53871. 4
  53872. 2
  53873. 2
  53874. noinclude
  53875. 2
  53876. sender
  53877. 38
  53878. 1
  53879. 5
  53880. 38
  53881. 5
  53882. 5
  53883. 38
  53884. 4
  53885. 4
  53886. 1
  53887. 2
  53888. Mail Options
  53889. 38
  53890. 5
  53891. 5
  53892. 38
  53893. 5
  53894. 4
  53895. 2
  53896. 0
  53897. 4809
  53898. 0
  53899. 743668311
  53900. 2
  53901. 1
  53902. #65
  53903. Edit Options
  53904.  
  53905. 16
  53906. 38
  53907. -1
  53908. -1
  53909. -1
  53910. 67
  53911. -1
  53912. 66
  53913. 0
  53914. 3
  53915. show_quiet_insert
  53916. show_eval_subs
  53917. show_local
  53918. 11
  53919. 4
  53920. 2
  53921. 2
  53922. Report line numbers on insert or append.
  53923. 2
  53924. No echo on insert or append.
  53925. 38
  53926. 5
  53927. 4
  53928. 2
  53929. 2
  53930. Ignore .eval_subs when compiling verbs.
  53931. 2
  53932. Use .eval_subs when compiling verbs.
  53933. 38
  53934. 5
  53935. 4
  53936. 2
  53937. 2
  53938. Use in-MOO text editors.
  53939. 2
  53940. Ship text to client for local editing.
  53941. 38
  53942. 5
  53943. 4
  53944. 3
  53945. 2
  53946. quiet_insert
  53947. 2
  53948. eval_subs
  53949. 2
  53950. local
  53951. 38
  53952. 1
  53953. 2
  53954. !quiet_insert!eval_subs!local!
  53955. 38
  53956. 1
  53957. 5
  53958. 38
  53959. 1
  53960. 0
  53961. 20
  53962. 38
  53963. 5
  53964. 5
  53965. 38
  53966. 4
  53967. 4
  53968. 1
  53969. 2
  53970. Edit Options
  53971. 38
  53972. 5
  53973. 5
  53974. 38
  53975. 5
  53976. 4
  53977. 2
  53978. 0
  53979. 741
  53980. 0
  53981. 743667405
  53982. 2
  53983. 1
  53984. #66
  53985. Display Options
  53986.  
  53987. 16
  53988. 38
  53989. -1
  53990. -1
  53991. -1
  53992. 67
  53993. -1
  53994. 68
  53995. 0
  53996. 3
  53997. show_blank_tnt
  53998. show_shortprep
  53999. show_thisonly
  54000. 11
  54001. 4
  54002. 2
  54003. 2
  54004. Treat `this none this' verbs like the others.
  54005. 2
  54006. Blank out the args on `this none this' verbs.
  54007. 38
  54008. 5
  54009. 4
  54010. 2
  54011. 2
  54012. Display prepositions in full.
  54013. 2
  54014. Use short forms of prepositions.
  54015. 38
  54016. 5
  54017. 4
  54018. 2
  54019. 2
  54020. ./: will show ancestor properties/verbs if none on this.
  54021. 2
  54022. ./: will not show ancestor properties/verbs.
  54023. 38
  54024. 5
  54025. 4
  54026. 3
  54027. 2
  54028. blank_tnt
  54029. 2
  54030. shortprep
  54031. 2
  54032. thisonly
  54033. 38
  54034. 1
  54035. 2
  54036. !blank_tnt!shortprep!thisonly!
  54037. 38
  54038. 1
  54039. 4
  54040. 0
  54041. 38
  54042. 1
  54043. 5
  54044. 38
  54045. 5
  54046. 5
  54047. 38
  54048. 4
  54049. 4
  54050. 1
  54051. 2
  54052. Display Options
  54053. 38
  54054. 5
  54055. 5
  54056. 38
  54057. 5
  54058. 4
  54059. 2
  54060. 0
  54061. 801
  54062. 0
  54063. 743668946
  54064. 2
  54065. 1
  54066. #67
  54067. Generic Option Package
  54068.  
  54069. 144
  54070. 38
  54071. -1
  54072. -1
  54073. -1
  54074. 1
  54075. 64
  54076. 69
  54077. 11
  54078. get
  54079. 38
  54080. 173
  54081. -1
  54082. set
  54083. 38
  54084. 173
  54085. -1
  54086. parse
  54087. 38
  54088. 173
  54089. -1
  54090. _name
  54091. 38
  54092. 173
  54093. -1
  54094. add_name
  54095. 38
  54096. 173
  54097. -1
  54098. remove_name
  54099. 38
  54100. 173
  54101. -1
  54102. show
  54103. 38
  54104. 173
  54105. -1
  54106. actual
  54107. 38
  54108. 173
  54109. -1
  54110. istype
  54111. 38
  54112. 173
  54113. -1
  54114. islistof
  54115. 38
  54116. 173
  54117. -1
  54118. desc_type
  54119. 38
  54120. 173
  54121. -1
  54122. 4
  54123. names
  54124. _namelist
  54125. extras
  54126. namewidth
  54127. 8
  54128. 4
  54129. 0
  54130. 38
  54131. 1
  54132. 2
  54133. !
  54134. 38
  54135. 1
  54136. 4
  54137. 0
  54138. 38
  54139. 1
  54140. 0
  54141. 15
  54142. 38
  54143. 5
  54144. 5
  54145. 38
  54146. 4
  54147. 4
  54148. 1
  54149. 2
  54150. Generic Option Package
  54151. 38
  54152. 5
  54153. 2
  54154. an option package in need of a description.  See `help $generic_option'...
  54155. 38
  54156. 5
  54157. 4
  54158. 2
  54159. 0
  54160. 12754
  54161. 0
  54162. 743925775
  54163. 2
  54164. 1
  54165. #68
  54166. List Options
  54167.  
  54168. 0
  54169. 38
  54170. -1
  54171. -1
  54172. -1
  54173. 67
  54174. -1
  54175. -1
  54176. 2
  54177. actual
  54178. 38
  54179. 173
  54180. -1
  54181. show
  54182. 38
  54183. 173
  54184. -1
  54185. 2
  54186. show_parentheses
  54187. show_nonumbers
  54188. 10
  54189. 4
  54190. 2
  54191. 2
  54192. Parenthesize expressions in listings only as needed.
  54193. 2
  54194. Fully parenthesize expressions in listings.
  54195. 38
  54196. 5
  54197. 4
  54198. 2
  54199. 2
  54200. Include line numbers.
  54201. 2
  54202. Omit line numbers.
  54203. 38
  54204. 5
  54205. 4
  54206. 2
  54207. 2
  54208. parentheses
  54209. 2
  54210. nonumbers
  54211. 38
  54212. 1
  54213. 2
  54214. !parentheses!nonumbers!numbers!
  54215. 38
  54216. 1
  54217. 4
  54218. 1
  54219. 2
  54220. numbers
  54221. 38
  54222. 1
  54223. 0
  54224. 20
  54225. 38
  54226. 5
  54227. 5
  54228. 38
  54229. 4
  54230. 4
  54231. 1
  54232. 2
  54233. List Options
  54234. 38
  54235. 5
  54236. 5
  54237. 38
  54238. 5
  54239. 4
  54240. 2
  54241. 0
  54242. 1059
  54243. 0
  54244. 743926862
  54245. 2
  54246. 1
  54247. #69
  54248. Error Generator
  54249.  
  54250. 16
  54251. 2
  54252. -1
  54253. -1
  54254. -1
  54255. 1
  54256. -1
  54257. 72
  54258. 18
  54259. raise
  54260. 38
  54261. 173
  54262. -1
  54263. E_NONE
  54264. 38
  54265. 173
  54266. -1
  54267. E_TYPE
  54268. 38
  54269. 173
  54270. -1
  54271. E_DIV
  54272. 38
  54273. 173
  54274. -1
  54275. E_PERM
  54276. 38
  54277. 173
  54278. -1
  54279. E_PROPNF
  54280. 38
  54281. 173
  54282. -1
  54283. E_VERBNF
  54284. 38
  54285. 173
  54286. -1
  54287. E_VARNF
  54288. 38
  54289. 173
  54290. -1
  54291. E_INVIND
  54292. 38
  54293. 173
  54294. -1
  54295. E_RECMOVE
  54296. 38
  54297. 173
  54298. -1
  54299. E_MAXREC
  54300. 38
  54301. 173
  54302. -1
  54303. E_RANGE
  54304. 38
  54305. 173
  54306. -1
  54307. E_ARGS
  54308. 38
  54309. 173
  54310. -1
  54311. E_NACC
  54312. 38
  54313. 173
  54314. -1
  54315. E_INVARG
  54316. 38
  54317. 173
  54318. -1
  54319. E_QUOTA
  54320. 2
  54321. 173
  54322. -1
  54323. accept
  54324. 38
  54325. 173
  54326. -1
  54327. name
  54328. 38
  54329. 173
  54330. -1
  54331. 1
  54332. names
  54333. 5
  54334. 4
  54335. 15
  54336. 2
  54337. E_NONE
  54338. 2
  54339. E_TYPE
  54340. 2
  54341. E_DIV
  54342. 2
  54343. E_PERM
  54344. 2
  54345. E_PROPNF
  54346. 2
  54347. E_VERBNF
  54348. 2
  54349. E_VARNF
  54350. 2
  54351. E_INVIND
  54352. 2
  54353. E_RECMOVE
  54354. 2
  54355. E_MAXREC
  54356. 2
  54357. E_RANGE
  54358. 2
  54359. E_ARGS
  54360. 2
  54361. E_NACC
  54362. 2
  54363. E_INVARG
  54364. 2
  54365. E_QUOTA
  54366. 2
  54367. 5
  54368. 5
  54369. 2
  54370. 4
  54371. 4
  54372. 1
  54373. 2
  54374. Error Generator
  54375. 2
  54376. 5
  54377. 4
  54378. 3
  54379. 2
  54380. Object to automatically generate errors.
  54381. 2
  54382.  
  54383. 2
  54384. raise(error) actually raises the error.
  54385. 2
  54386. 5
  54387. 4
  54388. 2
  54389. 0
  54390. 2141
  54391. 0
  54392. 743583960
  54393. 2
  54394. 1
  54395. #70
  54396. Site-Locks
  54397.  
  54398. 0
  54399. 38
  54400. -1
  54401. -1
  54402. -1
  54403. 46
  54404. -1
  54405. -1
  54406. 1
  54407. init_for_core
  54408. 38
  54409. 173
  54410. -1
  54411. 0
  54412. 18
  54413. 4
  54414. 0
  54415. 38
  54416. 5
  54417. 0
  54418. 743275670
  54419. 38
  54420. 1
  54421. 4
  54422. 0
  54423. 38
  54424. 0
  54425. 0
  54426. 1
  54427. 38
  54428. 5
  54429. 2
  54430. %n (%#) can't send to moderated list %t (%[#t]) directly.
  54431. 38
  54432. 5
  54433. 4
  54434. 0
  54435. 38
  54436. 5
  54437. 4
  54438. 0
  54439. 38
  54440. 5
  54441. 4
  54442. 1
  54443. 1
  54444. 2
  54445. 38
  54446. 1
  54447. 4
  54448. 2
  54449. 1
  54450. 2
  54451. 1
  54452. 70
  54453. 38
  54454. 1
  54455. 0
  54456. 2592000
  54457. 38
  54458. 5
  54459. 0
  54460. 0
  54461. 38
  54462. 1
  54463. 4
  54464. 0
  54465. 38
  54466. 0
  54467. 5
  54468. 38
  54469. 5
  54470. 5
  54471. 38
  54472. 5
  54473. 5
  54474. 38
  54475. 4
  54476. 4
  54477. 1
  54478. 2
  54479. Site-Locks
  54480. 38
  54481. 1
  54482. 2
  54483. Notes on annoying sites.
  54484. 38
  54485. 5
  54486. 4
  54487. 2
  54488. 0
  54489. 53720
  54490. 0
  54491. 743971475
  54492. 2
  54493. 1
  54494. #71
  54495. housekeeper
  54496.  
  54497. 19
  54498. 38
  54499. -1
  54500. -1
  54501. -1
  54502. 59
  54503. -1
  54504. 337
  54505. 20
  54506. look_self
  54507. 38
  54508. 173
  54509. -1
  54510. cleanup
  54511. 38
  54512. 165
  54513. -1
  54514. replace
  54515. 38
  54516. 173
  54517. -1
  54518. cleanup_list
  54519. 38
  54520. 21
  54521. -1
  54522. add_cleanup
  54523. 38
  54524. 93
  54525. -2
  54526. remove_cleanup
  54527. 38
  54528. 29
  54529. -1
  54530. controls
  54531. 38
  54532. 173
  54533. -1
  54534. continuous
  54535. 38
  54536. 165
  54537. -1
  54538. litterbug
  54539. 38
  54540. 173
  54541. -1
  54542. is_watching
  54543. 38
  54544. 173
  54545. -1
  54546. send_home
  54547. 38
  54548. 173
  54549. -1
  54550. moveit
  54551. 2
  54552. 173
  54553. -1
  54554. ejectit
  54555. 2
  54556. 173
  54557. -1
  54558. is_object_cleaned
  54559. 38
  54560. 173
  54561. -1
  54562. is_litter
  54563. 38
  54564. 173
  54565. -1
  54566. init_for_core
  54567. 2
  54568. 173
  54569. -1
  54570. clean_status
  54571. 38
  54572. 173
  54573. -1
  54574. is_cleaning
  54575. 38
  54576. 173
  54577. -1
  54578. time
  54579. 38
  54580. 173
  54581. -1
  54582. accept
  54583. 2
  54584. 173
  54585. -1
  54586. 11
  54587. recycle_bins
  54588. owners
  54589. cleaning
  54590. litter
  54591. eschews
  54592. public_places
  54593. task
  54594. requestors
  54595. destination
  54596. clean
  54597. testing
  54598. 72
  54599. 4
  54600. 0
  54601. 38
  54602. 5
  54603. 4
  54604. 1
  54605. 1
  54606. 2
  54607. 38
  54608. 5
  54609. 1
  54610. -1
  54611. 38
  54612. 5
  54613. 4
  54614. 0
  54615. 38
  54616. 5
  54617. 4
  54618. 0
  54619. 38
  54620. 5
  54621. 4
  54622. 0
  54623. 38
  54624. 5
  54625. 0
  54626. 0
  54627. 38
  54628. 5
  54629. 4
  54630. 0
  54631. 38
  54632. 5
  54633. 4
  54634. 0
  54635. 38
  54636. 5
  54637. 4
  54638. 0
  54639. 38
  54640. 1
  54641. 0
  54642. 0
  54643. 38
  54644. 5
  54645. 4
  54646. 0
  54647. 38
  54648. 1
  54649. 5
  54650. 38
  54651. 5
  54652. 5
  54653. 38
  54654. 5
  54655. 2
  54656. here=player.location;me=player
  54657. 38
  54658. 5
  54659. 5
  54660. 38
  54661. 5
  54662. 4
  54663. 0
  54664. 38
  54665. 1
  54666. 4
  54667. 2
  54668. 0
  54669. 738047225
  54670. 2
  54671. nebula
  54672. 2
  54673. 0
  54674. 5
  54675. 38
  54676. 5
  54677. 5
  54678. 2
  54679. 0
  54680. 0
  54681. 743752891
  54682. 2
  54683. 1
  54684. 0
  54685. 0
  54686. 38
  54687. 5
  54688. 5
  54689. 38
  54690. 5
  54691. 5
  54692. 38
  54693. 1
  54694. 5
  54695. 38
  54696. 1
  54697. 5
  54698. 38
  54699. 0
  54700. 5
  54701. 38
  54702. 1
  54703. 0
  54704. 276800495
  54705. 38
  54706. 5
  54707. 4
  54708. 1
  54709. 1
  54710. 36830
  54711. 2
  54712. 1
  54713. 0
  54714. -80
  54715. 38
  54716. 1
  54717. 1
  54718. 36830
  54719. 38
  54720. 4
  54721. 5
  54722. 2
  54723. 0
  54724. 5
  54725. 2
  54726. 0
  54727. 5
  54728. 38
  54729. 5
  54730. 4
  54731. 0
  54732. 38
  54733. 4
  54734. 5
  54735. 38
  54736. 5
  54737. 4
  54738. 0
  54739. 38
  54740. 4
  54741. 0
  54742. 0
  54743. 38
  54744. 4
  54745. 2
  54746. The housekeeper is too busy putting away all of the junk all over LambdaMoo that there isn't time to listen to pages and stuff like that so your page isn't listened to, too bad.
  54747. 38
  54748. 5
  54749. 2
  54750. the housekeeper's
  54751. 38
  54752. 5
  54753. 2
  54754. The housekeeper's
  54755. 38
  54756. 5
  54757. 5
  54758. 38
  54759. 5
  54760. 5
  54761. 38
  54762. 5
  54763. 5
  54764. 38
  54765. 5
  54766. 4
  54767. 2
  54768. 1
  54769. 122
  54770. 1
  54771. 9082
  54772. 38
  54773. 5
  54774. 5
  54775. 38
  54776. 5
  54777. 4
  54778. 0
  54779. 38
  54780. 5
  54781. 4
  54782. 2
  54783. 0
  54784. 2
  54785. 0
  54786. 0
  54787. 38
  54788. 4
  54789. 5
  54790. 38
  54791. 4
  54792. 0
  54793. 750802956
  54794. 2
  54795. 1
  54796. 0
  54797. 21
  54798. 2
  54799. 0
  54800. 5
  54801. 38
  54802. 5
  54803. 2
  54804. 'Self
  54805. 38
  54806. 5
  54807. 2
  54808. The housekeeper's
  54809. 38
  54810. 5
  54811. 2
  54812. The housekeeper
  54813. 38
  54814. 5
  54815. 2
  54816. The housekeeper
  54817. 38
  54818. 5
  54819. 2
  54820. 'self
  54821. 38
  54822. 5
  54823. 2
  54824. the housekeeper's
  54825. 38
  54826. 5
  54827. 2
  54828. the housekeeper
  54829. 38
  54830. 5
  54831. 2
  54832. the housekeeper
  54833. 38
  54834. 5
  54835. 1
  54836. 11
  54837. 38
  54838. 5
  54839. 0
  54840. 0
  54841. 2
  54842. 0
  54843. 5
  54844. 38
  54845. 5
  54846. 0
  54847. 0
  54848. 38
  54849. 5
  54850. 5
  54851. 38
  54852. 5
  54853. 5
  54854. 38
  54855. 5
  54856. 5
  54857. 38
  54858. 5
  54859. 0
  54860. 0
  54861. 2
  54862. 1
  54863. 5
  54864. 38
  54865. 4
  54866. 4
  54867. 1
  54868. 2
  54869. housekeeper
  54870. 2
  54871. 1
  54872. 2
  54873. A very clean, neat, tidy person who doesn't mind lugging players and their gear all over the place.
  54874. 38
  54875. 5
  54876. 4
  54877. 2
  54878. 0
  54879. 24419
  54880. 0
  54881. 742890613
  54882. 2
  54883. 1
  54884. #72
  54885. Network Utilities
  54886.  
  54887. 16
  54888. 2
  54889. -1
  54890. -1
  54891. -1
  54892. 1
  54893. -1
  54894. 75
  54895. 10
  54896. parse_address
  54897. 2
  54898. 173
  54899. -1
  54900. local_domain
  54901. 2
  54902. 173
  54903. -1
  54904. open
  54905. 2
  54906. 165
  54907. -1
  54908. close
  54909. 2
  54910. 165
  54911. -1
  54912. sendmail
  54913. 2
  54914. 29
  54915. -1
  54916. trust
  54917. 2
  54918. 173
  54919. -1
  54920. init_for_core
  54921. 2
  54922. 173
  54923. -1
  54924. raw_sendmail
  54925. 2
  54926. 21
  54927. -1
  54928. invalid_email_address
  54929. 2
  54930. 173
  54931. -1
  54932. invalid_hostname
  54933. 2
  54934. 173
  54935. -1
  54936. 15
  54937. site
  54938. large_domains
  54939. open_connections
  54940. connect_connections_to
  54941. postmaster
  54942. port
  54943. MOO_name
  54944. valid_host_regexp
  54945. maildrop
  54946. trusts
  54947. reply_address
  54948. active
  54949. valid_email_regexp
  54950. invalid_userids
  54951. debugging
  54952. 19
  54953. 2
  54954. yoursite
  54955. 2
  54956. 1
  54957. 4
  54958. 0
  54959. 2
  54960. 1
  54961. 4
  54962. 0
  54963. 2
  54964. 1
  54965. 4
  54966. 0
  54967. 2
  54968. 0
  54969. 2
  54970. postmastername@yourhost
  54971. 2
  54972. 5
  54973. 0
  54974. 7777
  54975. 2
  54976. 5
  54977. 2
  54978. YourMOO
  54979. 2
  54980. 5
  54981. 2
  54982. ^%([-a-z0-9]+%.%)+%(gov%|edu%|com%|org%|int%|mil%|net%|%nato%|arpa%|[a-z][a-z]%)$
  54983. 2
  54984. 5
  54985. 2
  54986. localhost
  54987. 2
  54988. 5
  54989. 4
  54990. 0
  54991. 2
  54992. 1
  54993. 2
  54994. moomailreplyto@yourhost
  54995. 2
  54996. 5
  54997. 0
  54998. 0
  54999. 2
  55000. 5
  55001. 2
  55002. ^[-a-z0-9_!.]+$
  55003. 2
  55004. 5
  55005. 4
  55006. 7
  55007. 2
  55008.  
  55009. 2
  55010. sysadmin
  55011. 2
  55012. root
  55013. 2
  55014. postmaster
  55015. 2
  55016. system
  55017. 2
  55018. operator
  55019. 2
  55020. bin
  55021. 2
  55022. 5
  55023. 0
  55024. 0
  55025. 2
  55026. 5
  55027. 0
  55028. 0
  55029. 2
  55030. 4
  55031. 4
  55032. 1
  55033. 2
  55034. Network Utilities
  55035. 2
  55036. 5
  55037. 4
  55038. 73
  55039. 2
  55040. Utilities for dealing with network connections
  55041. 2
  55042. ---------------
  55043. 2
  55044. Creating & tracking hosts:
  55045. 2
  55046.  
  55047. 2
  55048. :open(host, port [, connect-connection-to]) => {connection, object}
  55049. 2
  55050.     open a network connection (using open_network_connection), optionally
  55051. 2
  55052.     allows for it to be connected to another object.
  55053. 2
  55054.     (see #0:do_login_command for details).
  55055. 2
  55056.  
  55057. 2
  55058. :close(connection)
  55059. 2
  55060.      closes the connection & cleans up data
  55061. 2
  55062.  
  55063. 2
  55064. ------------------
  55065. 2
  55066. Parsing network things:
  55067. 2
  55068.  
  55069. 2
  55070. :invalid_email_address(email)
  55071. 2
  55072.      return "" or string saying why 'email' is invalid.
  55073. 2
  55074.      uses .valid_email_regexp
  55075. 2
  55076.  
  55077. 2
  55078. :invalid_hostname(host)
  55079. 2
  55080.      return "" or string saying why 'host' doesn't look
  55081. 2
  55082.      like a valid internet host name
  55083. 2
  55084.  
  55085. 2
  55086. :local_domain(host)
  55087. 2
  55088.      returns the 'important' part of a host name, e.g.
  55089. 2
  55090.      golden.parc.xerox.com => parc.xerox.com
  55091. 2
  55092.  
  55093. 2
  55094. -------------------
  55095. 2
  55096. Sending mail
  55097. 2
  55098.  
  55099. 2
  55100. :sendmail(to, subject, @lines)
  55101. 2
  55102.      send mail to the email address 'to' with indicated subject.
  55103. 2
  55104.      header fields like 'from', 'date', etc. are filled in.
  55105. 2
  55106.      lines can start with additional header lines.
  55107. 2
  55108.  
  55109. 2
  55110. :raw_sendmail(to, @lines)
  55111. 2
  55112.      used by :sendmail. Send mail to given user at host, just
  55113. 2
  55114.      as specified, no error checking.
  55115. 2
  55116.  
  55117. 2
  55118. ================================================================
  55119. 2
  55120. Parameters:
  55121. 2
  55122.  
  55123. 2
  55124. .active If 0, disabled sending of mail.
  55125. 2
  55126.  
  55127. 2
  55128. .site   Where does this MOO run?
  55129. 2
  55130.         (Maybe MOOnet will use it later).
  55131. 2
  55132.  
  55133. 2
  55134. .port   The network port this MOO listens on.
  55135. 2
  55136.  
  55137. 2
  55138. .large_domains 
  55139. 2
  55140.         A list of sites where more than 2 levels of host name are
  55141. 2
  55142.         significant, e.g., if you want 'parc.xerox.com' to be
  55143. 2
  55144.         different than 'cinops.xerox.com', put "xerox.com" as an
  55145. 2
  55146.         element in .large_domains.
  55147. 2
  55148.  
  55149. 2
  55150. .postmaster
  55151. 2
  55152.         Email address to which problems with MOO mail should
  55153. 2
  55154.         go. This should be a real email address that someone reads.
  55155. 2
  55156.  
  55157. 2
  55158. .maildrop
  55159. 2
  55160.         Hostname to connect to for dropping off mail. Usually can
  55161. 2
  55162.         just be "localhost".
  55163. 2
  55164.  
  55165. 2
  55166. .reply_address
  55167. 2
  55168.         If a MOO character sends email, where does a reply go?
  55169. 2
  55170.         Inserted in 'From:' for mail from characters without
  55171. 2
  55172.         registration addresses.        
  55173. 2
  55174.  
  55175. 2
  55176. .trusts
  55177. 2
  55178.         List of (non-wizard) programmers who can call
  55179. 2
  55180.         :open, :sendmail, :close
  55181. 2
  55182.  
  55183. 2
  55184.                 
  55185. 2
  55186. 5
  55187. 4
  55188. 2
  55189. 0
  55190. 11856
  55191. 0
  55192. 742893463
  55193. 2
  55194. 1
  55195. #73
  55196. Generic BigList Resident
  55197.  
  55198. 144
  55199. 38
  55200. -1
  55201. -1
  55202. -1
  55203. 1
  55204. -1
  55205. 22
  55206. 6
  55207. _make
  55208. 2
  55209. 173
  55210. -1
  55211. _kill
  55212. 2
  55213. 173
  55214. -1
  55215. _get
  55216. 38
  55217. 173
  55218. -1
  55219. _put
  55220. 38
  55221. 173
  55222. -1
  55223. _genprop
  55224. 38
  55225. 173
  55226. -1
  55227. _ord
  55228. 38
  55229. 173
  55230. -1
  55231. 3
  55232. _genprop
  55233. mowner
  55234. _mgr
  55235. 7
  55236. 2
  55237.  
  55238. 38
  55239. 5
  55240. 1
  55241. 4292
  55242. 38
  55243. 5
  55244. 1
  55245. 5533
  55246. 38
  55247. 5
  55248. 5
  55249. 38
  55250. 4
  55251. 4
  55252. 3
  55253. 2
  55254. biglist
  55255. 2
  55256. resident
  55257. 2
  55258. gblr
  55259. 38
  55260. 5
  55261. 4
  55262. 1
  55263. 2
  55264. This is the object you want to use as a parent in order to @create a place for your biglists to live.  Suitably sick souls may wish to reimplement :_genprop and :_kill to reclaim unused properties (this :_kill just throws them away and this :_genprop just relentlessly advances....  who cares).  Anyway, you'll need to look at $biglist before this will make sense.
  55265. 38
  55266. 5
  55267. 4
  55268. 2
  55269. 0
  55270. 2160
  55271. 0
  55272. 743667453
  55273. 2
  55274. 1
  55275. #74
  55276. Generic Feature Object
  55277.  
  55278. 144
  55279. 38
  55280. -1
  55281. -1
  55282. -1
  55283. 5
  55284. -1
  55285. 165
  55286. 8
  55287. help_msg
  55288. 38
  55289. 173
  55290. -1
  55291. look_self
  55292. 38
  55293. 173
  55294. -1
  55295. using this
  55296. 38
  55297. 173
  55298. -1
  55299. examine_commands_ok
  55300. 2
  55301. 173
  55302. -1
  55303. set_feature_ok
  55304. 38
  55305. 165
  55306. -1
  55307. hidden_verbs
  55308. 38
  55309. 173
  55310. -1
  55311. set_feature_verbs
  55312. 38
  55313. 165
  55314. -1
  55315. initialize
  55316. 38
  55317. 165
  55318. -1
  55319. 4
  55320. warehouse
  55321. help_msg
  55322. feature_verbs
  55323. feature_ok
  55324. 16
  55325. 1
  55326. 24300
  55327. 38
  55328. 1
  55329. 2
  55330. The Generic Feature Object--not to be used as a feature object.
  55331. 38
  55332. 5
  55333. 4
  55334. 1
  55335. 2
  55336. Using
  55337. 38
  55338. 1
  55339. 0
  55340. 1
  55341. 38
  55342. 1
  55343. 5
  55344. 38
  55345. 5
  55346. 5
  55347. 38
  55348. 5
  55349. 5
  55350. 38
  55351. 5
  55352. 5
  55353. 38
  55354. 5
  55355. 5
  55356. 38
  55357. 5
  55358. 5
  55359. 38
  55360. 5
  55361. 5
  55362. 38
  55363. 5
  55364. 5
  55365. 38
  55366. 5
  55367. 5
  55368. 38
  55369. 4
  55370. 4
  55371. 4
  55372. 2
  55373. Generic Feature Object
  55374. 2
  55375. Generic .Features_Huh Object
  55376. 2
  55377. Feature Object
  55378. 2
  55379. .Features_Huh Object
  55380. 38
  55381. 5
  55382. 2
  55383. This is the Generic Feature Object.  It is not meant to be used as a feature object itself, but is handy for making new feature objects.
  55384. 38
  55385. 5
  55386. 4
  55387. 2
  55388. 0
  55389. 4335
  55390. 0
  55391. 743625606
  55392. 2
  55393. 1
  55394. #75
  55395. Gopher utilities
  55396.  
  55397. 16
  55398. 2
  55399. -1
  55400. -1
  55401. -1
  55402. 1
  55403. -1
  55404. 34
  55405. 17
  55406. get_now
  55407. 2
  55408. 165
  55409. -1
  55410. parse
  55411. 2
  55412. 173
  55413. -1
  55414. show_text
  55415. 2
  55416. 165
  55417. -1
  55418. type
  55419. 2
  55420. 173
  55421. -1
  55422. summary
  55423. 2
  55424. 173
  55425. -1
  55426. get
  55427. 2
  55428. 173
  55429. -1
  55430. clear_cache
  55431. 2
  55432. 173
  55433. -1
  55434. unparse
  55435. 2
  55436. 173
  55437. -1
  55438. interpret_error
  55439. 2
  55440. 173
  55441. -1
  55442. trusted
  55443. 2
  55444. 173
  55445. -1
  55446. _textp
  55447. 2
  55448. 173
  55449. -1
  55450. _mail_text
  55451. 2
  55452. 173
  55453. -1
  55454. init_for_core
  55455. 2
  55456. 173
  55457. -1
  55458. display_cache
  55459. 2
  55460. 45
  55461. -1
  55462. get_cache
  55463. 2
  55464. 173
  55465. -1
  55466. cache_entry
  55467. 2
  55468. 173
  55469. -1
  55470. help_msg
  55471. 2
  55472. 173
  55473. -1
  55474. 5
  55475. cache_requests
  55476. cache_times
  55477. cache_values
  55478. limit
  55479. cache_timeout
  55480. 9
  55481. 4
  55482. 0
  55483. 2
  55484. 1
  55485. 4
  55486. 0
  55487. 2
  55488. 1
  55489. 4
  55490. 0
  55491. 2
  55492. 1
  55493. 0
  55494. 2000
  55495. 2
  55496. 5
  55497. 0
  55498. 900
  55499. 2
  55500. 1
  55501. 0
  55502. 0
  55503. 2
  55504. 4
  55505. 4
  55506. 1
  55507. 2
  55508. Gopher utilities
  55509. 2
  55510. 5
  55511. 4
  55512. 30
  55513. 2
  55514. An interface to Gopher internet services.
  55515. 2
  55516. Copyright (c) 1992,1993 Grump,JoeFeedback@LambdaMOO.
  55517. 2
  55518.  
  55519. 2
  55520. This object contains just the raw verbs for getting data from gopher servers and parsing the results. Look at #50122 (Generic Gopher Slate) for one example of a user interface. 
  55521. 2
  55522.  
  55523. 2
  55524. :get(site, port, selection)
  55525. 2
  55526.   Get data from gopher server: returns a list of strings, or an error if it couldn't connect. Results are cached.
  55527. 2
  55528.  
  55529. 2
  55530. :get_now(site, port, selection)
  55531. 2
  55532.   Used by $gopher:get. Arguments are the same: this actually gets the 
  55533. 2
  55534.   data without checking the cache. (Don't call this, since the
  55535. 2
  55536.   caching is important to reduce lag.)
  55537. 2
  55538.   
  55539. 2
  55540. :show_text(who, start, end, site, port, selection)
  55541. 2
  55542.   Requires wiz-perms to call.
  55543. 2
  55544.   like who:notify_lines($gopher:get(..node..)[start..end])
  55545. 2
  55546.  
  55547. 2
  55548. :clear_cache()
  55549. 2
  55550.   Erase the gopher cache.
  55551. 2
  55552.  
  55553. 2
  55554. :parse(string)
  55555. 2
  55556.   Takes a directory line as returned by $gopher:get, and return a list
  55557. 2
  55558.   {host, port, selector, label}
  55559. 2
  55560.    host, port, and selector are what you send to :get.
  55561. 2
  55562.   label is a string, where the first character is the type code.
  55563. 2
  55564.  
  55565. 2
  55566. :type(char)
  55567. 2
  55568.    returns the name of the gopher type indicated by the character, e.g.
  55569. 2
  55570.    $gopher:type("I") => "image"
  55571. 2
  55572.  
  55573. 2
  55574. 5
  55575. 4
  55576. 2
  55577. 0
  55578. 77150
  55579. 0
  55580. 743926430
  55581. 2
  55582. 1
  55583. #76
  55584. Generic Gendered Object
  55585.  
  55586. 144
  55587. 2
  55588. -1
  55589. -1
  55590. -1
  55591. 1
  55592. 37
  55593. 35
  55594. 2
  55595. set_gender
  55596. 2
  55597. 173
  55598. -1
  55599. @gen*der
  55600. 2
  55601. 105
  55602. 12
  55603. 11
  55604. gender
  55605. pqc
  55606. pq
  55607. ppc
  55608. pp
  55609. prc
  55610. pr
  55611. poc
  55612. po
  55613. psc
  55614. ps
  55615. 15
  55616. 2
  55617. neuter
  55618. 2
  55619. 5
  55620. 2
  55621. its
  55622. 2
  55623. 5
  55624. 2
  55625. its
  55626. 2
  55627. 5
  55628. 2
  55629. Its
  55630. 2
  55631. 5
  55632. 2
  55633. its
  55634. 2
  55635. 5
  55636. 2
  55637. Itself
  55638. 2
  55639. 5
  55640. 2
  55641. itself
  55642. 2
  55643. 5
  55644. 2
  55645. It
  55646. 2
  55647. 5
  55648. 2
  55649. it
  55650. 2
  55651. 5
  55652. 2
  55653. It
  55654. 2
  55655. 5
  55656. 2
  55657. it
  55658. 2
  55659. 5
  55660. 0
  55661. 0
  55662. 2
  55663. 4
  55664. 4
  55665. 1
  55666. 2
  55667. Generic Gendered Object
  55668. 2
  55669. 5
  55670. 5
  55671. 2
  55672. 5
  55673. 4
  55674. 2
  55675. 0
  55676. 2160
  55677. 0
  55678. 743668955
  55679. 2
  55680. 1
  55681. #77
  55682. The_Demolished_Man
  55683.  
  55684. 7
  55685. 77
  55686. 109
  55687. 167
  55688. -1
  55689. 58
  55690. -1
  55691. 154
  55692. 1
  55693. who_all
  55694. 77
  55695. 9
  55696. -1
  55697. 0
  55698. 69
  55699. 5
  55700. 77
  55701. 5
  55702. 5
  55703. 77
  55704. 5
  55705. 5
  55706. 77
  55707. 5
  55708. 5
  55709. 77
  55710. 5
  55711. 5
  55712. 77
  55713. 5
  55714. 5
  55715. 77
  55716. 5
  55717. 5
  55718. 77
  55719. 5
  55720. 5
  55721. 77
  55722. 4
  55723. 5
  55724. 38
  55725. 1
  55726. 5
  55727. 77
  55728. 5
  55729. 5
  55730. 77
  55731. 5
  55732. 5
  55733. 77
  55734. 5
  55735. 5
  55736. 77
  55737. 5
  55738. 5
  55739. 38
  55740. 1
  55741. 4
  55742. 2
  55743. 0
  55744. -1463919987
  55745. 2
  55746. bill_enright@Red_Cloud.Orion
  55747. 2
  55748. 0
  55749. 5
  55750. 77
  55751. 5
  55752. 2
  55753. ORION
  55754. 2
  55755. 0
  55756. 0
  55757. -1463835347
  55758. 2
  55759. 1
  55760. 0
  55761. 0
  55762. 77
  55763. 5
  55764. 5
  55765. 77
  55766. 5
  55767. 5
  55768. 38
  55769. 1
  55770. 5
  55771. 38
  55772. 1
  55773. 5
  55774. 38
  55775. 0
  55776. 5
  55777. 38
  55778. 1
  55779. 0
  55780. 12434
  55781. 77
  55782. 5
  55783. 4
  55784. 13
  55785. 1
  55786. 77
  55787. 1
  55788. 157
  55789. 1
  55790. 155
  55791. 1
  55792. 166
  55793. 1
  55794. 167
  55795. 1
  55796. 327
  55797. 1
  55798. 329
  55799. 1
  55800. 334
  55801. 1
  55802. 335
  55803. 1
  55804. 339
  55805. 1
  55806. 338
  55807. 1
  55808. 340
  55809. 1
  55810. 341
  55811. 2
  55812. 1
  55813. 5
  55814. 38
  55815. 1
  55816. 1
  55817. 77
  55818. 77
  55819. 4
  55820. 4
  55821. 6
  55822. 2
  55823. bill_enright@Red_Cloud.Orion
  55824. 2
  55825. Bill_Enright@Black_Buffalo_Woman.E.T._Phone_Home
  55826. 2
  55827. Bill_Enright@Black_Buffalo_Woman.Orion
  55828. 2
  55829. bill_enright@Mr._Coffee.Orion
  55830. 2
  55831. Home'
  55832. 2
  55833. 'Orion'
  55834. 2
  55835. 0
  55836. 2
  55837. bill_enright@Red_Cloud.Orion
  55838. 2
  55839. 0
  55840. 5
  55841. 77
  55842. 5
  55843. 4
  55844. 0
  55845. 77
  55846. 4
  55847. 5
  55848. 77
  55849. 5
  55850. 5
  55851. 77
  55852. 4
  55853. 5
  55854. 77
  55855. 4
  55856. 5
  55857. 77
  55858. 5
  55859. 2
  55860. ours
  55861. 77
  55862. 5
  55863. 2
  55864. Ours
  55865. 77
  55866. 5
  55867. 5
  55868. 77
  55869. 5
  55870. 5
  55871. 77
  55872. 5
  55873. 5
  55874. 77
  55875. 5
  55876. 5
  55877. 77
  55878. 5
  55879. 5
  55880. 77
  55881. 5
  55882. 5
  55883. 77
  55884. 5
  55885. 4
  55886. 2
  55887. 0
  55888. 2
  55889. 0
  55890. 0
  55891. 77
  55892. 4
  55893. 4
  55894. 0
  55895. 77
  55896. 4
  55897. 0
  55898. 750802956
  55899. 2
  55900. 1
  55901. 0
  55902. 15
  55903. 2
  55904. 0
  55905. 2
  55906. royal
  55907. 77
  55908. 5
  55909. 2
  55910. Ourselves
  55911. 77
  55912. 5
  55913. 2
  55914. Our
  55915. 77
  55916. 5
  55917. 2
  55918. Us
  55919. 77
  55920. 5
  55921. 2
  55922. We
  55923. 77
  55924. 5
  55925. 2
  55926. ourselves
  55927. 77
  55928. 5
  55929. 2
  55930. our
  55931. 77
  55932. 5
  55933. 2
  55934. us
  55935. 77
  55936. 5
  55937. 2
  55938. we
  55939. 77
  55940. 5
  55941. 1
  55942. 109
  55943. 77
  55944. 5
  55945. 0
  55946. 0
  55947. 2
  55948. 0
  55949. 5
  55950. 77
  55951. 5
  55952. 5
  55953. 77
  55954. 5
  55955. 5
  55956. 77
  55957. 5
  55958. 5
  55959. 77
  55960. 5
  55961. 5
  55962. 77
  55963. 5
  55964. 0
  55965. -1465213579
  55966. 2
  55967. 1
  55968. 0
  55969. 0
  55970. 77
  55971. 4
  55972. 4
  55973. 6
  55974. 2
  55975. The_Demolished_Man
  55976. 2
  55977. demolish
  55978. 2
  55979. demolished
  55980. 2
  55981. man
  55982. 2
  55983. the_
  55984. 2
  55985. Bill_Enright
  55986. 2
  55987. 1
  55988. 4
  55989. 2
  55990. 2
  55991. Appears to be in a caffeine-induced trance.  He wears a grey,
  55992. 2
  55993. coffee-stained t-shirt that proclaims: APPLE RECYCLES EMPLOYEES.
  55994. 77
  55995. 5
  55996. 4
  55997. 2
  55998. 0
  55999. 0
  56000. 0
  56001. 0
  56002. 2
  56003. 1
  56004. #78
  56005. north
  56006.  
  56007. 0
  56008. 2
  56009. -1
  56010. -1
  56011. -1
  56012. 7
  56013. -1
  56014. 159
  56015. 0
  56016. 0
  56017. 13
  56018. 5
  56019. 2
  56020. 5
  56021. 1
  56022. 156
  56023. 2
  56024. 5
  56025. 1
  56026. 106
  56027. 2
  56028. 5
  56029. 5
  56030. 2
  56031. 5
  56032. 5
  56033. 2
  56034. 5
  56035. 5
  56036. 2
  56037. 5
  56038. 5
  56039. 2
  56040. 5
  56041. 5
  56042. 2
  56043. 5
  56044. 5
  56045. 2
  56046. 5
  56047. 0
  56048. 0
  56049. 2
  56050. 4
  56051. 4
  56052. 2
  56053. 2
  56054. north
  56055. 2
  56056. n
  56057. 2
  56058. 5
  56059. 5
  56060. 2
  56061. 5
  56062. 4
  56063. 2
  56064. 0
  56065. 0
  56066. 0
  56067. 0
  56068. 2
  56069. 1
  56070. #79
  56071. Dead_Meat
  56072.  
  56073. 3
  56074. 79
  56075. 140
  56076. -1
  56077. -1
  56078. 59
  56079. -1
  56080. -1
  56081. 0
  56082. 0
  56083. 61
  56084. 5
  56085. 38
  56086. 1
  56087. 5
  56088. 79
  56089. 5
  56090. 5
  56091. 79
  56092. 5
  56093. 5
  56094. 79
  56095. 5
  56096. 5
  56097. 79
  56098. 5
  56099. 5
  56100. 38
  56101. 1
  56102. 4
  56103. 2
  56104. 0
  56105. -1464450098
  56106. 2
  56107. Jeff_Morris@Mighty_Mouse.Orion
  56108. 2
  56109. 0
  56110. 5
  56111. 79
  56112. 5
  56113. 2
  56114. ORION
  56115. 2
  56116. 0
  56117. 0
  56118. -1464178110
  56119. 2
  56120. 1
  56121. 0
  56122. 0
  56123. 79
  56124. 5
  56125. 5
  56126. 79
  56127. 5
  56128. 5
  56129. 38
  56130. 1
  56131. 5
  56132. 38
  56133. 1
  56134. 5
  56135. 38
  56136. 0
  56137. 5
  56138. 38
  56139. 1
  56140. 5
  56141. 79
  56142. 5
  56143. 4
  56144. 1
  56145. 1
  56146. 79
  56147. 2
  56148. 1
  56149. 5
  56150. 38
  56151. 1
  56152. 1
  56153. 79
  56154. 79
  56155. 4
  56156. 4
  56157. 4
  56158. 2
  56159. Jeff_Morris@Mighty_Mouse.Orion
  56160. 2
  56161. @Mighty_Mouse.Orion
  56162. 2
  56163. Home'
  56164. 2
  56165. 'Orion'
  56166. 2
  56167. 0
  56168. 2
  56169. Jeff_Morris@Mighty_Mouse.Orion
  56170. 2
  56171. 0
  56172. 5
  56173. 79
  56174. 5
  56175. 4
  56176. 0
  56177. 79
  56178. 4
  56179. 5
  56180. 79
  56181. 5
  56182. 5
  56183. 79
  56184. 4
  56185. 5
  56186. 79
  56187. 4
  56188. 5
  56189. 79
  56190. 5
  56191. 5
  56192. 79
  56193. 5
  56194. 5
  56195. 79
  56196. 5
  56197. 5
  56198. 79
  56199. 5
  56200. 5
  56201. 79
  56202. 5
  56203. 5
  56204. 79
  56205. 5
  56206. 5
  56207. 79
  56208. 5
  56209. 5
  56210. 79
  56211. 5
  56212. 5
  56213. 79
  56214. 5
  56215. 4
  56216. 2
  56217. 0
  56218. 0
  56219. 0
  56220. 0
  56221. 79
  56222. 4
  56223. 4
  56224. 8
  56225. 4
  56226. 2
  56227. 0
  56228. 1
  56229. 4
  56230. 8
  56231. 0
  56232. -1465139213
  56233. 2
  56234. Wizard (#2)
  56235. 2
  56236. LiverSpot (#147), The_Demolished_Man (#77), and Dead_Meat (#79)
  56237. 2
  56238. Welcome to OrionMOO
  56239. 2
  56240.  
  56241. 2
  56242. feel free to look around, make new rooms, etc. We need somebody to build the
  56243. 2
  56244. kitchen, conference rooms, etc
  56245. 2
  56246. bob
  56247. 4
  56248. 2
  56249. 0
  56250. 2
  56251. 4
  56252. 9
  56253. 0
  56254. -1465041578
  56255. 2
  56256. Bob (#2)
  56257. 2
  56258. Mark (#154), The_Demolished_Man (#77), Dead_Meat (#79), and LiverSpot (#147)
  56259. 2
  56260. Moo maintence
  56261. 2
  56262.  
  56263. 2
  56264. Please explore the office, and let me know if there are any 'anomalies'.
  56265. 2
  56266. If you feel like hacking, log on as 'builder' password builder.
  56267. 2
  56268.  
  56269. 2
  56270. bob
  56271. 4
  56272. 2
  56273. 0
  56274. 3
  56275. 4
  56276. 9
  56277. 0
  56278. -1464639597
  56279. 2
  56280. Bob (#2)
  56281. 2
  56282. LiverSpot (#147), The_Demolished_Man (#77), Dead_Meat (#79), and Mark (#154)
  56283. 2
  56284. new @join verb
  56285. 2
  56286.  
  56287. 2
  56288. I added a @join verb that works like the LambdaMoo one to the generic player, so
  56289. 2
  56290. you should be able to use it. Let me know if it doesn't work.
  56291. 2
  56292.  
  56293. 2
  56294. b
  56295. 4
  56296. 2
  56297. 0
  56298. 4
  56299. 4
  56300. 9
  56301. 0
  56302. -1464633150
  56303. 2
  56304. Bob (#2)
  56305. 2
  56306. Mark (#154), The_Demolished_Man (#77), LiverSpot (#147), and Dead_Meat (#79)
  56307. 2
  56308. Passwords
  56309. 2
  56310.  
  56311. 2
  56312. I've waved my magic wand, and deleted all your passwords. The Crypt() function
  56313. 2
  56314. I wrote was broken, and messed up things. Please don't repassword yourselves
  56315. 2
  56316. until I restart the server.
  56317. 2
  56318. b
  56319. 4
  56320. 2
  56321. 0
  56322. 5
  56323. 4
  56324. 7
  56325. 0
  56326. -1464632431
  56327. 2
  56328. Bob (#2)
  56329. 2
  56330. The_Demolished_Man (#77), Mark (#154), LiverSpot (#147), and Dead_Meat (#79)
  56331. 2
  56332. passwords
  56333. 2
  56334.  
  56335. 2
  56336. The crypt function is working again. you can add passwords again
  56337. 2
  56338. b
  56339. 4
  56340. 2
  56341. 0
  56342. 6
  56343. 4
  56344. 10
  56345. 0
  56346. -1464610415
  56347. 2
  56348. Bob (#2)
  56349. 2
  56350. LiverSpot (#147), The_Demolished_Man (#77), Mark (#154), and Dead_Meat (#79)
  56351. 2
  56352. New way to log in
  56353. 2
  56354.  
  56355. 2
  56356. If you add an alias to your character that is equal to your PPC name, with spaces
  56357. 2
  56358. replaced with underbars (ie, "Bob Monsen" -> "Bob_Monsen"), you will automatically
  56359. 2
  56360. be logged in as yourself.
  56361. 2
  56362.  
  56363. 2
  56364. bob
  56365. 4
  56366. 2
  56367. 0
  56368. 7
  56369. 4
  56370. 7
  56371. 0
  56372. -1464531151
  56373. 2
  56374. Bob (#2)
  56375. 2
  56376. Mark (#154), LiverSpot (#147), The_Demolished_Man (#77), and Dead_Meat (#79)
  56377. 2
  56378. Bug found in the server
  56379. 2
  56380.  
  56381. 2
  56382. actually in my timer code... Its gonna be better now, I just know it!
  56383. 2
  56384. b
  56385. 4
  56386. 2
  56387. 0
  56388. 8
  56389. 4
  56390. 6
  56391. 0
  56392. -1464082045
  56393. 2
  56394. Bob (#2)
  56395. 2
  56396. *New-Prog-Log (#31) and Dead_Meat (#79)
  56397. 2
  56398. @programmer Dead_Meat (#79)
  56399. 2
  56400.  
  56401. 2
  56402. I just gave Dead_Meat a programmer bit.
  56403. 79
  56404. 4
  56405. 0
  56406. 750802956
  56407. 2
  56408. 1
  56409. 0
  56410. 27
  56411. 2
  56412. 0
  56413. 5
  56414. 79
  56415. 5
  56416. 5
  56417. 79
  56418. 5
  56419. 5
  56420. 79
  56421. 5
  56422. 5
  56423. 79
  56424. 5
  56425. 5
  56426. 79
  56427. 5
  56428. 5
  56429. 79
  56430. 5
  56431. 5
  56432. 79
  56433. 5
  56434. 5
  56435. 79
  56436. 5
  56437. 5
  56438. 79
  56439. 5
  56440. 1
  56441. 140
  56442. 79
  56443. 5
  56444. 0
  56445. 0
  56446. 2
  56447. 0
  56448. 5
  56449. 79
  56450. 5
  56451. 5
  56452. 79
  56453. 5
  56454. 5
  56455. 79
  56456. 5
  56457. 5
  56458. 79
  56459. 5
  56460. 5
  56461. 79
  56462. 5
  56463. 0
  56464. -1465143146
  56465. 2
  56466. 1
  56467. 0
  56468. 0
  56469. 79
  56470. 4
  56471. 4
  56472. 1
  56473. 2
  56474. Dead_Meat
  56475. 2
  56476. 1
  56477. 2
  56478. A putrid pile of meat, well past it;s expiration date.  There are flies milling about, and parts of Dead_Meat appear to be moving, but you're wary of looking closer...
  56479. 79
  56480. 5
  56481. 4
  56482. 2
  56483. 0
  56484. 0
  56485. 0
  56486. 0
  56487. 2
  56488. 1
  56489. #80
  56490. d
  56491.  
  56492. 0
  56493. 2
  56494. -1
  56495. -1
  56496. -1
  56497. 7
  56498. -1
  56499. 81
  56500. 0
  56501. 0
  56502. 13
  56503. 5
  56504. 2
  56505. 5
  56506. 1
  56507. 11
  56508. 2
  56509. 5
  56510. 1
  56511. 82
  56512. 2
  56513. 5
  56514. 5
  56515. 2
  56516. 5
  56517. 5
  56518. 2
  56519. 5
  56520. 5
  56521. 2
  56522. 5
  56523. 5
  56524. 2
  56525. 5
  56526. 5
  56527. 2
  56528. 5
  56529. 5
  56530. 2
  56531. 5
  56532. 0
  56533. 0
  56534. 2
  56535. 4
  56536. 4
  56537. 2
  56538. 2
  56539. d
  56540. 2
  56541. down
  56542. 2
  56543. 5
  56544. 5
  56545. 2
  56546. 5
  56547. 4
  56548. 2
  56549. 0
  56550. 0
  56551. 0
  56552. 0
  56553. 2
  56554. 1
  56555. #81
  56556. u
  56557.  
  56558. 0
  56559. 2
  56560. -1
  56561. -1
  56562. -1
  56563. 7
  56564. -1
  56565. 89
  56566. 0
  56567. 0
  56568. 13
  56569. 5
  56570. 2
  56571. 5
  56572. 1
  56573. 82
  56574. 2
  56575. 5
  56576. 1
  56577. 11
  56578. 2
  56579. 5
  56580. 5
  56581. 2
  56582. 5
  56583. 5
  56584. 2
  56585. 5
  56586. 5
  56587. 2
  56588. 5
  56589. 5
  56590. 2
  56591. 5
  56592. 5
  56593. 2
  56594. 5
  56595. 5
  56596. 2
  56597. 5
  56598. 0
  56599. 0
  56600. 2
  56601. 4
  56602. 4
  56603. 2
  56604. 2
  56605. u
  56606. 2
  56607. up
  56608. 2
  56609. 5
  56610. 5
  56611. 2
  56612. 5
  56613. 4
  56614. 2
  56615. 0
  56616. 0
  56617. 0
  56618. 0
  56619. 2
  56620. 1
  56621. #82
  56622. Bob's Cube
  56623.  
  56624. 0
  56625. 2
  56626. -1
  56627. 294
  56628. -1
  56629. 3
  56630. -1
  56631. 87
  56632. 0
  56633. 0
  56634. 17
  56635. 5
  56636. 2
  56637. 5
  56638. 5
  56639. 2
  56640. 5
  56641. 5
  56642. 2
  56643. 5
  56644. 5
  56645. 2
  56646. 5
  56647. 5
  56648. 2
  56649. 5
  56650. 5
  56651. 2
  56652. 5
  56653. 5
  56654. 2
  56655. 5
  56656. 4
  56657. 4
  56658. 1
  56659. 80
  56660. 1
  56661. 90
  56662. 1
  56663. 293
  56664. 1
  56665. 301
  56666. 2
  56667. 4
  56668. 1
  56669. -1
  56670. 2
  56671. 5
  56672. 0
  56673. 14647
  56674. 2
  56675. 5
  56676. 4
  56677. 4
  56678. 1
  56679. 81
  56680. 1
  56681. 89
  56682. 1
  56683. 169
  56684. 1
  56685. 292
  56686. 2
  56687. 4
  56688. 5
  56689. 2
  56690. 5
  56691. 5
  56692. 2
  56693. 5
  56694. 0
  56695. 0
  56696. 2
  56697. 4
  56698. 4
  56699. 1
  56700. 2
  56701. Bob's Cube
  56702. 2
  56703. 5
  56704. 2
  56705. There are computers everywhere, and papers and opened manuals are strewn on the desk. There is a window here.
  56706. 2
  56707. 5
  56708. 4
  56709. 2
  56710. 0
  56711. 0
  56712. 0
  56713. 0
  56714. 2
  56715. 1
  56716. #83
  56717. Guest
  56718.  
  56719. 1
  56720. 38
  56721. 17
  56722. -1
  56723. -1
  56724. 33
  56725. -1
  56726. 84
  56727. 0
  56728. 0
  56729. 60
  56730. 5
  56731. 38
  56732. 1
  56733. 4
  56734. 1
  56735. 2
  56736. By definition, guests appear nondescript.
  56737. 38
  56738. 1
  56739. 5
  56740. 2
  56741. 0
  56742. 5
  56743. 38
  56744. 5
  56745. 5
  56746. 38
  56747. 1
  56748. 4
  56749. 2
  56750. 0
  56751. 750802956
  56752. 2
  56753. Bob_Monsen@Hawksbill_Station.E.T._Phone_Home
  56754. 2
  56755. 0
  56756. 5
  56757. 38
  56758. 5
  56759. 5
  56760. 2
  56761. 0
  56762. 0
  56763. 750853387
  56764. 2
  56765. 1
  56766. 0
  56767. 0
  56768. 38
  56769. 5
  56770. 5
  56771. 38
  56772. 5
  56773. 5
  56774. 38
  56775. 1
  56776. 5
  56777. 38
  56778. 1
  56779. 5
  56780. 38
  56781. 0
  56782. 5
  56783. 38
  56784. 1
  56785. 5
  56786. 38
  56787. 5
  56788. 5
  56789. 2
  56790. 1
  56791. 5
  56792. 38
  56793. 1
  56794. 5
  56795. 38
  56796. 4
  56797. 4
  56798. 16
  56799. 2
  56800. foobar@apple.com
  56801. 2
  56802. Bob_Monsen@Hawksbill_Station.E.T._Phone_Home
  56803. 2
  56804. Guest@Sartre.Orion
  56805. 2
  56806. LocalUser@LocalMachine.LocalZone
  56807. 2
  56808. Guest@LiverSpot.E.T._Phone_Home
  56809. 2
  56810. Bob_Monsen@Sartre.Orion
  56811. 2
  56812. Guest@Spot.Orion
  56813. 2
  56814. uest@murdock.Orion
  56815. 2
  56816. uest@Spot.Orion
  56817. 2
  56818. uest@Dalmation.Orion
  56819. 2
  56820. @Hawksbill_Station.E.T._Phone_Home
  56821. 2
  56822. @Black_Buffalo_Woman.E.T._Phone_Home
  56823. 2
  56824. @Red_Cloud.Orion
  56825. 2
  56826. @Mighty_Mouse.Orion
  56827. 2
  56828. s_Macintosh.E.T._Phone_Home
  56829. 2
  56830. @Kant.Orion
  56831. 2
  56832. 0
  56833. 2
  56834. foobar@apple.com
  56835. 2
  56836. 0
  56837. 5
  56838. 38
  56839. 5
  56840. 4
  56841. 0
  56842. 38
  56843. 4
  56844. 5
  56845. 38
  56846. 5
  56847. 5
  56848. 38
  56849. 4
  56850. 5
  56851. 38
  56852. 4
  56853. 5
  56854. 38
  56855. 5
  56856. 2
  56857. its
  56858. 38
  56859. 5
  56860. 2
  56861. Its
  56862. 38
  56863. 5
  56864. 5
  56865. 38
  56866. 5
  56867. 5
  56868. 38
  56869. 5
  56870. 5
  56871. 38
  56872. 5
  56873. 5
  56874. 38
  56875. 5
  56876. 5
  56877. 38
  56878. 5
  56879. 5
  56880. 38
  56881. 5
  56882. 5
  56883. 38
  56884. 4
  56885. 5
  56886. 38
  56887. 4
  56888. 0
  56889. 750853071
  56890. 2
  56891. 1
  56892. 5
  56893. 2
  56894. 0
  56895. 2
  56896. neuter
  56897. 38
  56898. 5
  56899. 2
  56900. Itself
  56901. 38
  56902. 5
  56903. 2
  56904. Its
  56905. 38
  56906. 5
  56907. 2
  56908. It
  56909. 38
  56910. 5
  56911. 2
  56912. It
  56913. 38
  56914. 5
  56915. 2
  56916. itself
  56917. 38
  56918. 5
  56919. 2
  56920. its
  56921. 38
  56922. 5
  56923. 2
  56924. it
  56925. 38
  56926. 5
  56927. 2
  56928. it
  56929. 38
  56930. 5
  56931. 5
  56932. 38
  56933. 5
  56934. 0
  56935. 0
  56936. 2
  56937. 0
  56938. 5
  56939. 38
  56940. 5
  56941. 5
  56942. 38
  56943. 5
  56944. 5
  56945. 38
  56946. 5
  56947. 5
  56948. 38
  56949. 5
  56950. 5
  56951. 38
  56952. 5
  56953. 0
  56954. -1465203867
  56955. 2
  56956. 1
  56957. 0
  56958. 0
  56959. 38
  56960. 4
  56961. 4
  56962. 1
  56963. 2
  56964. Guest
  56965. 2
  56966. 1
  56967. 4
  56968. 1
  56969. 2
  56970. By definition, guests appear nondescript.
  56971. 38
  56972. 5
  56973. 4
  56974. 2
  56975. 0
  56976. 0
  56977. 0
  56978. 0
  56979. 2
  56980. 1
  56981. #84
  56982. Passionate_Guest
  56983.  
  56984. 1
  56985. 38
  56986. 17
  56987. -1
  56988. 83
  56989. 33
  56990. -1
  56991. 85
  56992. 0
  56993. 0
  56994. 60
  56995. 5
  56996. 38
  56997. 1
  56998. 4
  56999. 1
  57000. 2
  57001. By definition, guests appear nondescript.
  57002. 38
  57003. 1
  57004. 5
  57005. 2
  57006. 0
  57007. 5
  57008. 38
  57009. 5
  57010. 5
  57011. 38
  57012. 1
  57013. 4
  57014. 2
  57015. 0
  57016. 750802956
  57017. 2
  57018. Bob_Monsen@Sartre.Orion
  57019. 2
  57020. 0
  57021. 5
  57022. 38
  57023. 5
  57024. 5
  57025. 2
  57026. 0
  57027. 0
  57028. 750853349
  57029. 2
  57030. 1
  57031. 0
  57032. 0
  57033. 38
  57034. 5
  57035. 5
  57036. 38
  57037. 5
  57038. 5
  57039. 38
  57040. 1
  57041. 5
  57042. 38
  57043. 1
  57044. 5
  57045. 38
  57046. 0
  57047. 5
  57048. 38
  57049. 1
  57050. 5
  57051. 38
  57052. 5
  57053. 5
  57054. 2
  57055. 1
  57056. 5
  57057. 38
  57058. 1
  57059. 5
  57060. 38
  57061. 4
  57062. 4
  57063. 2
  57064. 2
  57065. foobar@apple.com
  57066. 2
  57067. Bob_Monsen@Sartre.Orion
  57068. 2
  57069. 0
  57070. 2
  57071. foobar@apple.com
  57072. 2
  57073. 0
  57074. 5
  57075. 38
  57076. 5
  57077. 4
  57078. 0
  57079. 38
  57080. 4
  57081. 5
  57082. 38
  57083. 5
  57084. 5
  57085. 38
  57086. 4
  57087. 5
  57088. 38
  57089. 4
  57090. 5
  57091. 38
  57092. 5
  57093. 2
  57094. its
  57095. 38
  57096. 5
  57097. 2
  57098. Its
  57099. 38
  57100. 5
  57101. 5
  57102. 38
  57103. 5
  57104. 5
  57105. 38
  57106. 5
  57107. 5
  57108. 38
  57109. 5
  57110. 5
  57111. 38
  57112. 5
  57113. 5
  57114. 38
  57115. 5
  57116. 5
  57117. 38
  57118. 5
  57119. 5
  57120. 38
  57121. 4
  57122. 5
  57123. 38
  57124. 4
  57125. 0
  57126. 750853123
  57127. 2
  57128. 1
  57129. 5
  57130. 2
  57131. 0
  57132. 2
  57133. neuter
  57134. 38
  57135. 5
  57136. 2
  57137. Itself
  57138. 38
  57139. 5
  57140. 2
  57141. Its
  57142. 38
  57143. 5
  57144. 2
  57145. It
  57146. 38
  57147. 5
  57148. 2
  57149. It
  57150. 38
  57151. 5
  57152. 2
  57153. itself
  57154. 38
  57155. 5
  57156. 2
  57157. its
  57158. 38
  57159. 5
  57160. 2
  57161. it
  57162. 38
  57163. 5
  57164. 2
  57165. it
  57166. 38
  57167. 5
  57168. 5
  57169. 38
  57170. 5
  57171. 0
  57172. 0
  57173. 2
  57174. 0
  57175. 5
  57176. 38
  57177. 5
  57178. 5
  57179. 38
  57180. 5
  57181. 5
  57182. 38
  57183. 5
  57184. 5
  57185. 38
  57186. 5
  57187. 5
  57188. 38
  57189. 5
  57190. 0
  57191. -1464634411
  57192. 2
  57193. 1
  57194. 0
  57195. 0
  57196. 38
  57197. 4
  57198. 4
  57199. 2
  57200. 2
  57201. Passionate_Guest
  57202. 2
  57203. Passionate
  57204. 2
  57205. 1
  57206. 4
  57207. 1
  57208. 2
  57209. By definition, guests appear nondescript.
  57210. 38
  57211. 5
  57212. 4
  57213. 2
  57214. 0
  57215. 0
  57216. 0
  57217. 0
  57218. 2
  57219. 1
  57220. #85
  57221. Ugly_Guest
  57222.  
  57223. 1
  57224. 38
  57225. 17
  57226. -1
  57227. 86
  57228. 33
  57229. -1
  57230. 86
  57231. 0
  57232. 0
  57233. 60
  57234. 5
  57235. 38
  57236. 1
  57237. 4
  57238. 1
  57239. 2
  57240. By definition, guests appear nondescript.
  57241. 38
  57242. 1
  57243. 5
  57244. 2
  57245. 0
  57246. 5
  57247. 38
  57248. 5
  57249. 5
  57250. 38
  57251. 1
  57252. 4
  57253. 2
  57254. 0
  57255. 750802956
  57256. 2
  57257. Bob_Monsen@Sartre.Orion
  57258. 2
  57259. 0
  57260. 5
  57261. 38
  57262. 5
  57263. 5
  57264. 2
  57265. 0
  57266. 0
  57267. 750853344
  57268. 2
  57269. 1
  57270. 0
  57271. 0
  57272. 38
  57273. 5
  57274. 5
  57275. 38
  57276. 5
  57277. 5
  57278. 38
  57279. 1
  57280. 5
  57281. 38
  57282. 1
  57283. 5
  57284. 38
  57285. 0
  57286. 5
  57287. 38
  57288. 1
  57289. 5
  57290. 38
  57291. 5
  57292. 5
  57293. 2
  57294. 1
  57295. 5
  57296. 38
  57297. 1
  57298. 5
  57299. 38
  57300. 4
  57301. 4
  57302. 2
  57303. 2
  57304. foobar@apple.com
  57305. 2
  57306. Bob_Monsen@Sartre.Orion
  57307. 2
  57308. 0
  57309. 2
  57310. foobar@apple.com
  57311. 2
  57312. 0
  57313. 5
  57314. 38
  57315. 5
  57316. 4
  57317. 0
  57318. 38
  57319. 4
  57320. 5
  57321. 38
  57322. 5
  57323. 5
  57324. 38
  57325. 4
  57326. 5
  57327. 38
  57328. 4
  57329. 5
  57330. 38
  57331. 5
  57332. 2
  57333. its
  57334. 38
  57335. 5
  57336. 2
  57337. Its
  57338. 38
  57339. 5
  57340. 5
  57341. 38
  57342. 5
  57343. 5
  57344. 38
  57345. 5
  57346. 5
  57347. 38
  57348. 5
  57349. 5
  57350. 38
  57351. 5
  57352. 5
  57353. 38
  57354. 5
  57355. 5
  57356. 38
  57357. 5
  57358. 5
  57359. 38
  57360. 4
  57361. 5
  57362. 38
  57363. 4
  57364. 0
  57365. 750853105
  57366. 2
  57367. 1
  57368. 5
  57369. 2
  57370. 0
  57371. 2
  57372. neuter
  57373. 38
  57374. 5
  57375. 2
  57376. Itself
  57377. 38
  57378. 5
  57379. 2
  57380. Its
  57381. 38
  57382. 5
  57383. 2
  57384. It
  57385. 38
  57386. 5
  57387. 2
  57388. It
  57389. 38
  57390. 5
  57391. 2
  57392. itself
  57393. 38
  57394. 5
  57395. 2
  57396. its
  57397. 38
  57398. 5
  57399. 2
  57400. it
  57401. 38
  57402. 5
  57403. 2
  57404. it
  57405. 38
  57406. 5
  57407. 5
  57408. 38
  57409. 5
  57410. 0
  57411. 0
  57412. 2
  57413. 0
  57414. 5
  57415. 38
  57416. 5
  57417. 5
  57418. 38
  57419. 5
  57420. 5
  57421. 38
  57422. 5
  57423. 5
  57424. 38
  57425. 5
  57426. 5
  57427. 38
  57428. 5
  57429. 0
  57430. -1463586565
  57431. 2
  57432. 1
  57433. 0
  57434. 0
  57435. 38
  57436. 4
  57437. 4
  57438. 2
  57439. 2
  57440. Ugly_Guest
  57441. 2
  57442. Ugly
  57443. 2
  57444. 1
  57445. 4
  57446. 1
  57447. 2
  57448. By definition, guests appear nondescript.
  57449. 38
  57450. 5
  57451. 4
  57452. 2
  57453. 0
  57454. 0
  57455. 0
  57456. 0
  57457. 2
  57458. 1
  57459. #86
  57460. Dusty_Guest
  57461.  
  57462. 1
  57463. 38
  57464. 17
  57465. -1
  57466. 84
  57467. 33
  57468. -1
  57469. -1
  57470. 0
  57471. 0
  57472. 60
  57473. 5
  57474. 38
  57475. 1
  57476. 4
  57477. 1
  57478. 2
  57479. By definition, guests appear nondescript.
  57480. 38
  57481. 1
  57482. 5
  57483. 2
  57484. 0
  57485. 5
  57486. 38
  57487. 5
  57488. 5
  57489. 38
  57490. 1
  57491. 4
  57492. 2
  57493. 0
  57494. 750802956
  57495. 2
  57496. Bob_Monsen@Sartre.Orion
  57497. 2
  57498. 0
  57499. 5
  57500. 38
  57501. 5
  57502. 5
  57503. 2
  57504. 0
  57505. 0
  57506. 750853346
  57507. 2
  57508. 1
  57509. 0
  57510. 0
  57511. 38
  57512. 5
  57513. 5
  57514. 38
  57515. 5
  57516. 5
  57517. 38
  57518. 1
  57519. 5
  57520. 38
  57521. 1
  57522. 5
  57523. 38
  57524. 0
  57525. 5
  57526. 38
  57527. 1
  57528. 5
  57529. 38
  57530. 5
  57531. 5
  57532. 2
  57533. 1
  57534. 5
  57535. 38
  57536. 1
  57537. 5
  57538. 38
  57539. 4
  57540. 4
  57541. 3
  57542. 2
  57543. foobar@apple.com
  57544. 2
  57545. Bob_Monsen@Sartre.Orion
  57546. 2
  57547. Bob_Monsen@Kant.Orion
  57548. 2
  57549. 0
  57550. 2
  57551. foobar@apple.com
  57552. 2
  57553. 0
  57554. 5
  57555. 38
  57556. 5
  57557. 4
  57558. 0
  57559. 38
  57560. 4
  57561. 5
  57562. 38
  57563. 5
  57564. 5
  57565. 38
  57566. 4
  57567. 5
  57568. 38
  57569. 4
  57570. 5
  57571. 38
  57572. 5
  57573. 2
  57574. its
  57575. 38
  57576. 5
  57577. 2
  57578. Its
  57579. 38
  57580. 5
  57581. 5
  57582. 38
  57583. 5
  57584. 5
  57585. 38
  57586. 5
  57587. 5
  57588. 38
  57589. 5
  57590. 5
  57591. 38
  57592. 5
  57593. 5
  57594. 38
  57595. 5
  57596. 5
  57597. 38
  57598. 5
  57599. 5
  57600. 38
  57601. 4
  57602. 5
  57603. 38
  57604. 4
  57605. 0
  57606. 750853113
  57607. 2
  57608. 1
  57609. 5
  57610. 2
  57611. 0
  57612. 2
  57613. neuter
  57614. 38
  57615. 5
  57616. 2
  57617. Itself
  57618. 38
  57619. 5
  57620. 2
  57621. Its
  57622. 38
  57623. 5
  57624. 2
  57625. It
  57626. 38
  57627. 5
  57628. 2
  57629. It
  57630. 38
  57631. 5
  57632. 2
  57633. itself
  57634. 38
  57635. 5
  57636. 2
  57637. its
  57638. 38
  57639. 5
  57640. 2
  57641. it
  57642. 38
  57643. 5
  57644. 2
  57645. it
  57646. 38
  57647. 5
  57648. 5
  57649. 38
  57650. 5
  57651. 0
  57652. 0
  57653. 2
  57654. 0
  57655. 5
  57656. 38
  57657. 5
  57658. 5
  57659. 38
  57660. 5
  57661. 5
  57662. 38
  57663. 5
  57664. 5
  57665. 38
  57666. 5
  57667. 5
  57668. 38
  57669. 5
  57670. 0
  57671. -1465044140
  57672. 2
  57673. 1
  57674. 0
  57675. 0
  57676. 38
  57677. 4
  57678. 4
  57679. 2
  57680. 2
  57681. Dusty_Guest
  57682. 2
  57683. Dusty
  57684. 2
  57685. 1
  57686. 4
  57687. 1
  57688. 2
  57689. By definition, guests appear nondescript.
  57690. 38
  57691. 5
  57692. 4
  57693. 2
  57694. 0
  57695. 0
  57696. 0
  57697. 0
  57698. 2
  57699. 1
  57700. #87
  57701. hallway near bob's cube
  57702.  
  57703. 0
  57704. 2
  57705. -1
  57706. -1
  57707. -1
  57708. 3
  57709. -1
  57710. 91
  57711. 1
  57712. east
  57713. 2
  57714. 9
  57715. -1
  57716. 0
  57717. 17
  57718. 5
  57719. 2
  57720. 5
  57721. 5
  57722. 2
  57723. 5
  57724. 5
  57725. 2
  57726. 5
  57727. 5
  57728. 2
  57729. 5
  57730. 5
  57731. 2
  57732. 5
  57733. 5
  57734. 2
  57735. 5
  57736. 5
  57737. 2
  57738. 5
  57739. 4
  57740. 3
  57741. 1
  57742. 89
  57743. 1
  57744. 93
  57745. 1
  57746. 231
  57747. 2
  57748. 4
  57749. 1
  57750. -1
  57751. 2
  57752. 5
  57753. 0
  57754. 14691
  57755. 2
  57756. 5
  57757. 4
  57758. 3
  57759. 1
  57760. 90
  57761. 1
  57762. 92
  57763. 1
  57764. 230
  57765. 2
  57766. 4
  57767. 5
  57768. 2
  57769. 5
  57770. 5
  57771. 2
  57772. 5
  57773. 0
  57774. 0
  57775. 2
  57776. 4
  57777. 4
  57778. 1
  57779. 2
  57780. hallway near bob's cube
  57781. 2
  57782. 5
  57783. 2
  57784. You are in a north-south hallway. There is an opening to the east.
  57785. 2
  57786. 5
  57787. 4
  57788. 2
  57789. 0
  57790. 0
  57791. 0
  57792. 0
  57793. 2
  57794. 1
  57795. #88
  57796. a Profs manual
  57797.  
  57798. 0
  57799. 2
  57800. 311
  57801. -1
  57802. -1
  57803. 9
  57804. -1
  57805. 283
  57806. 0
  57807. 0
  57808. 15
  57809. 5
  57810. 2
  57811. 5
  57812. 5
  57813. 2
  57814. 4
  57815. 4
  57816. 1
  57817. 2
  57818. The Professional Office System provides many useful features...
  57819. 2
  57820. 4
  57821. 5
  57822. 2
  57823. 5
  57824. 5
  57825. 2
  57826. 5
  57827. 5
  57828. 2
  57829. 5
  57830. 5
  57831. 2
  57832. 5
  57833. 5
  57834. 2
  57835. 5
  57836. 5
  57837. 2
  57838. 5
  57839. 5
  57840. 2
  57841. 5
  57842. 5
  57843. 2
  57844. 5
  57845. 0
  57846. 0
  57847. 2
  57848. 4
  57849. 4
  57850. 3
  57851. 2
  57852. a Profs manual
  57853. 2
  57854. manual
  57855. 2
  57856. book
  57857. 2
  57858. 5
  57859. 2
  57860. The PRofessional OFfice System
  57861. 2
  57862. 5
  57863. 4
  57864. 2
  57865. 0
  57866. 0
  57867. 0
  57868. 0
  57869. 2
  57870. 1
  57871. #89
  57872. west
  57873.  
  57874. 0
  57875. 2
  57876. -1
  57877. -1
  57878. -1
  57879. 7
  57880. -1
  57881. 90
  57882. 0
  57883. 0
  57884. 13
  57885. 5
  57886. 2
  57887. 5
  57888. 1
  57889. 82
  57890. 2
  57891. 5
  57892. 1
  57893. 87
  57894. 2
  57895. 5
  57896. 5
  57897. 2
  57898. 5
  57899. 5
  57900. 2
  57901. 5
  57902. 5
  57903. 2
  57904. 5
  57905. 5
  57906. 2
  57907. 5
  57908. 5
  57909. 2
  57910. 5
  57911. 5
  57912. 2
  57913. 5
  57914. 0
  57915. 0
  57916. 2
  57917. 4
  57918. 4
  57919. 4
  57920. 2
  57921. west
  57922. 2
  57923. out
  57924. 2
  57925. exit
  57926. 2
  57927. w
  57928. 2
  57929. 5
  57930. 5
  57931. 2
  57932. 5
  57933. 4
  57934. 2
  57935. 0
  57936. 0
  57937. 0
  57938. 0
  57939. 2
  57940. 1
  57941. #90
  57942. east
  57943.  
  57944. 0
  57945. 2
  57946. -1
  57947. -1
  57948. -1
  57949. 7
  57950. -1
  57951. 93
  57952. 0
  57953. 0
  57954. 13
  57955. 5
  57956. 2
  57957. 5
  57958. 1
  57959. 87
  57960. 2
  57961. 5
  57962. 1
  57963. 82
  57964. 2
  57965. 5
  57966. 5
  57967. 2
  57968. 5
  57969. 5
  57970. 2
  57971. 5
  57972. 5
  57973. 2
  57974. 5
  57975. 5
  57976. 2
  57977. 5
  57978. 5
  57979. 2
  57980. 5
  57981. 5
  57982. 2
  57983. 5
  57984. 0
  57985. 0
  57986. 2
  57987. 4
  57988. 4
  57989. 4
  57990. 2
  57991. east
  57992. 2
  57993. e
  57994. 2
  57995. in
  57996. 2
  57997. enter
  57998. 2
  57999. 5
  58000. 5
  58001. 2
  58002. 5
  58003. 4
  58004. 2
  58005. 0
  58006. 0
  58007. 0
  58008. 0
  58009. 2
  58010. 1
  58011. #91
  58012. hallway turn
  58013.  
  58014. 0
  58015. 2
  58016. -1
  58017. -1
  58018. -1
  58019. 3
  58020. -1
  58021. 94
  58022. 0
  58023. 0
  58024. 17
  58025. 5
  58026. 2
  58027. 5
  58028. 5
  58029. 2
  58030. 5
  58031. 5
  58032. 2
  58033. 5
  58034. 5
  58035. 2
  58036. 5
  58037. 5
  58038. 2
  58039. 5
  58040. 5
  58041. 2
  58042. 5
  58043. 5
  58044. 2
  58045. 5
  58046. 4
  58047. 4
  58048. 1
  58049. 92
  58050. 1
  58051. 96
  58052. 1
  58053. 99
  58054. 1
  58055. 105
  58056. 2
  58057. 4
  58058. 1
  58059. -1
  58060. 2
  58061. 5
  58062. 0
  58063. 5741
  58064. 2
  58065. 5
  58066. 4
  58067. 4
  58068. 1
  58069. 93
  58070. 1
  58071. 95
  58072. 1
  58073. 98
  58074. 1
  58075. 102
  58076. 2
  58077. 4
  58078. 5
  58079. 2
  58080. 5
  58081. 5
  58082. 2
  58083. 5
  58084. 0
  58085. 0
  58086. 2
  58087. 4
  58088. 4
  58089. 1
  58090. 2
  58091. hallway turn
  58092. 2
  58093. 5
  58094. 2
  58095. You are in the turn of a hallway from south to west. There is an opening to the east, and a doorway to the north. You smell candy.
  58096. 2
  58097. 5
  58098. 4
  58099. 2
  58100. 0
  58101. 0
  58102. 0
  58103. 0
  58104. 2
  58105. 1
  58106. #92
  58107. north
  58108.  
  58109. 0
  58110. 2
  58111. -1
  58112. -1
  58113. -1
  58114. 7
  58115. -1
  58116. 95
  58117. 0
  58118. 0
  58119. 13
  58120. 5
  58121. 2
  58122. 5
  58123. 1
  58124. 87
  58125. 2
  58126. 5
  58127. 1
  58128. 91
  58129. 2
  58130. 5
  58131. 5
  58132. 2
  58133. 5
  58134. 5
  58135. 2
  58136. 5
  58137. 5
  58138. 2
  58139. 5
  58140. 5
  58141. 2
  58142. 5
  58143. 5
  58144. 2
  58145. 5
  58146. 5
  58147. 2
  58148. 5
  58149. 0
  58150. 0
  58151. 2
  58152. 4
  58153. 4
  58154. 2
  58155. 2
  58156. north
  58157. 2
  58158. n
  58159. 2
  58160. 5
  58161. 5
  58162. 2
  58163. 5
  58164. 4
  58165. 2
  58166. 0
  58167. 0
  58168. 0
  58169. 0
  58170. 2
  58171. 1
  58172. #93
  58173. south
  58174.  
  58175. 0
  58176. 2
  58177. -1
  58178. -1
  58179. -1
  58180. 7
  58181. -1
  58182. 92
  58183. 0
  58184. 0
  58185. 13
  58186. 5
  58187. 2
  58188. 5
  58189. 1
  58190. 91
  58191. 2
  58192. 5
  58193. 1
  58194. 87
  58195. 2
  58196. 5
  58197. 5
  58198. 2
  58199. 5
  58200. 5
  58201. 2
  58202. 5
  58203. 5
  58204. 2
  58205. 5
  58206. 5
  58207. 2
  58208. 5
  58209. 5
  58210. 2
  58211. 5
  58212. 5
  58213. 2
  58214. 5
  58215. 0
  58216. 0
  58217. 2
  58218. 4
  58219. 4
  58220. 2
  58221. 2
  58222. south
  58223. 2
  58224. s
  58225. 2
  58226. 5
  58227. 5
  58228. 2
  58229. 5
  58230. 4
  58231. 2
  58232. 0
  58233. 0
  58234. 0
  58235. 0
  58236. 2
  58237. 1
  58238. #94
  58239. Betsy's Cube
  58240.  
  58241. 0
  58242. 2
  58243. -1
  58244. -1
  58245. -1
  58246. 3
  58247. -1
  58248. 97
  58249. 0
  58250. 0
  58251. 17
  58252. 5
  58253. 2
  58254. 5
  58255. 5
  58256. 2
  58257. 5
  58258. 5
  58259. 2
  58260. 5
  58261. 5
  58262. 2
  58263. 5
  58264. 5
  58265. 2
  58266. 5
  58267. 5
  58268. 2
  58269. 5
  58270. 5
  58271. 2
  58272. 5
  58273. 4
  58274. 1
  58275. 1
  58276. 95
  58277. 2
  58278. 4
  58279. 1
  58280. -1
  58281. 2
  58282. 5
  58283. 0
  58284. 28964
  58285. 2
  58286. 5
  58287. 4
  58288. 1
  58289. 1
  58290. 96
  58291. 2
  58292. 4
  58293. 5
  58294. 2
  58295. 5
  58296. 5
  58297. 2
  58298. 5
  58299. 0
  58300. 0
  58301. 2
  58302. 4
  58303. 4
  58304. 1
  58305. 2
  58306. Betsy's Cube
  58307. 2
  58308. 5
  58309. 2
  58310. You are in Betsy's cube. There is an exit to the west.
  58311. 2
  58312. 5
  58313. 4
  58314. 2
  58315. 0
  58316. 0
  58317. 0
  58318. 0
  58319. 2
  58320. 1
  58321. #95
  58322. east
  58323.  
  58324. 0
  58325. 2
  58326. -1
  58327. -1
  58328. -1
  58329. 7
  58330. -1
  58331. 96
  58332. 0
  58333. 0
  58334. 13
  58335. 5
  58336. 2
  58337. 5
  58338. 1
  58339. 91
  58340. 2
  58341. 5
  58342. 1
  58343. 94
  58344. 2
  58345. 5
  58346. 5
  58347. 2
  58348. 5
  58349. 5
  58350. 2
  58351. 5
  58352. 5
  58353. 2
  58354. 5
  58355. 5
  58356. 2
  58357. 5
  58358. 5
  58359. 2
  58360. 5
  58361. 5
  58362. 2
  58363. 5
  58364. 0
  58365. 0
  58366. 2
  58367. 4
  58368. 4
  58369. 2
  58370. 2
  58371. east
  58372. 2
  58373. e
  58374. 2
  58375. 5
  58376. 5
  58377. 2
  58378. 5
  58379. 4
  58380. 2
  58381. 0
  58382. 0
  58383. 0
  58384. 0
  58385. 2
  58386. 1
  58387. #96
  58388. west
  58389.  
  58390. 0
  58391. 2
  58392. -1
  58393. -1
  58394. -1
  58395. 7
  58396. -1
  58397. 98
  58398. 0
  58399. 0
  58400. 13
  58401. 5
  58402. 2
  58403. 5
  58404. 1
  58405. 94
  58406. 2
  58407. 5
  58408. 1
  58409. 91
  58410. 2
  58411. 5
  58412. 5
  58413. 2
  58414. 5
  58415. 5
  58416. 2
  58417. 5
  58418. 5
  58419. 2
  58420. 5
  58421. 5
  58422. 2
  58423. 5
  58424. 5
  58425. 2
  58426. 5
  58427. 5
  58428. 2
  58429. 5
  58430. 0
  58431. 0
  58432. 2
  58433. 4
  58434. 4
  58435. 2
  58436. 2
  58437. west
  58438. 2
  58439. w
  58440. 2
  58441. 5
  58442. 5
  58443. 2
  58444. 5
  58445. 4
  58446. 2
  58447. 0
  58448. 0
  58449. 0
  58450. 0
  58451. 2
  58452. 1
  58453. #97
  58454. Amy's Office
  58455.  
  58456. 0
  58457. 2
  58458. -1
  58459. -1
  58460. -1
  58461. 3
  58462. -1
  58463. 100
  58464. 0
  58465. 0
  58466. 17
  58467. 5
  58468. 2
  58469. 5
  58470. 5
  58471. 2
  58472. 5
  58473. 5
  58474. 2
  58475. 5
  58476. 5
  58477. 2
  58478. 5
  58479. 5
  58480. 2
  58481. 5
  58482. 5
  58483. 2
  58484. 5
  58485. 0
  58486. 0
  58487. 2
  58488. 5
  58489. 4
  58490. 1
  58491. 1
  58492. 98
  58493. 2
  58494. 4
  58495. 1
  58496. -1
  58497. 2
  58498. 5
  58499. 0
  58500. 30614
  58501. 2
  58502. 5
  58503. 4
  58504. 1
  58505. 1
  58506. 99
  58507. 2
  58508. 4
  58509. 5
  58510. 2
  58511. 5
  58512. 5
  58513. 2
  58514. 5
  58515. 0
  58516. 0
  58517. 2
  58518. 4
  58519. 4
  58520. 1
  58521. 2
  58522. Amy's Office
  58523. 2
  58524. 5
  58525. 5
  58526. 2
  58527. 5
  58528. 4
  58529. 2
  58530. 0
  58531. 0
  58532. 0
  58533. 0
  58534. 2
  58535. 1
  58536. #98
  58537. north
  58538.  
  58539. 0
  58540. 2
  58541. -1
  58542. -1
  58543. -1
  58544. 7
  58545. -1
  58546. 99
  58547. 0
  58548. 0
  58549. 13
  58550. 5
  58551. 2
  58552. 5
  58553. 1
  58554. 91
  58555. 2
  58556. 5
  58557. 1
  58558. 97
  58559. 2
  58560. 5
  58561. 2
  58562. The door is locked. You hear whispering behind it, but its too faint to make out...
  58563. 2
  58564. 5
  58565. 5
  58566. 2
  58567. 5
  58568. 5
  58569. 2
  58570. 5
  58571. 5
  58572. 2
  58573. 5
  58574. 5
  58575. 2
  58576. 5
  58577. 5
  58578. 2
  58579. 5
  58580. 1
  58581. 2
  58582. 2
  58583. 4
  58584. 4
  58585. 2
  58586. 2
  58587. north
  58588. 2
  58589. n
  58590. 2
  58591. 5
  58592. 2
  58593. You peer through the window. Amy is sitting with several men in ties. They look up.
  58594. 2
  58595. 5
  58596. 4
  58597. 2
  58598. 0
  58599. 0
  58600. 0
  58601. 0
  58602. 2
  58603. 1
  58604. #99
  58605. south
  58606.  
  58607. 0
  58608. 2
  58609. -1
  58610. -1
  58611. -1
  58612. 7
  58613. -1
  58614. 102
  58615. 0
  58616. 0
  58617. 13
  58618. 5
  58619. 2
  58620. 5
  58621. 1
  58622. 97
  58623. 2
  58624. 5
  58625. 1
  58626. 91
  58627. 2
  58628. 5
  58629. 5
  58630. 2
  58631. 5
  58632. 5
  58633. 2
  58634. 5
  58635. 5
  58636. 2
  58637. 5
  58638. 5
  58639. 2
  58640. 5
  58641. 5
  58642. 2
  58643. 5
  58644. 5
  58645. 2
  58646. 5
  58647. 0
  58648. 0
  58649. 2
  58650. 4
  58651. 4
  58652. 2
  58653. 2
  58654. south
  58655. 2
  58656. s
  58657. 2
  58658. 5
  58659. 5
  58660. 2
  58661. 5
  58662. 4
  58663. 2
  58664. 0
  58665. 0
  58666. 0
  58667. 0
  58668. 2
  58669. 1
  58670. #100
  58671. hallway near John's office
  58672.  
  58673. 0
  58674. 2
  58675. -1
  58676. -1
  58677. -1
  58678. 3
  58679. -1
  58680. 101
  58681. 0
  58682. 0
  58683. 17
  58684. 5
  58685. 2
  58686. 5
  58687. 5
  58688. 2
  58689. 5
  58690. 5
  58691. 2
  58692. 5
  58693. 5
  58694. 2
  58695. 5
  58696. 5
  58697. 2
  58698. 5
  58699. 5
  58700. 2
  58701. 5
  58702. 5
  58703. 2
  58704. 5
  58705. 4
  58706. 3
  58707. 1
  58708. 102
  58709. 1
  58710. 104
  58711. 1
  58712. 108
  58713. 2
  58714. 4
  58715. 1
  58716. -1
  58717. 2
  58718. 5
  58719. 0
  58720. 29690
  58721. 2
  58722. 5
  58723. 4
  58724. 3
  58725. 1
  58726. 103
  58727. 1
  58728. 105
  58729. 1
  58730. 107
  58731. 2
  58732. 4
  58733. 5
  58734. 2
  58735. 5
  58736. 5
  58737. 2
  58738. 5
  58739. 0
  58740. 0
  58741. 2
  58742. 4
  58743. 4
  58744. 1
  58745. 2
  58746. hallway near John's office
  58747. 2
  58748. 5
  58749. 2
  58750. You are in a narrow east-west hallway. There is an office door leading north here.
  58751. 2
  58752. 5
  58753. 4
  58754. 2
  58755. 0
  58756. 0
  58757. 0
  58758. 0
  58759. 2
  58760. 1
  58761. #101
  58762. John's Office
  58763.  
  58764. 0
  58765. 2
  58766. -1
  58767. 327
  58768. -1
  58769. 3
  58770. -1
  58771. 106
  58772. 0
  58773. 0
  58774. 17
  58775. 5
  58776. 2
  58777. 5
  58778. 5
  58779. 2
  58780. 5
  58781. 5
  58782. 2
  58783. 5
  58784. 5
  58785. 2
  58786. 5
  58787. 5
  58788. 2
  58789. 5
  58790. 5
  58791. 2
  58792. 5
  58793. 0
  58794. 1
  58795. 2
  58796. 5
  58797. 4
  58798. 1
  58799. 1
  58800. 103
  58801. 2
  58802. 4
  58803. 1
  58804. -1
  58805. 2
  58806. 5
  58807. 0
  58808. 24165
  58809. 2
  58810. 5
  58811. 4
  58812. 1
  58813. 1
  58814. 104
  58815. 2
  58816. 4
  58817. 5
  58818. 2
  58819. 5
  58820. 5
  58821. 2
  58822. 5
  58823. 0
  58824. 0
  58825. 2
  58826. 4
  58827. 4
  58828. 1
  58829. 2
  58830. John's Office
  58831. 2
  58832. 5
  58833. 2
  58834. John Robert's Office. You feel a sense of power emanating from the furniture and books here.
  58835. 2
  58836. 5
  58837. 4
  58838. 2
  58839. 0
  58840. 0
  58841. 0
  58842. 0
  58843. 2
  58844. 1
  58845. #102
  58846. west
  58847.  
  58848. 0
  58849. 2
  58850. -1
  58851. -1
  58852. -1
  58853. 7
  58854. -1
  58855. 103
  58856. 0
  58857. 0
  58858. 13
  58859. 5
  58860. 2
  58861. 5
  58862. 1
  58863. 91
  58864. 2
  58865. 5
  58866. 1
  58867. 100
  58868. 2
  58869. 5
  58870. 5
  58871. 2
  58872. 5
  58873. 5
  58874. 2
  58875. 5
  58876. 5
  58877. 2
  58878. 5
  58879. 5
  58880. 2
  58881. 5
  58882. 5
  58883. 2
  58884. 5
  58885. 5
  58886. 2
  58887. 5
  58888. 0
  58889. 0
  58890. 2
  58891. 4
  58892. 4
  58893. 2
  58894. 2
  58895. west
  58896. 2
  58897. w
  58898. 2
  58899. 5
  58900. 5
  58901. 2
  58902. 5
  58903. 4
  58904. 2
  58905. 0
  58906. 0
  58907. 0
  58908. 0
  58909. 2
  58910. 1
  58911. #103
  58912. north
  58913.  
  58914. 0
  58915. 2
  58916. -1
  58917. -1
  58918. -1
  58919. 7
  58920. -1
  58921. 104
  58922. 0
  58923. 0
  58924. 13
  58925. 5
  58926. 2
  58927. 5
  58928. 1
  58929. 100
  58930. 2
  58931. 5
  58932. 1
  58933. 101
  58934. 2
  58935. 5
  58936. 2
  58937. "The door is locked. You hear manic laughter, interspersed with angry shouts..."
  58938. 2
  58939. 5
  58940. 5
  58941. 2
  58942. 5
  58943. 5
  58944. 2
  58945. 5
  58946. 5
  58947. 2
  58948. 5
  58949. 5
  58950. 2
  58951. 5
  58952. 5
  58953. 2
  58954. 5
  58955. 1
  58956. 2
  58957. 2
  58958. 4
  58959. 4
  58960. 2
  58961. 2
  58962. north
  58963. 2
  58964. n
  58965. 2
  58966. 5
  58967. 5
  58968. 2
  58969. 5
  58970. 4
  58971. 2
  58972. 0
  58973. 0
  58974. 0
  58975. 0
  58976. 2
  58977. 1
  58978. #104
  58979. south
  58980.  
  58981. 0
  58982. 2
  58983. -1
  58984. -1
  58985. -1
  58986. 7
  58987. -1
  58988. 105
  58989. 0
  58990. 0
  58991. 13
  58992. 5
  58993. 2
  58994. 5
  58995. 1
  58996. 101
  58997. 2
  58998. 5
  58999. 1
  59000. 100
  59001. 2
  59002. 5
  59003. 5
  59004. 2
  59005. 5
  59006. 5
  59007. 2
  59008. 5
  59009. 5
  59010. 2
  59011. 5
  59012. 5
  59013. 2
  59014. 5
  59015. 5
  59016. 2
  59017. 5
  59018. 5
  59019. 2
  59020. 5
  59021. 0
  59022. 0
  59023. 2
  59024. 4
  59025. 4
  59026. 2
  59027. 2
  59028. south
  59029. 2
  59030. s
  59031. 2
  59032. 5
  59033. 5
  59034. 2
  59035. 5
  59036. 4
  59037. 2
  59038. 0
  59039. 0
  59040. 0
  59041. 0
  59042. 2
  59043. 1
  59044. #105
  59045. east
  59046.  
  59047. 0
  59048. 2
  59049. -1
  59050. -1
  59051. -1
  59052. 7
  59053. -1
  59054. 107
  59055. 0
  59056. 0
  59057. 13
  59058. 5
  59059. 2
  59060. 5
  59061. 1
  59062. 100
  59063. 2
  59064. 5
  59065. 1
  59066. 91
  59067. 2
  59068. 5
  59069. 5
  59070. 2
  59071. 5
  59072. 5
  59073. 2
  59074. 5
  59075. 5
  59076. 2
  59077. 5
  59078. 5
  59079. 2
  59080. 5
  59081. 5
  59082. 2
  59083. 5
  59084. 5
  59085. 2
  59086. 5
  59087. 0
  59088. 0
  59089. 2
  59090. 4
  59091. 4
  59092. 2
  59093. 2
  59094. east
  59095. 2
  59096. e
  59097. 2
  59098. 5
  59099. 5
  59100. 2
  59101. 5
  59102. 4
  59103. 2
  59104. 0
  59105. 0
  59106. 0
  59107. 0
  59108. 2
  59109. 1
  59110. #106
  59111. Hallway near Bill's Cube
  59112.  
  59113. 0
  59114. 2
  59115. -1
  59116. -1
  59117. -1
  59118. 3
  59119. -1
  59120. 109
  59121. 0
  59122. 0
  59123. 17
  59124. 5
  59125. 2
  59126. 5
  59127. 5
  59128. 2
  59129. 5
  59130. 5
  59131. 2
  59132. 5
  59133. 5
  59134. 2
  59135. 5
  59136. 5
  59137. 2
  59138. 5
  59139. 5
  59140. 2
  59141. 5
  59142. 5
  59143. 2
  59144. 5
  59145. 4
  59146. 4
  59147. 1
  59148. 107
  59149. 1
  59150. 111
  59151. 1
  59152. 114
  59153. 1
  59154. 78
  59155. 2
  59156. 4
  59157. 1
  59158. -1
  59159. 2
  59160. 5
  59161. 0
  59162. 30016
  59163. 2
  59164. 5
  59165. 4
  59166. 4
  59167. 1
  59168. 108
  59169. 1
  59170. 110
  59171. 1
  59172. 113
  59173. 1
  59174. 146
  59175. 2
  59176. 4
  59177. 5
  59178. 2
  59179. 5
  59180. 5
  59181. 2
  59182. 5
  59183. 0
  59184. 0
  59185. 2
  59186. 4
  59187. 4
  59188. 1
  59189. 2
  59190. Hallway near Bill's Cube
  59191. 2
  59192. 5
  59193. 2
  59194. You are in an east-west hallway. There is an opening to the north, and a passage leading south.
  59195. 2
  59196. 5
  59197. 4
  59198. 2
  59199. 0
  59200. 0
  59201. 0
  59202. 0
  59203. 2
  59204. 1
  59205. #107
  59206. west
  59207.  
  59208. 0
  59209. 2
  59210. -1
  59211. -1
  59212. -1
  59213. 7
  59214. -1
  59215. 108
  59216. 0
  59217. 0
  59218. 13
  59219. 5
  59220. 2
  59221. 5
  59222. 1
  59223. 100
  59224. 2
  59225. 5
  59226. 1
  59227. 106
  59228. 2
  59229. 5
  59230. 5
  59231. 2
  59232. 5
  59233. 5
  59234. 2
  59235. 5
  59236. 5
  59237. 2
  59238. 5
  59239. 5
  59240. 2
  59241. 5
  59242. 5
  59243. 2
  59244. 5
  59245. 5
  59246. 2
  59247. 5
  59248. 0
  59249. 0
  59250. 2
  59251. 4
  59252. 4
  59253. 2
  59254. 2
  59255. west
  59256. 2
  59257. w
  59258. 2
  59259. 5
  59260. 5
  59261. 2
  59262. 5
  59263. 4
  59264. 2
  59265. 0
  59266. 0
  59267. 0
  59268. 0
  59269. 2
  59270. 1
  59271. #108
  59272. east
  59273.  
  59274. 0
  59275. 2
  59276. -1
  59277. -1
  59278. -1
  59279. 7
  59280. -1
  59281. 110
  59282. 0
  59283. 0
  59284. 13
  59285. 5
  59286. 2
  59287. 5
  59288. 1
  59289. 106
  59290. 2
  59291. 5
  59292. 1
  59293. 100
  59294. 2
  59295. 5
  59296. 5
  59297. 2
  59298. 5
  59299. 5
  59300. 2
  59301. 5
  59302. 5
  59303. 2
  59304. 5
  59305. 5
  59306. 2
  59307. 5
  59308. 5
  59309. 2
  59310. 5
  59311. 5
  59312. 2
  59313. 5
  59314. 0
  59315. 0
  59316. 2
  59317. 4
  59318. 4
  59319. 2
  59320. 2
  59321. east
  59322. 2
  59323. e
  59324. 2
  59325. 5
  59326. 5
  59327. 2
  59328. 5
  59329. 4
  59330. 2
  59331. 0
  59332. 0
  59333. 0
  59334. 0
  59335. 2
  59336. 1
  59337. #109
  59338. Bill's Cube
  59339.  
  59340. 0
  59341. 2
  59342. -1
  59343. 334
  59344. -1
  59345. 3
  59346. -1
  59347. 112
  59348. 0
  59349. 0
  59350. 17
  59351. 5
  59352. 2
  59353. 5
  59354. 0
  59355. 0
  59356. 2
  59357. 5
  59358. 5
  59359. 2
  59360. 5
  59361. 5
  59362. 2
  59363. 5
  59364. 5
  59365. 2
  59366. 5
  59367. 4
  59368. 1
  59369. 1
  59370. 77
  59371. 2
  59372. 5
  59373. 5
  59374. 2
  59375. 5
  59376. 4
  59377. 1
  59378. 1
  59379. 110
  59380. 2
  59381. 4
  59382. 1
  59383. -1
  59384. 2
  59385. 5
  59386. 0
  59387. 7516
  59388. 2
  59389. 5
  59390. 4
  59391. 1
  59392. 1
  59393. 111
  59394. 2
  59395. 4
  59396. 5
  59397. 2
  59398. 5
  59399. 5
  59400. 2
  59401. 5
  59402. 0
  59403. 0
  59404. 2
  59405. 4
  59406. 4
  59407. 1
  59408. 2
  59409. Bill's Cube
  59410. 2
  59411. 5
  59412. 2
  59413. It's really quite a mess.  Inside Mac manuals are lost in piles of Radar bug reports and Apple Event documentation.  Not as bad as Jeff's cube.
  59414. 2
  59415. 5
  59416. 4
  59417. 2
  59418. 0
  59419. 0
  59420. 0
  59421. 0
  59422. 2
  59423. 1
  59424. #110
  59425. north
  59426.  
  59427. 0
  59428. 2
  59429. -1
  59430. -1
  59431. -1
  59432. 7
  59433. -1
  59434. 111
  59435. 0
  59436. 0
  59437. 13
  59438. 5
  59439. 2
  59440. 5
  59441. 1
  59442. 106
  59443. 2
  59444. 5
  59445. 1
  59446. 109
  59447. 2
  59448. 5
  59449. 5
  59450. 2
  59451. 5
  59452. 5
  59453. 2
  59454. 5
  59455. 5
  59456. 2
  59457. 5
  59458. 5
  59459. 2
  59460. 5
  59461. 5
  59462. 2
  59463. 5
  59464. 5
  59465. 2
  59466. 5
  59467. 0
  59468. 0
  59469. 2
  59470. 4
  59471. 4
  59472. 2
  59473. 2
  59474. north
  59475. 2
  59476. n
  59477. 2
  59478. 5
  59479. 5
  59480. 2
  59481. 5
  59482. 4
  59483. 2
  59484. 0
  59485. 0
  59486. 0
  59487. 0
  59488. 2
  59489. 1
  59490. #111
  59491. south
  59492.  
  59493. 0
  59494. 2
  59495. -1
  59496. -1
  59497. -1
  59498. 7
  59499. -1
  59500. 113
  59501. 0
  59502. 0
  59503. 13
  59504. 5
  59505. 2
  59506. 5
  59507. 1
  59508. 109
  59509. 2
  59510. 5
  59511. 1
  59512. 106
  59513. 2
  59514. 5
  59515. 5
  59516. 2
  59517. 5
  59518. 5
  59519. 2
  59520. 5
  59521. 5
  59522. 2
  59523. 5
  59524. 5
  59525. 2
  59526. 5
  59527. 5
  59528. 2
  59529. 5
  59530. 5
  59531. 2
  59532. 5
  59533. 0
  59534. 0
  59535. 2
  59536. 4
  59537. 4
  59538. 3
  59539. 2
  59540. south
  59541. 2
  59542. s
  59543. 2
  59544. out
  59545. 2
  59546. 5
  59547. 5
  59548. 2
  59549. 5
  59550. 4
  59551. 2
  59552. 0
  59553. 0
  59554. 0
  59555. 0
  59556. 2
  59557. 1
  59558. #112
  59559. Hallway near David's cube
  59560.  
  59561. 0
  59562. 2
  59563. -1
  59564. -1
  59565. -1
  59566. 3
  59567. -1
  59568. 115
  59569. 0
  59570. 0
  59571. 17
  59572. 5
  59573. 2
  59574. 5
  59575. 5
  59576. 2
  59577. 5
  59578. 5
  59579. 2
  59580. 5
  59581. 5
  59582. 2
  59583. 5
  59584. 5
  59585. 2
  59586. 5
  59587. 5
  59588. 2
  59589. 5
  59590. 5
  59591. 2
  59592. 5
  59593. 4
  59594. 4
  59595. 1
  59596. 113
  59597. 1
  59598. 117
  59599. 1
  59600. 120
  59601. 1
  59602. 123
  59603. 2
  59604. 4
  59605. 1
  59606. -1
  59607. 2
  59608. 5
  59609. 0
  59610. 16913
  59611. 2
  59612. 5
  59613. 4
  59614. 4
  59615. 1
  59616. 114
  59617. 1
  59618. 116
  59619. 1
  59620. 119
  59621. 1
  59622. 122
  59623. 2
  59624. 4
  59625. 5
  59626. 2
  59627. 5
  59628. 5
  59629. 2
  59630. 5
  59631. 0
  59632. 0
  59633. 2
  59634. 4
  59635. 4
  59636. 1
  59637. 2
  59638. Hallway near David's cube
  59639. 2
  59640. 5
  59641. 2
  59642. You are in an east-west hallway. There are openings to the north and south. You smell burning insulation.
  59643. 2
  59644. 5
  59645. 4
  59646. 2
  59647. 0
  59648. 0
  59649. 0
  59650. 0
  59651. 2
  59652. 1
  59653. #113
  59654. west
  59655.  
  59656. 0
  59657. 2
  59658. -1
  59659. -1
  59660. -1
  59661. 7
  59662. -1
  59663. 114
  59664. 0
  59665. 0
  59666. 13
  59667. 5
  59668. 2
  59669. 5
  59670. 1
  59671. 106
  59672. 2
  59673. 5
  59674. 1
  59675. 112
  59676. 2
  59677. 5
  59678. 5
  59679. 2
  59680. 5
  59681. 5
  59682. 2
  59683. 5
  59684. 5
  59685. 2
  59686. 5
  59687. 5
  59688. 2
  59689. 5
  59690. 5
  59691. 2
  59692. 5
  59693. 5
  59694. 2
  59695. 5
  59696. 0
  59697. 0
  59698. 2
  59699. 4
  59700. 4
  59701. 2
  59702. 2
  59703. west
  59704. 2
  59705. w
  59706. 2
  59707. 5
  59708. 5
  59709. 2
  59710. 5
  59711. 4
  59712. 2
  59713. 0
  59714. 0
  59715. 0
  59716. 0
  59717. 2
  59718. 1
  59719. #114
  59720. east
  59721.  
  59722. 0
  59723. 2
  59724. -1
  59725. -1
  59726. -1
  59727. 7
  59728. -1
  59729. 116
  59730. 0
  59731. 0
  59732. 13
  59733. 5
  59734. 2
  59735. 5
  59736. 1
  59737. 112
  59738. 2
  59739. 5
  59740. 1
  59741. 106
  59742. 2
  59743. 5
  59744. 5
  59745. 2
  59746. 5
  59747. 5
  59748. 2
  59749. 5
  59750. 5
  59751. 2
  59752. 5
  59753. 5
  59754. 2
  59755. 5
  59756. 5
  59757. 2
  59758. 5
  59759. 5
  59760. 2
  59761. 5
  59762. 0
  59763. 0
  59764. 2
  59765. 4
  59766. 4
  59767. 2
  59768. 2
  59769. east
  59770. 2
  59771. e
  59772. 2
  59773. 5
  59774. 5
  59775. 2
  59776. 5
  59777. 4
  59778. 2
  59779. 0
  59780. 0
  59781. 0
  59782. 0
  59783. 2
  59784. 1
  59785. #115
  59786. Junk Cube
  59787.  
  59788. 0
  59789. 2
  59790. -1
  59791. 310
  59792. -1
  59793. 3
  59794. -1
  59795. 118
  59796. 0
  59797. 0
  59798. 17
  59799. 5
  59800. 2
  59801. 5
  59802. 5
  59803. 2
  59804. 5
  59805. 5
  59806. 2
  59807. 5
  59808. 5
  59809. 2
  59810. 5
  59811. 5
  59812. 2
  59813. 5
  59814. 5
  59815. 2
  59816. 5
  59817. 5
  59818. 2
  59819. 5
  59820. 4
  59821. 1
  59822. 1
  59823. 116
  59824. 2
  59825. 4
  59826. 1
  59827. -1
  59828. 2
  59829. 5
  59830. 0
  59831. 22871
  59832. 2
  59833. 5
  59834. 4
  59835. 1
  59836. 1
  59837. 117
  59838. 2
  59839. 4
  59840. 5
  59841. 2
  59842. 5
  59843. 5
  59844. 2
  59845. 5
  59846. 0
  59847. 0
  59848. 2
  59849. 4
  59850. 4
  59851. 1
  59852. 2
  59853. Junk Cube
  59854. 2
  59855. 5
  59856. 2
  59857. There is all manner of junk piled about. Most of it is useless. There is an exit to the south.
  59858. 2
  59859. 5
  59860. 4
  59861. 2
  59862. 0
  59863. 0
  59864. 0
  59865. 0
  59866. 2
  59867. 1
  59868. #116
  59869. north
  59870.  
  59871. 0
  59872. 2
  59873. -1
  59874. -1
  59875. -1
  59876. 7
  59877. -1
  59878. 117
  59879. 0
  59880. 0
  59881. 13
  59882. 5
  59883. 2
  59884. 5
  59885. 1
  59886. 112
  59887. 2
  59888. 5
  59889. 1
  59890. 115
  59891. 2
  59892. 5
  59893. 5
  59894. 2
  59895. 5
  59896. 5
  59897. 2
  59898. 5
  59899. 5
  59900. 2
  59901. 5
  59902. 5
  59903. 2
  59904. 5
  59905. 5
  59906. 2
  59907. 5
  59908. 5
  59909. 2
  59910. 5
  59911. 0
  59912. 0
  59913. 2
  59914. 4
  59915. 4
  59916. 2
  59917. 2
  59918. north
  59919. 2
  59920. n
  59921. 2
  59922. 5
  59923. 5
  59924. 2
  59925. 5
  59926. 4
  59927. 2
  59928. 0
  59929. 0
  59930. 0
  59931. 0
  59932. 2
  59933. 1
  59934. #117
  59935. south
  59936.  
  59937. 0
  59938. 2
  59939. -1
  59940. -1
  59941. -1
  59942. 7
  59943. -1
  59944. 119
  59945. 0
  59946. 0
  59947. 13
  59948. 5
  59949. 2
  59950. 5
  59951. 1
  59952. 115
  59953. 2
  59954. 5
  59955. 1
  59956. 112
  59957. 2
  59958. 5
  59959. 5
  59960. 2
  59961. 5
  59962. 5
  59963. 2
  59964. 5
  59965. 5
  59966. 2
  59967. 5
  59968. 5
  59969. 2
  59970. 5
  59971. 5
  59972. 2
  59973. 5
  59974. 5
  59975. 2
  59976. 5
  59977. 0
  59978. 0
  59979. 2
  59980. 4
  59981. 4
  59982. 2
  59983. 2
  59984. south
  59985. 2
  59986. s
  59987. 2
  59988. 5
  59989. 5
  59990. 2
  59991. 5
  59992. 4
  59993. 2
  59994. 0
  59995. 0
  59996. 0
  59997. 0
  59998. 2
  59999. 1
  60000. #118
  60001. David's Cube
  60002.  
  60003. 0
  60004. 2
  60005. -1
  60006. -1
  60007. -1
  60008. 3
  60009. -1
  60010. 121
  60011. 0
  60012. 0
  60013. 17
  60014. 5
  60015. 2
  60016. 5
  60017. 5
  60018. 2
  60019. 5
  60020. 5
  60021. 2
  60022. 5
  60023. 5
  60024. 2
  60025. 5
  60026. 5
  60027. 2
  60028. 5
  60029. 5
  60030. 2
  60031. 5
  60032. 5
  60033. 2
  60034. 5
  60035. 4
  60036. 1
  60037. 1
  60038. 119
  60039. 2
  60040. 4
  60041. 1
  60042. -1
  60043. 2
  60044. 5
  60045. 0
  60046. 18423
  60047. 2
  60048. 5
  60049. 4
  60050. 1
  60051. 1
  60052. 120
  60053. 2
  60054. 4
  60055. 5
  60056. 2
  60057. 5
  60058. 5
  60059. 2
  60060. 5
  60061. 0
  60062. 0
  60063. 2
  60064. 4
  60065. 4
  60066. 1
  60067. 2
  60068. David's Cube
  60069. 2
  60070. 5
  60071. 2
  60072. This is David Brown's cube. There is lots of junk here.
  60073. 2
  60074. 5
  60075. 4
  60076. 2
  60077. 0
  60078. 0
  60079. 0
  60080. 0
  60081. 2
  60082. 1
  60083. #119
  60084. south
  60085.  
  60086. 0
  60087. 2
  60088. -1
  60089. -1
  60090. -1
  60091. 7
  60092. -1
  60093. 120
  60094. 0
  60095. 0
  60096. 13
  60097. 5
  60098. 2
  60099. 5
  60100. 1
  60101. 112
  60102. 2
  60103. 5
  60104. 1
  60105. 118
  60106. 2
  60107. 5
  60108. 5
  60109. 2
  60110. 5
  60111. 5
  60112. 2
  60113. 5
  60114. 5
  60115. 2
  60116. 5
  60117. 5
  60118. 2
  60119. 5
  60120. 5
  60121. 2
  60122. 5
  60123. 5
  60124. 2
  60125. 5
  60126. 0
  60127. 0
  60128. 2
  60129. 4
  60130. 4
  60131. 2
  60132. 2
  60133. south
  60134. 2
  60135. s
  60136. 2
  60137. 5
  60138. 5
  60139. 2
  60140. 5
  60141. 4
  60142. 2
  60143. 0
  60144. 0
  60145. 0
  60146. 0
  60147. 2
  60148. 1
  60149. #120
  60150. north
  60151.  
  60152. 0
  60153. 2
  60154. -1
  60155. -1
  60156. -1
  60157. 7
  60158. -1
  60159. 122
  60160. 0
  60161. 0
  60162. 13
  60163. 5
  60164. 2
  60165. 5
  60166. 1
  60167. 118
  60168. 2
  60169. 5
  60170. 1
  60171. 112
  60172. 2
  60173. 5
  60174. 5
  60175. 2
  60176. 5
  60177. 5
  60178. 2
  60179. 5
  60180. 5
  60181. 2
  60182. 5
  60183. 5
  60184. 2
  60185. 5
  60186. 5
  60187. 2
  60188. 5
  60189. 5
  60190. 2
  60191. 5
  60192. 0
  60193. 0
  60194. 2
  60195. 4
  60196. 4
  60197. 2
  60198. 2
  60199. north
  60200. 2
  60201. n
  60202. 2
  60203. 5
  60204. 5
  60205. 2
  60206. 5
  60207. 4
  60208. 2
  60209. 0
  60210. 0
  60211. 0
  60212. 0
  60213. 2
  60214. 1
  60215. #121
  60216. Hallway near JL's cube
  60217.  
  60218. 0
  60219. 2
  60220. -1
  60221. -1
  60222. -1
  60223. 3
  60224. -1
  60225. 127
  60226. 0
  60227. 0
  60228. 17
  60229. 5
  60230. 2
  60231. 5
  60232. 5
  60233. 2
  60234. 5
  60235. 5
  60236. 2
  60237. 5
  60238. 5
  60239. 2
  60240. 5
  60241. 5
  60242. 2
  60243. 5
  60244. 5
  60245. 2
  60246. 5
  60247. 5
  60248. 2
  60249. 5
  60250. 4
  60251. 5
  60252. 1
  60253. 122
  60254. 1
  60255. 126
  60256. 1
  60257. 129
  60258. 1
  60259. 133
  60260. 1
  60261. 336
  60262. 2
  60263. 4
  60264. 1
  60265. -1
  60266. 2
  60267. 5
  60268. 0
  60269. 14800
  60270. 2
  60271. 5
  60272. 4
  60273. 4
  60274. 1
  60275. 123
  60276. 1
  60277. 125
  60278. 1
  60279. 128
  60280. 1
  60281. 132
  60282. 2
  60283. 4
  60284. 5
  60285. 2
  60286. 5
  60287. 5
  60288. 2
  60289. 5
  60290. 0
  60291. 0
  60292. 2
  60293. 4
  60294. 4
  60295. 1
  60296. 2
  60297. Hallway near JL's cube
  60298. 2
  60299. 5
  60300. 2
  60301. You are in an east-west hallway. There are openings to the north and south. you hear frantic typing...
  60302. 2
  60303. 5
  60304. 4
  60305. 2
  60306. 0
  60307. 0
  60308. 0
  60309. 0
  60310. 2
  60311. 1
  60312. #122
  60313. west
  60314.  
  60315. 0
  60316. 2
  60317. -1
  60318. -1
  60319. -1
  60320. 7
  60321. -1
  60322. 123
  60323. 0
  60324. 0
  60325. 13
  60326. 5
  60327. 2
  60328. 5
  60329. 1
  60330. 112
  60331. 2
  60332. 5
  60333. 1
  60334. 121
  60335. 2
  60336. 5
  60337. 5
  60338. 2
  60339. 5
  60340. 5
  60341. 2
  60342. 5
  60343. 5
  60344. 2
  60345. 5
  60346. 5
  60347. 2
  60348. 5
  60349. 5
  60350. 2
  60351. 5
  60352. 5
  60353. 2
  60354. 5
  60355. 0
  60356. 0
  60357. 2
  60358. 4
  60359. 4
  60360. 2
  60361. 2
  60362. west
  60363. 2
  60364. w
  60365. 2
  60366. 5
  60367. 5
  60368. 2
  60369. 5
  60370. 4
  60371. 2
  60372. 0
  60373. 0
  60374. 0
  60375. 0
  60376. 2
  60377. 1
  60378. #123
  60379. east
  60380.  
  60381. 0
  60382. 2
  60383. -1
  60384. -1
  60385. -1
  60386. 7
  60387. -1
  60388. 125
  60389. 0
  60390. 0
  60391. 13
  60392. 5
  60393. 2
  60394. 5
  60395. 1
  60396. 121
  60397. 2
  60398. 5
  60399. 1
  60400. 112
  60401. 2
  60402. 5
  60403. 5
  60404. 2
  60405. 5
  60406. 5
  60407. 2
  60408. 5
  60409. 5
  60410. 2
  60411. 5
  60412. 5
  60413. 2
  60414. 5
  60415. 5
  60416. 2
  60417. 5
  60418. 5
  60419. 2
  60420. 5
  60421. 0
  60422. 0
  60423. 2
  60424. 4
  60425. 4
  60426. 2
  60427. 2
  60428. east
  60429. 2
  60430. e
  60431. 2
  60432. 5
  60433. 5
  60434. 2
  60435. 5
  60436. 4
  60437. 2
  60438. 0
  60439. 0
  60440. 0
  60441. 0
  60442. 2
  60443. 1
  60444. #124
  60445. JL's Cube
  60446.  
  60447. 0
  60448. 147
  60449. -1
  60450. 332
  60451. -1
  60452. 3
  60453. -1
  60454. 335
  60455. 0
  60456. 1
  60457. whiteboard
  60458. 18
  60459. 2
  60460. Test
  60461. 147
  60462. 5
  60463. 5
  60464. 147
  60465. 5
  60466. 5
  60467. 147
  60468. 5
  60469. 5
  60470. 147
  60471. 5
  60472. 5
  60473. 147
  60474. 5
  60475. 5
  60476. 147
  60477. 5
  60478. 4
  60479. 2
  60480. 1
  60481. 147
  60482. 1
  60483. 346
  60484. 147
  60485. 5
  60486. 5
  60487. 147
  60488. 5
  60489. 4
  60490. 0
  60491. 147
  60492. 4
  60493. 1
  60494. -1
  60495. 147
  60496. 5
  60497. 0
  60498. 753
  60499. 147
  60500. 5
  60501. 4
  60502. 1
  60503. 1
  60504. 336
  60505. 147
  60506. 4
  60507. 5
  60508. 147
  60509. 5
  60510. 5
  60511. 147
  60512. 5
  60513. 0
  60514. 0
  60515. 147
  60516. 4
  60517. 4
  60518. 1
  60519. 2
  60520. JL's Cube
  60521. 147
  60522. 5
  60523. 2
  60524. Oddly, this office looks like a dog house.
  60525. 147
  60526. 5
  60527. 4
  60528. 2
  60529. 0
  60530. 0
  60531. 0
  60532. 0
  60533. 2
  60534. 1
  60535. #125
  60536. north
  60537.  
  60538. 0
  60539. 2
  60540. -1
  60541. -1
  60542. -1
  60543. 7
  60544. -1
  60545. 126
  60546. 0
  60547. 0
  60548. 13
  60549. 5
  60550. 2
  60551. 5
  60552. 1
  60553. 121
  60554. 2
  60555. 5
  60556. 1
  60557. 124
  60558. 2
  60559. 5
  60560. 5
  60561. 2
  60562. 5
  60563. 5
  60564. 2
  60565. 5
  60566. 5
  60567. 2
  60568. 5
  60569. 5
  60570. 2
  60571. 5
  60572. 5
  60573. 2
  60574. 5
  60575. 5
  60576. 2
  60577. 5
  60578. 0
  60579. 0
  60580. 2
  60581. 4
  60582. 4
  60583. 2
  60584. 2
  60585. north
  60586. 2
  60587. n
  60588. 2
  60589. 5
  60590. 5
  60591. 2
  60592. 5
  60593. 4
  60594. 2
  60595. 0
  60596. 0
  60597. 0
  60598. 0
  60599. 2
  60600. 1
  60601. #126
  60602. south
  60603.  
  60604. 0
  60605. 2
  60606. -1
  60607. -1
  60608. -1
  60609. 7
  60610. -1
  60611. 128
  60612. 0
  60613. 0
  60614. 13
  60615. 5
  60616. 2
  60617. 5
  60618. 1
  60619. 124
  60620. 2
  60621. 5
  60622. 1
  60623. 121
  60624. 2
  60625. 5
  60626. 5
  60627. 2
  60628. 5
  60629. 5
  60630. 2
  60631. 5
  60632. 5
  60633. 2
  60634. 5
  60635. 5
  60636. 2
  60637. 5
  60638. 5
  60639. 2
  60640. 5
  60641. 5
  60642. 2
  60643. 5
  60644. 0
  60645. 0
  60646. 2
  60647. 4
  60648. 4
  60649. 2
  60650. 2
  60651. south
  60652. 2
  60653. s
  60654. 2
  60655. 5
  60656. 5
  60657. 2
  60658. 5
  60659. 4
  60660. 2
  60661. 0
  60662. 0
  60663. 0
  60664. 0
  60665. 2
  60666. 1
  60667. #127
  60668. Bike Cube
  60669.  
  60670. 0
  60671. 2
  60672. -1
  60673. -1
  60674. -1
  60675. 3
  60676. -1
  60677. 131
  60678. 0
  60679. 0
  60680. 17
  60681. 5
  60682. 2
  60683. 5
  60684. 5
  60685. 2
  60686. 5
  60687. 5
  60688. 2
  60689. 5
  60690. 5
  60691. 2
  60692. 5
  60693. 5
  60694. 2
  60695. 5
  60696. 5
  60697. 2
  60698. 5
  60699. 5
  60700. 2
  60701. 5
  60702. 4
  60703. 1
  60704. 1
  60705. 128
  60706. 2
  60707. 4
  60708. 1
  60709. -1
  60710. 2
  60711. 5
  60712. 0
  60713. 23212
  60714. 2
  60715. 5
  60716. 4
  60717. 1
  60718. 1
  60719. 129
  60720. 2
  60721. 4
  60722. 5
  60723. 2
  60724. 5
  60725. 5
  60726. 2
  60727. 5
  60728. 0
  60729. 0
  60730. 2
  60731. 4
  60732. 4
  60733. 1
  60734. 2
  60735. Bike Cube
  60736. 2
  60737. 5
  60738. 5
  60739. 2
  60740. 5
  60741. 4
  60742. 2
  60743. 0
  60744. 0
  60745. 0
  60746. 0
  60747. 2
  60748. 1
  60749. #128
  60750. south
  60751.  
  60752. 0
  60753. 2
  60754. -1
  60755. -1
  60756. -1
  60757. 7
  60758. -1
  60759. 129
  60760. 0
  60761. 0
  60762. 13
  60763. 5
  60764. 2
  60765. 5
  60766. 1
  60767. 121
  60768. 2
  60769. 5
  60770. 1
  60771. 127
  60772. 2
  60773. 5
  60774. 5
  60775. 2
  60776. 5
  60777. 5
  60778. 2
  60779. 5
  60780. 5
  60781. 2
  60782. 5
  60783. 5
  60784. 2
  60785. 5
  60786. 5
  60787. 2
  60788. 5
  60789. 5
  60790. 2
  60791. 5
  60792. 0
  60793. 0
  60794. 2
  60795. 4
  60796. 4
  60797. 2
  60798. 2
  60799. south
  60800. 2
  60801. s
  60802. 2
  60803. 5
  60804. 5
  60805. 2
  60806. 5
  60807. 4
  60808. 2
  60809. 0
  60810. 0
  60811. 0
  60812. 0
  60813. 2
  60814. 1
  60815. #129
  60816. north
  60817.  
  60818. 0
  60819. 2
  60820. -1
  60821. -1
  60822. -1
  60823. 7
  60824. -1
  60825. 132
  60826. 0
  60827. 0
  60828. 13
  60829. 5
  60830. 2
  60831. 5
  60832. 1
  60833. 127
  60834. 2
  60835. 5
  60836. 1
  60837. 121
  60838. 2
  60839. 5
  60840. 5
  60841. 2
  60842. 5
  60843. 5
  60844. 2
  60845. 5
  60846. 5
  60847. 2
  60848. 5
  60849. 5
  60850. 2
  60851. 5
  60852. 5
  60853. 2
  60854. 5
  60855. 5
  60856. 2
  60857. 5
  60858. 0
  60859. 0
  60860. 2
  60861. 4
  60862. 4
  60863. 2
  60864. 2
  60865. north
  60866. 2
  60867. n
  60868. 2
  60869. 5
  60870. 5
  60871. 2
  60872. 5
  60873. 4
  60874. 2
  60875. 0
  60876. 0
  60877. 0
  60878. 0
  60879. 2
  60880. 1
  60881. #130
  60882. nothing
  60883.  
  60884. 0
  60885. 154
  60886. 143
  60887. -1
  60888. 154
  60889. 5
  60890. -1
  60891. -1
  60892. 0
  60893. 0
  60894. 12
  60895. 5
  60896. 154
  60897. 5
  60898. 5
  60899. 154
  60900. 5
  60901. 5
  60902. 154
  60903. 5
  60904. 5
  60905. 154
  60906. 5
  60907. 5
  60908. 154
  60909. 5
  60910. 5
  60911. 154
  60912. 5
  60913. 5
  60914. 154
  60915. 5
  60916. 5
  60917. 154
  60918. 5
  60919. 0
  60920. 0
  60921. 154
  60922. 4
  60923. 4
  60924. 1
  60925. 2
  60926. nothing
  60927. 154
  60928. 5
  60929. 5
  60930. 154
  60931. 5
  60932. 4
  60933. 2
  60934. 0
  60935. 0
  60936. 0
  60937. 0
  60938. 2
  60939. 1
  60940. #131
  60941. hallway near Bob's cube
  60942.  
  60943. 0
  60944. 2
  60945. -1
  60946. -1
  60947. -1
  60948. 3
  60949. -1
  60950. 134
  60951. 0
  60952. 0
  60953. 17
  60954. 5
  60955. 2
  60956. 5
  60957. 5
  60958. 2
  60959. 5
  60960. 5
  60961. 2
  60962. 5
  60963. 5
  60964. 2
  60965. 5
  60966. 5
  60967. 2
  60968. 5
  60969. 5
  60970. 2
  60971. 5
  60972. 5
  60973. 2
  60974. 5
  60975. 4
  60976. 4
  60977. 1
  60978. 132
  60979. 1
  60980. 136
  60981. 1
  60982. 139
  60983. 1
  60984. 184
  60985. 2
  60986. 4
  60987. 1
  60988. -1
  60989. 2
  60990. 5
  60991. 0
  60992. 14340
  60993. 2
  60994. 5
  60995. 4
  60996. 4
  60997. 1
  60998. 133
  60999. 1
  61000. 135
  61001. 1
  61002. 138
  61003. 1
  61004. 183
  61005. 2
  61006. 4
  61007. 5
  61008. 2
  61009. 5
  61010. 5
  61011. 2
  61012. 5
  61013. 0
  61014. 0
  61015. 2
  61016. 4
  61017. 4
  61018. 1
  61019. 2
  61020. hallway near Bob's cube
  61021. 2
  61022. 5
  61023. 2
  61024. You are in an east-west hallway. There is an opening to the north, and a passage leading south.
  61025. 2
  61026. 5
  61027. 4
  61028. 2
  61029. 0
  61030. 0
  61031. 0
  61032. 0
  61033. 2
  61034. 1
  61035. #132
  61036. west
  61037.  
  61038. 0
  61039. 2
  61040. -1
  61041. -1
  61042. -1
  61043. 7
  61044. -1
  61045. 133
  61046. 0
  61047. 0
  61048. 13
  61049. 5
  61050. 2
  61051. 5
  61052. 1
  61053. 121
  61054. 2
  61055. 5
  61056. 1
  61057. 131
  61058. 2
  61059. 5
  61060. 5
  61061. 2
  61062. 5
  61063. 5
  61064. 2
  61065. 5
  61066. 5
  61067. 2
  61068. 5
  61069. 5
  61070. 2
  61071. 5
  61072. 5
  61073. 2
  61074. 5
  61075. 5
  61076. 2
  61077. 5
  61078. 0
  61079. 0
  61080. 2
  61081. 4
  61082. 4
  61083. 2
  61084. 2
  61085. west
  61086. 2
  61087. w
  61088. 2
  61089. 5
  61090. 5
  61091. 2
  61092. 5
  61093. 4
  61094. 2
  61095. 0
  61096. 0
  61097. 0
  61098. 0
  61099. 2
  61100. 1
  61101. #133
  61102. east
  61103.  
  61104. 0
  61105. 2
  61106. -1
  61107. -1
  61108. -1
  61109. 7
  61110. -1
  61111. 135
  61112. 0
  61113. 0
  61114. 13
  61115. 5
  61116. 2
  61117. 5
  61118. 1
  61119. 131
  61120. 2
  61121. 5
  61122. 1
  61123. 121
  61124. 2
  61125. 5
  61126. 5
  61127. 2
  61128. 5
  61129. 5
  61130. 2
  61131. 5
  61132. 5
  61133. 2
  61134. 5
  61135. 5
  61136. 2
  61137. 5
  61138. 5
  61139. 2
  61140. 5
  61141. 5
  61142. 2
  61143. 5
  61144. 0
  61145. 0
  61146. 2
  61147. 4
  61148. 4
  61149. 2
  61150. 2
  61151. east
  61152. 2
  61153. e
  61154. 2
  61155. 5
  61156. 5
  61157. 2
  61158. 5
  61159. 4
  61160. 2
  61161. 0
  61162. 0
  61163. 0
  61164. 0
  61165. 2
  61166. 1
  61167. #134
  61168. Bob Barnes' Cube
  61169.  
  61170. 0
  61171. 2
  61172. -1
  61173. -1
  61174. -1
  61175. 3
  61176. -1
  61177. 137
  61178. 0
  61179. 0
  61180. 17
  61181. 5
  61182. 2
  61183. 5
  61184. 5
  61185. 2
  61186. 5
  61187. 5
  61188. 2
  61189. 5
  61190. 5
  61191. 2
  61192. 5
  61193. 5
  61194. 2
  61195. 5
  61196. 5
  61197. 2
  61198. 5
  61199. 5
  61200. 2
  61201. 5
  61202. 4
  61203. 1
  61204. 1
  61205. 135
  61206. 2
  61207. 4
  61208. 1
  61209. -1
  61210. 2
  61211. 5
  61212. 0
  61213. 16633
  61214. 2
  61215. 5
  61216. 4
  61217. 1
  61218. 1
  61219. 136
  61220. 2
  61221. 4
  61222. 5
  61223. 2
  61224. 5
  61225. 5
  61226. 2
  61227. 5
  61228. 0
  61229. 0
  61230. 2
  61231. 4
  61232. 4
  61233. 1
  61234. 2
  61235. Bob Barnes' Cube
  61236. 2
  61237. 5
  61238. 2
  61239. You are in Bob Barnes cube. There is an exit to the south.
  61240. 2
  61241. 5
  61242. 4
  61243. 2
  61244. 0
  61245. 0
  61246. 0
  61247. 0
  61248. 2
  61249. 1
  61250. #135
  61251. north
  61252.  
  61253. 0
  61254. 2
  61255. -1
  61256. -1
  61257. -1
  61258. 7
  61259. -1
  61260. 136
  61261. 0
  61262. 0
  61263. 13
  61264. 5
  61265. 2
  61266. 5
  61267. 1
  61268. 131
  61269. 2
  61270. 5
  61271. 1
  61272. 134
  61273. 2
  61274. 5
  61275. 5
  61276. 2
  61277. 5
  61278. 5
  61279. 2
  61280. 5
  61281. 5
  61282. 2
  61283. 5
  61284. 5
  61285. 2
  61286. 5
  61287. 5
  61288. 2
  61289. 5
  61290. 5
  61291. 2
  61292. 5
  61293. 0
  61294. 0
  61295. 2
  61296. 4
  61297. 4
  61298. 2
  61299. 2
  61300. north
  61301. 2
  61302. n
  61303. 2
  61304. 5
  61305. 5
  61306. 2
  61307. 5
  61308. 4
  61309. 2
  61310. 0
  61311. 0
  61312. 0
  61313. 0
  61314. 2
  61315. 1
  61316. #136
  61317. south
  61318.  
  61319. 0
  61320. 2
  61321. -1
  61322. -1
  61323. -1
  61324. 7
  61325. -1
  61326. 138
  61327. 0
  61328. 0
  61329. 13
  61330. 5
  61331. 2
  61332. 5
  61333. 1
  61334. 134
  61335. 2
  61336. 5
  61337. 1
  61338. 131
  61339. 2
  61340. 5
  61341. 5
  61342. 2
  61343. 5
  61344. 5
  61345. 2
  61346. 5
  61347. 5
  61348. 2
  61349. 5
  61350. 5
  61351. 2
  61352. 5
  61353. 5
  61354. 2
  61355. 5
  61356. 5
  61357. 2
  61358. 5
  61359. 0
  61360. 0
  61361. 2
  61362. 4
  61363. 4
  61364. 2
  61365. 2
  61366. south
  61367. 2
  61368. s
  61369. 2
  61370. 5
  61371. 5
  61372. 2
  61373. 5
  61374. 4
  61375. 2
  61376. 0
  61377. 0
  61378. 0
  61379. 0
  61380. 2
  61381. 1
  61382. #137
  61383. hallway near Jeff's cube
  61384.  
  61385. 0
  61386. 2
  61387. -1
  61388. -1
  61389. -1
  61390. 3
  61391. -1
  61392. 140
  61393. 0
  61394. 0
  61395. 17
  61396. 5
  61397. 2
  61398. 5
  61399. 5
  61400. 2
  61401. 5
  61402. 5
  61403. 2
  61404. 5
  61405. 5
  61406. 2
  61407. 5
  61408. 5
  61409. 2
  61410. 5
  61411. 5
  61412. 2
  61413. 5
  61414. 5
  61415. 2
  61416. 5
  61417. 4
  61418. 4
  61419. 1
  61420. 138
  61421. 1
  61422. 142
  61423. 1
  61424. 150
  61425. 1
  61426. 227
  61427. 2
  61428. 4
  61429. 1
  61430. -1
  61431. 2
  61432. 5
  61433. 0
  61434. 12182
  61435. 2
  61436. 5
  61437. 4
  61438. 4
  61439. 1
  61440. 139
  61441. 1
  61442. 141
  61443. 1
  61444. 149
  61445. 1
  61446. 226
  61447. 2
  61448. 4
  61449. 5
  61450. 2
  61451. 5
  61452. 5
  61453. 2
  61454. 5
  61455. 0
  61456. 0
  61457. 2
  61458. 4
  61459. 4
  61460. 1
  61461. 2
  61462. hallway near Jeff's cube
  61463. 2
  61464. 5
  61465. 2
  61466. you are in an east-west hallway. There are openings to the north and south.
  61467. 2
  61468. 5
  61469. 4
  61470. 2
  61471. 0
  61472. 0
  61473. 0
  61474. 0
  61475. 2
  61476. 1
  61477. #138
  61478. west
  61479.  
  61480. 0
  61481. 2
  61482. -1
  61483. -1
  61484. -1
  61485. 7
  61486. -1
  61487. 139
  61488. 0
  61489. 0
  61490. 13
  61491. 5
  61492. 2
  61493. 5
  61494. 1
  61495. 131
  61496. 2
  61497. 5
  61498. 1
  61499. 137
  61500. 2
  61501. 5
  61502. 5
  61503. 2
  61504. 5
  61505. 5
  61506. 2
  61507. 5
  61508. 5
  61509. 2
  61510. 5
  61511. 5
  61512. 2
  61513. 5
  61514. 5
  61515. 2
  61516. 5
  61517. 5
  61518. 2
  61519. 5
  61520. 0
  61521. 0
  61522. 2
  61523. 4
  61524. 4
  61525. 2
  61526. 2
  61527. west
  61528. 2
  61529. w
  61530. 2
  61531. 5
  61532. 5
  61533. 2
  61534. 5
  61535. 4
  61536. 2
  61537. 0
  61538. 0
  61539. 0
  61540. 0
  61541. 2
  61542. 1
  61543. #139
  61544. east
  61545.  
  61546. 0
  61547. 2
  61548. -1
  61549. -1
  61550. -1
  61551. 7
  61552. -1
  61553. 141
  61554. 0
  61555. 0
  61556. 13
  61557. 5
  61558. 2
  61559. 5
  61560. 1
  61561. 137
  61562. 2
  61563. 5
  61564. 1
  61565. 131
  61566. 2
  61567. 5
  61568. 5
  61569. 2
  61570. 5
  61571. 5
  61572. 2
  61573. 5
  61574. 5
  61575. 2
  61576. 5
  61577. 5
  61578. 2
  61579. 5
  61580. 5
  61581. 2
  61582. 5
  61583. 5
  61584. 2
  61585. 5
  61586. 0
  61587. 0
  61588. 2
  61589. 4
  61590. 4
  61591. 2
  61592. 2
  61593. east
  61594. 2
  61595. e
  61596. 2
  61597. 5
  61598. 5
  61599. 2
  61600. 5
  61601. 4
  61602. 2
  61603. 0
  61604. 0
  61605. 0
  61606. 0
  61607. 2
  61608. 1
  61609. #140
  61610. Jeff's Cube
  61611.  
  61612. 0
  61613. 2
  61614. -1
  61615. 79
  61616. -1
  61617. 3
  61618. -1
  61619. 143
  61620. 0
  61621. 0
  61622. 17
  61623. 5
  61624. 2
  61625. 5
  61626. 5
  61627. 2
  61628. 5
  61629. 5
  61630. 2
  61631. 5
  61632. 5
  61633. 2
  61634. 5
  61635. 5
  61636. 2
  61637. 5
  61638. 4
  61639. 1
  61640. 1
  61641. 79
  61642. 2
  61643. 5
  61644. 5
  61645. 2
  61646. 5
  61647. 4
  61648. 1
  61649. 1
  61650. 141
  61651. 2
  61652. 4
  61653. 1
  61654. -1
  61655. 2
  61656. 5
  61657. 0
  61658. 12742
  61659. 2
  61660. 5
  61661. 4
  61662. 1
  61663. 1
  61664. 142
  61665. 2
  61666. 4
  61667. 5
  61668. 2
  61669. 5
  61670. 5
  61671. 2
  61672. 5
  61673. 0
  61674. 0
  61675. 2
  61676. 4
  61677. 4
  61678. 1
  61679. 2
  61680. Jeff's Cube
  61681. 2
  61682. 5
  61683. 2
  61684. Someone has been cleaning up in here.  You can actually see the blue carpeting in some spots.  Sticky paper has been placed under the desk to catch unsuspecting rodents.
  61685. 2
  61686. 5
  61687. 4
  61688. 2
  61689. 0
  61690. 0
  61691. 0
  61692. 0
  61693. 2
  61694. 1
  61695. #141
  61696. north
  61697.  
  61698. 0
  61699. 2
  61700. -1
  61701. -1
  61702. -1
  61703. 7
  61704. -1
  61705. 142
  61706. 0
  61707. 0
  61708. 13
  61709. 5
  61710. 2
  61711. 5
  61712. 1
  61713. 137
  61714. 2
  61715. 5
  61716. 1
  61717. 140
  61718. 2
  61719. 5
  61720. 5
  61721. 2
  61722. 5
  61723. 5
  61724. 2
  61725. 5
  61726. 5
  61727. 2
  61728. 5
  61729. 5
  61730. 2
  61731. 5
  61732. 5
  61733. 2
  61734. 5
  61735. 5
  61736. 2
  61737. 5
  61738. 0
  61739. 0
  61740. 2
  61741. 4
  61742. 4
  61743. 2
  61744. 2
  61745. north
  61746. 2
  61747. n
  61748. 2
  61749. 5
  61750. 5
  61751. 2
  61752. 5
  61753. 4
  61754. 2
  61755. 0
  61756. 0
  61757. 0
  61758. 0
  61759. 2
  61760. 1
  61761. #142
  61762. south
  61763.  
  61764. 0
  61765. 2
  61766. -1
  61767. -1
  61768. -1
  61769. 7
  61770. -1
  61771. 149
  61772. 0
  61773. 0
  61774. 13
  61775. 5
  61776. 2
  61777. 5
  61778. 1
  61779. 140
  61780. 2
  61781. 5
  61782. 1
  61783. 137
  61784. 2
  61785. 5
  61786. 5
  61787. 2
  61788. 5
  61789. 5
  61790. 2
  61791. 5
  61792. 5
  61793. 2
  61794. 5
  61795. 5
  61796. 2
  61797. 5
  61798. 5
  61799. 2
  61800. 5
  61801. 5
  61802. 2
  61803. 5
  61804. 0
  61805. 0
  61806. 2
  61807. 4
  61808. 4
  61809. 2
  61810. 2
  61811. south
  61812. 2
  61813. s
  61814. 2
  61815. 5
  61816. 5
  61817. 2
  61818. 5
  61819. 4
  61820. 2
  61821. 0
  61822. 0
  61823. 0
  61824. 0
  61825. 2
  61826. 1
  61827. #143
  61828. Mark's Cube
  61829.  
  61830. 0
  61831. 2
  61832. -1
  61833. 130
  61834. -1
  61835. 3
  61836. -1
  61837. 148
  61838. 0
  61839. 0
  61840. 17
  61841. 5
  61842. 2
  61843. 5
  61844. 5
  61845. 2
  61846. 5
  61847. 5
  61848. 2
  61849. 5
  61850. 5
  61851. 2
  61852. 5
  61853. 5
  61854. 2
  61855. 5
  61856. 4
  61857. 1
  61858. 1
  61859. 154
  61860. 2
  61861. 5
  61862. 5
  61863. 2
  61864. 5
  61865. 4
  61866. 1
  61867. 1
  61868. 225
  61869. 2
  61870. 4
  61871. 1
  61872. -1
  61873. 2
  61874. 5
  61875. 0
  61876. 14350
  61877. 2
  61878. 5
  61879. 4
  61880. 1
  61881. 1
  61882. 145
  61883. 2
  61884. 4
  61885. 5
  61886. 2
  61887. 5
  61888. 5
  61889. 2
  61890. 5
  61891. 0
  61892. 0
  61893. 2
  61894. 4
  61895. 4
  61896. 1
  61897. 2
  61898. Mark's Cube
  61899. 2
  61900. 5
  61901. 4
  61902. 1
  61903. 2
  61904. An empty cubicle.  There was someone here, but no more.
  61905. 2
  61906. 5
  61907. 4
  61908. 2
  61909. 0
  61910. 0
  61911. 0
  61912. 0
  61913. 2
  61914. 1
  61915. #144
  61916. Empty Cube
  61917.  
  61918. 0
  61919. 2
  61920. -1
  61921. -1
  61922. -1
  61923. 3
  61924. -1
  61925. 229
  61926. 0
  61927. 0
  61928. 17
  61929. 5
  61930. 2
  61931. 5
  61932. 5
  61933. 2
  61934. 5
  61935. 5
  61936. 2
  61937. 5
  61938. 5
  61939. 2
  61940. 5
  61941. 5
  61942. 2
  61943. 5
  61944. 5
  61945. 2
  61946. 5
  61947. 5
  61948. 2
  61949. 5
  61950. 4
  61951. 1
  61952. 1
  61953. 226
  61954. 2
  61955. 4
  61956. 1
  61957. -1
  61958. 2
  61959. 5
  61960. 0
  61961. 6483
  61962. 2
  61963. 5
  61964. 4
  61965. 1
  61966. 1
  61967. 227
  61968. 2
  61969. 4
  61970. 5
  61971. 2
  61972. 5
  61973. 5
  61974. 2
  61975. 5
  61976. 0
  61977. 0
  61978. 2
  61979. 4
  61980. 4
  61981. 1
  61982. 2
  61983. Empty Cube
  61984. 2
  61985. 5
  61986. 5
  61987. 2
  61988. 5
  61989. 4
  61990. 2
  61991. 0
  61992. 0
  61993. 0
  61994. 0
  61995. 2
  61996. 1
  61997. #145
  61998. north
  61999.  
  62000. 0
  62001. 2
  62002. -1
  62003. -1
  62004. -1
  62005. 7
  62006. -1
  62007. 226
  62008. 0
  62009. 0
  62010. 13
  62011. 5
  62012. 2
  62013. 5
  62014. 1
  62015. 143
  62016. 2
  62017. 5
  62018. 1
  62019. 148
  62020. 2
  62021. 5
  62022. 5
  62023. 2
  62024. 5
  62025. 5
  62026. 2
  62027. 5
  62028. 5
  62029. 2
  62030. 5
  62031. 5
  62032. 2
  62033. 5
  62034. 5
  62035. 2
  62036. 5
  62037. 5
  62038. 2
  62039. 5
  62040. 0
  62041. 0
  62042. 2
  62043. 4
  62044. 4
  62045. 3
  62046. 2
  62047. north
  62048. 2
  62049. n
  62050. 2
  62051. out
  62052. 2
  62053. 5
  62054. 5
  62055. 2
  62056. 5
  62057. 4
  62058. 2
  62059. 0
  62060. 0
  62061. 0
  62062. 0
  62063. 2
  62064. 1
  62065. #146
  62066. south
  62067.  
  62068. 0
  62069. 2
  62070. -1
  62071. -1
  62072. -1
  62073. 7
  62074. -1
  62075. 78
  62076. 0
  62077. 0
  62078. 13
  62079. 5
  62080. 2
  62081. 5
  62082. 1
  62083. 106
  62084. 2
  62085. 5
  62086. 1
  62087. 156
  62088. 2
  62089. 5
  62090. 5
  62091. 2
  62092. 5
  62093. 5
  62094. 2
  62095. 5
  62096. 5
  62097. 2
  62098. 5
  62099. 5
  62100. 2
  62101. 5
  62102. 5
  62103. 2
  62104. 5
  62105. 5
  62106. 2
  62107. 5
  62108. 0
  62109. 0
  62110. 2
  62111. 4
  62112. 4
  62113. 2
  62114. 2
  62115. south
  62116. 2
  62117. s
  62118. 2
  62119. 5
  62120. 5
  62121. 2
  62122. 5
  62123. 4
  62124. 2
  62125. 0
  62126. 0
  62127. 0
  62128. 0
  62129. 2
  62130. 1
  62131. #147
  62132. LiverSpot
  62133.  
  62134. 7
  62135. 147
  62136. 124
  62137. 307
  62138. -1
  62139. 58
  62140. -1
  62141. -1
  62142. 2
  62143. GetShelby
  62144. 147
  62145. 9
  62146. -1
  62147. eat
  62148. 147
  62149. 25
  62150. -1
  62151. 0
  62152. 69
  62153. 5
  62154. 147
  62155. 5
  62156. 5
  62157. 147
  62158. 5
  62159. 5
  62160. 147
  62161. 5
  62162. 5
  62163. 147
  62164. 5
  62165. 5
  62166. 147
  62167. 5
  62168. 5
  62169. 147
  62170. 5
  62171. 5
  62172. 147
  62173. 5
  62174. 5
  62175. 147
  62176. 4
  62177. 5
  62178. 38
  62179. 1
  62180. 5
  62181. 147
  62182. 5
  62183. 5
  62184. 147
  62185. 5
  62186. 5
  62187. 147
  62188. 5
  62189. 5
  62190. 147
  62191. 5
  62192. 5
  62193. 38
  62194. 1
  62195. 4
  62196. 2
  62197. 0
  62198. 750802956
  62199. 2
  62200. John_Louch@Spot.Orion
  62201. 2
  62202. 0
  62203. 5
  62204. 147
  62205. 5
  62206. 2
  62207. ORION
  62208. 2
  62209. 0
  62210. 0
  62211. 750845953
  62212. 2
  62213. 1
  62214. 0
  62215. 0
  62216. 147
  62217. 5
  62218. 5
  62219. 147
  62220. 5
  62221. 4
  62222. 2
  62223. 0
  62224. 15259
  62225. 0
  62226. 15259
  62227. 38
  62228. 1
  62229. 0
  62230. 0
  62231. 38
  62232. 1
  62233. 4
  62234. 68
  62235. 2
  62236.   @dump-d*atabase
  62237. 2
  62238.   @who-calls <anything>
  62239. 2
  62240.   mcd_2
  62241. 2
  62242.   @toad/@toad!/@toad!! <anything>
  62243. 2
  62244.   @untoad/@detoad <anything>
  62245. 2
  62246.   @quota <anything> is <anything>
  62247. 2
  62248.   @players <anything>
  62249. 2
  62250.   @grepcore/@egrepcore <anything>
  62251. 2
  62252.   @net-who/@@who <anything>
  62253. 2
  62254.   @make-player <anything>
  62255. 2
  62256.   @abort-sh*utdown <anything>
  62257. 2
  62258.   @newt <anything>
  62259. 2
  62260.   @unnewt/@denewt/@get-better <anything>
  62261. 2
  62262.   @register <anything>
  62263. 2
  62264.   @new-password/@newpassword <anything> is <anything>
  62265. 2
  62266.   @log <anything>
  62267. 2
  62268.   @guests <anything>
  62269. 2
  62270.   @rn/mail_catch_up/check_mail_lists/current_message/set_current_message/get_current_message/make_current_message/kill_current_message
  62271. 2
  62272.   @blacklist/@graylist/@redlist/@unblacklist/@ungraylist/@unredlist/@spooflist/@unspooflist <anything>
  62273. 2
  62274.   @corify <anything> as <anything>
  62275. 2
  62276.   @make-guest <anything>
  62277. 2
  62278.   @quota <anything>
  62279. 2
  62280.   @create <anything>
  62281. 2
  62282.   @recycle <anything>
  62283. 2
  62284.   @recreate <anything> as <anything>
  62285. 2
  62286.   @dig <anything>
  62287. 2
  62288.   @audit <anything>
  62289. 2
  62290.   @auditDB <anything>
  62291. 2
  62292.   @count <anything>
  62293. 2
  62294.   @countDB <anything>
  62295. 2
  62296.   @sort-owned*-objects
  62297. 2
  62298.   @add-owned <anything>
  62299. 2
  62300.   @verify-owned
  62301. 2
  62302.   @unlock <anything>
  62303. 2
  62304.   @lock <anything> with <anything>
  62305. 2
  62306.   @newmess*age <anything>
  62307. 2
  62308.   @unmess*age <anything>
  62309. 2
  62310.   @kids <anything>
  62311. 2
  62312.   @contents <anything>
  62313. 2
  62314.   @par*ents <anything>
  62315. 2
  62316.   @location*s <anything>
  62317. 2
  62318.   @realm <anything>
  62319. 2
  62320.   @cl*asses <anything>
  62321. 2
  62322.   @chparent <anything> to <anything>
  62323. 2
  62324.   @check-chp*arent <anything> to <anything>
  62325. 2
  62326.   @set*prop <anything> to <anything>
  62327. 2
  62328. I don't understand that.
  62329. 2
  62330. I don't understand that.
  62331. 2
  62332. Syntax:  @more
  62333. 2
  62334.          @more rest
  62335. 2
  62336.          @more flush
  62337. 2
  62338.  
  62339. 2
  62340. If you have @pagelength set (see `help @pagelength') and some combination of events or commands produces sufficiently many lines of output, you will see a message of the form
  62341. 2
  62342.  
  62343. 2
  62344. *** More ***  37 lines left.  Do @more [rest|flush] for more.
  62345. 2
  62346.  
  62347. 2
  62348. indicating (in this case) 37 more lines of text waiting to be read.  
  62349. 2
  62350. At this point, you should give one of the @more commands above.  
  62351. 2
  62352.  
  62353. 2
  62354. @more without arguments prints sufficiently many lines to fill your screen,
  62355. 2
  62356. assuming you've set @pagelength correctly, unless there are not that many
  62357. 2
  62358. lines left to print.
  62359. 2
  62360.  
  62361. 2
  62362. @more rest will print all of the remaining lines, regardless of your @pagelength setting.  
  62363. 2
  62364.  
  62365. 2
  62366. @more flush discards all remaining lines
  62367. 2
  62368. I don't understand that.
  62369. 2
  62370. I don't understand that.
  62371. 38
  62372. 0
  62373. 0
  62374. 0
  62375. 38
  62376. 1
  62377. 0
  62378. 7369
  62379. 147
  62380. 5
  62381. 4
  62382. 9
  62383. 1
  62384. 147
  62385. 1
  62386. 307
  62387. 1
  62388. 330
  62389. 1
  62390. 331
  62391. 1
  62392. 332
  62393. 1
  62394. 336
  62395. 1
  62396. 345
  62397. 1
  62398. 124
  62399. 1
  62400. 433
  62401. 2
  62402. 1
  62403. 5
  62404. 38
  62405. 1
  62406. 1
  62407. 147
  62408. 147
  62409. 4
  62410. 4
  62411. 8
  62412. 2
  62413. John_Louch@LiverSpot.E.T._Phone_Home
  62414. 2
  62415. John_Louch@Spot.Orion
  62416. 2
  62417. Bob_Monsen@Sartre.Orion
  62418. 2
  62419. John_Louch@Sartre.Orion
  62420. 2
  62421. John_Louch@murdock.Orion
  62422. 2
  62423. uest@Red_Cloud.Orion
  62424. 2
  62425. John_Louch@Dalmation.Orion
  62426. 2
  62427. John_Louch@Red_Cloud.Orion
  62428. 2
  62429. 0
  62430. 2
  62431. John_Louch@LiverSpot.E.T._Phone_Home
  62432. 2
  62433. 0
  62434. 5
  62435. 147
  62436. 5
  62437. 4
  62438. 0
  62439. 147
  62440. 4
  62441. 5
  62442. 147
  62443. 5
  62444. 5
  62445. 147
  62446. 4
  62447. 5
  62448. 147
  62449. 4
  62450. 5
  62451. 147
  62452. 5
  62453. 5
  62454. 147
  62455. 5
  62456. 5
  62457. 147
  62458. 5
  62459. 5
  62460. 147
  62461. 5
  62462. 5
  62463. 147
  62464. 5
  62465. 5
  62466. 147
  62467. 5
  62468. 5
  62469. 147
  62470. 5
  62471. 5
  62472. 147
  62473. 5
  62474. 5
  62475. 147
  62476. 5
  62477. 4
  62478. 2
  62479. 0
  62480. 3
  62481. 0
  62482. 750804635
  62483. 147
  62484. 4
  62485. 4
  62486. 3
  62487. 4
  62488. 2
  62489. 0
  62490. 1
  62491. 4
  62492. 7
  62493. 0
  62494. -1464115030
  62495. 2
  62496. Bob (#2)
  62497. 2
  62498. LiverSpot (#147)
  62499. 2
  62500. Enhancement Request
  62501. 2
  62502.  
  62503. 2
  62504. Add a carrage return at the end of the text in programmers mode, if there 
  62505. 2
  62506. isn't already one
  62507. 4
  62508. 2
  62509. 0
  62510. 2
  62511. 4
  62512. 6
  62513. 0
  62514. -1462982071
  62515. 2
  62516. Bob (#2)
  62517. 2
  62518. LiverSpot (#147)
  62519. 2
  62520. foo
  62521. 2
  62522.  
  62523. 2
  62524. xxx
  62525. 4
  62526. 2
  62527. 0
  62528. 3
  62529. 4
  62530. 7
  62531. 0
  62532. 750804635
  62533. 2
  62534. Bob (#2)
  62535. 2
  62536. LiverSpot (#147)
  62537. 2
  62538. TCP/IP!
  62539. 2
  62540.  
  62541. 2
  62542. Now, the client needs it...
  62543. 2
  62544. (I'm typing this from apple.com)
  62545. 147
  62546. 4
  62547. 0
  62548. 750845852
  62549. 2
  62550. 1
  62551. 0
  62552. 19
  62553. 2
  62554. 0
  62555. 5
  62556. 147
  62557. 5
  62558. 5
  62559. 147
  62560. 5
  62561. 5
  62562. 147
  62563. 5
  62564. 5
  62565. 147
  62566. 5
  62567. 5
  62568. 147
  62569. 5
  62570. 5
  62571. 147
  62572. 5
  62573. 5
  62574. 147
  62575. 5
  62576. 5
  62577. 147
  62578. 5
  62579. 5
  62580. 147
  62581. 5
  62582. 1
  62583. 124
  62584. 147
  62585. 5
  62586. 0
  62587. 0
  62588. 2
  62589. 0
  62590. 5
  62591. 147
  62592. 5
  62593. 5
  62594. 147
  62595. 5
  62596. 5
  62597. 147
  62598. 5
  62599. 5
  62600. 147
  62601. 5
  62602. 5
  62603. 147
  62604. 5
  62605. 0
  62606. -1465067603
  62607. 2
  62608. 1
  62609. 0
  62610. 0
  62611. 147
  62612. 4
  62613. 4
  62614. 2
  62615. 2
  62616. LiverSpot
  62617. 2
  62618. John_Louch
  62619. 2
  62620. 1
  62621. 4
  62622. 2
  62623. 2
  62624. A liver spotted dalmation with soft brown ears, tan eyes, and an enormous pink tounge
  62625. 2
  62626. He is lounging around on the floor.
  62627. 147
  62628. 5
  62629. 4
  62630. 2
  62631. 0
  62632. 0
  62633. 0
  62634. 0
  62635. 2
  62636. 1
  62637. #148
  62638. hallway near Steve's office
  62639.  
  62640. 0
  62641. 2
  62642. -1
  62643. -1
  62644. -1
  62645. 3
  62646. -1
  62647. 151
  62648. 0
  62649. 0
  62650. 17
  62651. 5
  62652. 2
  62653. 5
  62654. 5
  62655. 2
  62656. 5
  62657. 5
  62658. 2
  62659. 5
  62660. 5
  62661. 2
  62662. 5
  62663. 5
  62664. 2
  62665. 5
  62666. 5
  62667. 2
  62668. 5
  62669. 5
  62670. 2
  62671. 5
  62672. 4
  62673. 4
  62674. 1
  62675. 149
  62676. 1
  62677. 153
  62678. 1
  62679. 223
  62680. 1
  62681. 145
  62682. 2
  62683. 4
  62684. 1
  62685. -1
  62686. 2
  62687. 5
  62688. 0
  62689. 17347
  62690. 2
  62691. 5
  62692. 4
  62693. 4
  62694. 1
  62695. 150
  62696. 1
  62697. 152
  62698. 1
  62699. 224
  62700. 1
  62701. 225
  62702. 2
  62703. 4
  62704. 5
  62705. 2
  62706. 5
  62707. 5
  62708. 2
  62709. 5
  62710. 0
  62711. 0
  62712. 2
  62713. 4
  62714. 4
  62715. 1
  62716. 2
  62717. hallway near Steve's office
  62718. 2
  62719. 5
  62720. 4
  62721. 1
  62722. 2
  62723. You are in an east-west hallway. There are openings to the north and south.
  62724. 2
  62725. 5
  62726. 4
  62727. 2
  62728. 0
  62729. 0
  62730. 0
  62731. 0
  62732. 2
  62733. 1
  62734. #149
  62735. west
  62736.  
  62737. 0
  62738. 2
  62739. -1
  62740. -1
  62741. -1
  62742. 7
  62743. -1
  62744. 150
  62745. 0
  62746. 0
  62747. 13
  62748. 5
  62749. 2
  62750. 5
  62751. 1
  62752. 137
  62753. 2
  62754. 5
  62755. 1
  62756. 148
  62757. 2
  62758. 5
  62759. 5
  62760. 2
  62761. 5
  62762. 5
  62763. 2
  62764. 5
  62765. 5
  62766. 2
  62767. 5
  62768. 5
  62769. 2
  62770. 5
  62771. 5
  62772. 2
  62773. 5
  62774. 5
  62775. 2
  62776. 5
  62777. 0
  62778. 0
  62779. 2
  62780. 4
  62781. 4
  62782. 2
  62783. 2
  62784. west
  62785. 2
  62786. w
  62787. 2
  62788. 5
  62789. 5
  62790. 2
  62791. 5
  62792. 4
  62793. 2
  62794. 0
  62795. 0
  62796. 0
  62797. 0
  62798. 2
  62799. 1
  62800. #150
  62801. east
  62802.  
  62803. 0
  62804. 2
  62805. -1
  62806. -1
  62807. -1
  62808. 7
  62809. -1
  62810. 152
  62811. 0
  62812. 0
  62813. 13
  62814. 5
  62815. 2
  62816. 5
  62817. 1
  62818. 148
  62819. 2
  62820. 5
  62821. 1
  62822. 137
  62823. 2
  62824. 5
  62825. 5
  62826. 2
  62827. 5
  62828. 5
  62829. 2
  62830. 5
  62831. 5
  62832. 2
  62833. 5
  62834. 5
  62835. 2
  62836. 5
  62837. 5
  62838. 2
  62839. 5
  62840. 5
  62841. 2
  62842. 5
  62843. 0
  62844. 0
  62845. 2
  62846. 4
  62847. 4
  62848. 2
  62849. 2
  62850. east
  62851. 2
  62852. e
  62853. 2
  62854. 5
  62855. 5
  62856. 2
  62857. 5
  62858. 4
  62859. 2
  62860. 0
  62861. 0
  62862. 0
  62863. 0
  62864. 2
  62865. 1
  62866. #151
  62867. Steve's Office
  62868.  
  62869. 0
  62870. 2
  62871. -1
  62872. 326
  62873. -1
  62874. 3
  62875. -1
  62876. 156
  62877. 0
  62878. 0
  62879. 17
  62880. 5
  62881. 2
  62882. 5
  62883. 5
  62884. 2
  62885. 5
  62886. 5
  62887. 2
  62888. 5
  62889. 5
  62890. 2
  62891. 5
  62892. 5
  62893. 2
  62894. 5
  62895. 5
  62896. 2
  62897. 5
  62898. 5
  62899. 2
  62900. 5
  62901. 4
  62902. 1
  62903. 1
  62904. 152
  62905. 2
  62906. 4
  62907. 1
  62908. -1
  62909. 2
  62910. 5
  62911. 0
  62912. 16842
  62913. 2
  62914. 5
  62915. 4
  62916. 1
  62917. 1
  62918. 153
  62919. 2
  62920. 4
  62921. 5
  62922. 2
  62923. 5
  62924. 5
  62925. 2
  62926. 5
  62927. 0
  62928. 0
  62929. 2
  62930. 4
  62931. 4
  62932. 1
  62933. 2
  62934. Steve's Office
  62935. 2
  62936. 5
  62937. 2
  62938. This is Steve Berl's office. There is an opening to the south.
  62939. 2
  62940. 5
  62941. 4
  62942. 2
  62943. 0
  62944. 0
  62945. 0
  62946. 0
  62947. 2
  62948. 1
  62949. #152
  62950. north
  62951.  
  62952. 0
  62953. 2
  62954. -1
  62955. -1
  62956. -1
  62957. 7
  62958. -1
  62959. 153
  62960. 0
  62961. 0
  62962. 13
  62963. 5
  62964. 2
  62965. 5
  62966. 1
  62967. 148
  62968. 2
  62969. 5
  62970. 1
  62971. 151
  62972. 2
  62973. 5
  62974. 5
  62975. 2
  62976. 5
  62977. 5
  62978. 2
  62979. 5
  62980. 5
  62981. 2
  62982. 5
  62983. 5
  62984. 2
  62985. 5
  62986. 5
  62987. 2
  62988. 5
  62989. 5
  62990. 2
  62991. 5
  62992. 0
  62993. 0
  62994. 2
  62995. 4
  62996. 4
  62997. 2
  62998. 2
  62999. north
  63000. 2
  63001. n
  63002. 2
  63003. 5
  63004. 5
  63005. 2
  63006. 5
  63007. 4
  63008. 2
  63009. 0
  63010. 0
  63011. 0
  63012. 0
  63013. 2
  63014. 1
  63015. #153
  63016. south
  63017.  
  63018. 0
  63019. 2
  63020. -1
  63021. -1
  63022. -1
  63023. 7
  63024. -1
  63025. 146
  63026. 0
  63027. 0
  63028. 13
  63029. 5
  63030. 2
  63031. 5
  63032. 1
  63033. 151
  63034. 2
  63035. 5
  63036. 1
  63037. 148
  63038. 2
  63039. 5
  63040. 5
  63041. 2
  63042. 5
  63043. 5
  63044. 2
  63045. 5
  63046. 5
  63047. 2
  63048. 5
  63049. 5
  63050. 2
  63051. 5
  63052. 5
  63053. 2
  63054. 5
  63055. 5
  63056. 2
  63057. 5
  63058. 0
  63059. 0
  63060. 2
  63061. 4
  63062. 4
  63063. 2
  63064. 2
  63065. south
  63066. 2
  63067. s
  63068. 2
  63069. 5
  63070. 5
  63071. 2
  63072. 5
  63073. 4
  63074. 2
  63075. 0
  63076. 0
  63077. 0
  63078. 0
  63079. 2
  63080. 1
  63081. #154
  63082. Mark
  63083.  
  63084. 7
  63085. 154
  63086. 143
  63087. -1
  63088. -1
  63089. 58
  63090. -1
  63091. 228
  63092. 0
  63093. 0
  63094. 69
  63095. 5
  63096. 154
  63097. 5
  63098. 5
  63099. 154
  63100. 5
  63101. 5
  63102. 154
  63103. 5
  63104. 5
  63105. 154
  63106. 5
  63107. 5
  63108. 154
  63109. 5
  63110. 5
  63111. 154
  63112. 5
  63113. 5
  63114. 154
  63115. 5
  63116. 5
  63117. 154
  63118. 4
  63119. 5
  63120. 38
  63121. 1
  63122. 5
  63123. 154
  63124. 5
  63125. 5
  63126. 154
  63127. 5
  63128. 5
  63129. 154
  63130. 5
  63131. 5
  63132. 154
  63133. 5
  63134. 5
  63135. 38
  63136. 1
  63137. 4
  63138. 2
  63139. 0
  63140. 750802956
  63141. 2
  63142. LocalUser@LocalMachine.LocalZone
  63143. 2
  63144. 0
  63145. 5
  63146. 154
  63147. 5
  63148. 2
  63149. Orion
  63150. 2
  63151. 0
  63152. 0
  63153. 750853352
  63154. 2
  63155. 1
  63156. 0
  63157. 0
  63158. 154
  63159. 5
  63160. 5
  63161. 154
  63162. 5
  63163. 5
  63164. 38
  63165. 1
  63166. 5
  63167. 38
  63168. 1
  63169. 5
  63170. 38
  63171. 0
  63172. 5
  63173. 38
  63174. 1
  63175. 0
  63176. 13508
  63177. 154
  63178. 5
  63179. 4
  63180. 2
  63181. 1
  63182. 154
  63183. 1
  63184. 130
  63185. 2
  63186. 1
  63187. 5
  63188. 38
  63189. 1
  63190. 1
  63191. 154
  63192. 154
  63193. 4
  63194. 4
  63195. 8
  63196. 2
  63197. foobar@apple.com
  63198. 2
  63199. LocalUser@LocalMachine.LocalZone
  63200. 2
  63201. Mark_Pesce@Sense/Net.Orion
  63202. 2
  63203. Bob_Monsen@Hawksbill_Station.E.T._Phone_Home
  63204. 2
  63205. @Kant.Orion
  63206. 2
  63207. Bob_Monsen@Sartre.Orion
  63208. 2
  63209. Home'
  63210. 2
  63211. 'Orion'
  63212. 2
  63213. 0
  63214. 2
  63215. foobar@apple.com
  63216. 2
  63217. 0
  63218. 5
  63219. 154
  63220. 5
  63221. 4
  63222. 0
  63223. 154
  63224. 4
  63225. 5
  63226. 154
  63227. 5
  63228. 5
  63229. 154
  63230. 4
  63231. 5
  63232. 154
  63233. 4
  63234. 5
  63235. 154
  63236. 5
  63237. 2
  63238. his
  63239. 154
  63240. 5
  63241. 2
  63242. His
  63243. 154
  63244. 5
  63245. 5
  63246. 154
  63247. 5
  63248. 5
  63249. 154
  63250. 5
  63251. 5
  63252. 154
  63253. 5
  63254. 5
  63255. 154
  63256. 5
  63257. 5
  63258. 154
  63259. 5
  63260. 5
  63261. 154
  63262. 5
  63263. 4
  63264. 2
  63265. 0
  63266. 1
  63267. 0
  63268. 0
  63269. 154
  63270. 4
  63271. 4
  63272. 8
  63273. 4
  63274. 2
  63275. 0
  63276. 1
  63277. 4
  63278. 6
  63279. 0
  63280. -1465129956
  63281. 2
  63282. Wizard (#2)
  63283. 2
  63284. *New-Prog-Log (#31) and Mark (#154)
  63285. 2
  63286. @programmer Mark (#154)
  63287. 2
  63288.  
  63289. 2
  63290. I just gave Mark a programmer bit.
  63291. 4
  63292. 2
  63293. 0
  63294. 2
  63295. 4
  63296. 9
  63297. 0
  63298. -1465041578
  63299. 2
  63300. Bob (#2)
  63301. 2
  63302. Mark (#154), The_Demolished_Man (#77), Dead_Meat (#79), and LiverSpot (#147)
  63303. 2
  63304. Moo maintence
  63305. 2
  63306.  
  63307. 2
  63308. Please explore the office, and let me know if there are any 'anomalies'.
  63309. 2
  63310. If you feel like hacking, log on as 'builder' password builder.
  63311. 2
  63312.  
  63313. 2
  63314. bob
  63315. 4
  63316. 2
  63317. 0
  63318. 3
  63319. 4
  63320. 9
  63321. 0
  63322. -1464639597
  63323. 2
  63324. Bob (#2)
  63325. 2
  63326. LiverSpot (#147), The_Demolished_Man (#77), Dead_Meat (#79), and Mark (#154)
  63327. 2
  63328. new @join verb
  63329. 2
  63330.  
  63331. 2
  63332. I added a @join verb that works like the LambdaMoo one to the generic player, so
  63333. 2
  63334. you should be able to use it. Let me know if it doesn't work.
  63335. 2
  63336.  
  63337. 2
  63338. b
  63339. 4
  63340. 2
  63341. 0
  63342. 4
  63343. 4
  63344. 9
  63345. 0
  63346. -1464633150
  63347. 2
  63348. Bob (#2)
  63349. 2
  63350. Mark (#154), The_Demolished_Man (#77), LiverSpot (#147), and Dead_Meat (#79)
  63351. 2
  63352. Passwords
  63353. 2
  63354.  
  63355. 2
  63356. I've waved my magic wand, and deleted all your passwords. The Crypt() function
  63357. 2
  63358. I wrote was broken, and messed up things. Please don't repassword yourselves
  63359. 2
  63360. until I restart the server.
  63361. 2
  63362. b
  63363. 4
  63364. 2
  63365. 0
  63366. 5
  63367. 4
  63368. 7
  63369. 0
  63370. -1464632431
  63371. 2
  63372. Bob (#2)
  63373. 2
  63374. The_Demolished_Man (#77), Mark (#154), LiverSpot (#147), and Dead_Meat (#79)
  63375. 2
  63376. passwords
  63377. 2
  63378.  
  63379. 2
  63380. The crypt function is working again. you can add passwords again
  63381. 2
  63382. b
  63383. 4
  63384. 2
  63385. 0
  63386. 6
  63387. 4
  63388. 10
  63389. 0
  63390. -1464610415
  63391. 2
  63392. Bob (#2)
  63393. 2
  63394. LiverSpot (#147), The_Demolished_Man (#77), Mark (#154), and Dead_Meat (#79)
  63395. 2
  63396. New way to log in
  63397. 2
  63398.  
  63399. 2
  63400. If you add an alias to your character that is equal to your PPC name, with spaces
  63401. 2
  63402. replaced with underbars (ie, "Bob Monsen" -> "Bob_Monsen"), you will automatically
  63403. 2
  63404. be logged in as yourself.
  63405. 2
  63406.  
  63407. 2
  63408. bob
  63409. 4
  63410. 2
  63411. 0
  63412. 7
  63413. 4
  63414. 7
  63415. 0
  63416. -1464531151
  63417. 2
  63418. Bob (#2)
  63419. 2
  63420. Mark (#154), LiverSpot (#147), The_Demolished_Man (#77), and Dead_Meat (#79)
  63421. 2
  63422. Bug found in the server
  63423. 2
  63424.  
  63425. 2
  63426. actually in my timer code... Its gonna be better now, I just know it!
  63427. 2
  63428. b
  63429. 4
  63430. 2
  63431. 0
  63432. 8
  63433. 4
  63434. 5
  63435. 0
  63436. -1464245266
  63437. 2
  63438. LiverSpot (#147)
  63439. 2
  63440. Mark (#154)
  63441. 2
  63442. say "where the hell have you been??
  63443. 2
  63444.  
  63445. 154
  63446. 4
  63447. 0
  63448. 750853132
  63449. 2
  63450. 1
  63451. 0
  63452. 26
  63453. 2
  63454. 0
  63455. 2
  63456. male
  63457. 154
  63458. 5
  63459. 2
  63460. Himself
  63461. 154
  63462. 5
  63463. 2
  63464. His
  63465. 154
  63466. 5
  63467. 2
  63468. Him
  63469. 154
  63470. 5
  63471. 2
  63472. He
  63473. 154
  63474. 5
  63475. 2
  63476. himself
  63477. 154
  63478. 5
  63479. 2
  63480. his
  63481. 154
  63482. 5
  63483. 2
  63484. him
  63485. 154
  63486. 5
  63487. 2
  63488. he
  63489. 154
  63490. 5
  63491. 1
  63492. 143
  63493. 154
  63494. 5
  63495. 0
  63496. 0
  63497. 2
  63498. 0
  63499. 5
  63500. 154
  63501. 5
  63502. 5
  63503. 154
  63504. 5
  63505. 5
  63506. 154
  63507. 5
  63508. 5
  63509. 154
  63510. 5
  63511. 5
  63512. 154
  63513. 5
  63514. 0
  63515. -1465130276
  63516. 2
  63517. 1
  63518. 0
  63519. 0
  63520. 154
  63521. 4
  63522. 4
  63523. 1
  63524. 2
  63525. Mark
  63526. 2
  63527. 1
  63528. 2
  63529. A tall man with no hair.  OK, very little hair.  Generally smiling, and often going off for a quick butt outside.
  63530. 154
  63531. 5
  63532. 4
  63533. 2
  63534. 0
  63535. 0
  63536. 0
  63537. 0
  63538. 2
  63539. 1
  63540. #155
  63541. Orion Bunny's Helmet
  63542.  
  63543. 0
  63544. 77
  63545. 157
  63546. -1
  63547. -1
  63548. 166
  63549. -1
  63550. -1
  63551. 0
  63552. 0
  63553. 14
  63554. 2
  63555. Rabbit
  63556. 77
  63557. 5
  63558. 5
  63559. 77
  63560. 5
  63561. 5
  63562. 77
  63563. 5
  63564. 5
  63565. 77
  63566. 5
  63567. 5
  63568. 77
  63569. 5
  63570. 5
  63571. 77
  63572. 5
  63573. 5
  63574. 77
  63575. 5
  63576. 5
  63577. 77
  63578. 5
  63579. 5
  63580. 77
  63581. 5
  63582. 5
  63583. 77
  63584. 5
  63585. 0
  63586. 0
  63587. 77
  63588. 4
  63589. 4
  63590. 2
  63591. 2
  63592. Orion Bunny's Helmet
  63593. 2
  63594. Helmet
  63595. 77
  63596. 5
  63597. 5
  63598. 77
  63599. 5
  63600. 4
  63601. 2
  63602. 0
  63603. 0
  63604. 0
  63605. 0
  63606. 2
  63607. 1
  63608. #156
  63609. bill's hall
  63610.  
  63611. 0
  63612. 2
  63613. -1
  63614. -1
  63615. -1
  63616. 3
  63617. -1
  63618. 158
  63619. 0
  63620. 0
  63621. 17
  63622. 5
  63623. 2
  63624. 5
  63625. 5
  63626. 2
  63627. 5
  63628. 5
  63629. 2
  63630. 5
  63631. 5
  63632. 2
  63633. 5
  63634. 5
  63635. 2
  63636. 5
  63637. 5
  63638. 2
  63639. 5
  63640. 5
  63641. 2
  63642. 5
  63643. 4
  63644. 2
  63645. 1
  63646. 146
  63647. 1
  63648. 160
  63649. 2
  63650. 4
  63651. 1
  63652. -1
  63653. 2
  63654. 5
  63655. 0
  63656. 1402
  63657. 2
  63658. 5
  63659. 4
  63660. 2
  63661. 1
  63662. 78
  63663. 1
  63664. 159
  63665. 2
  63666. 4
  63667. 5
  63668. 2
  63669. 5
  63670. 5
  63671. 2
  63672. 5
  63673. 0
  63674. 0
  63675. 2
  63676. 4
  63677. 4
  63678. 1
  63679. 2
  63680. bill's hall
  63681. 2
  63682. 5
  63683. 2
  63684. You are in a north-south hallway.
  63685. 2
  63686. 5
  63687. 4
  63688. 2
  63689. 0
  63690. 0
  63691. 0
  63692. 0
  63693. 2
  63694. 1
  63695. #157
  63696. Orion Killer Guard Rabbit
  63697.  
  63698. 0
  63699. 77
  63700. 77
  63701. 155
  63702. -1
  63703. 8
  63704. -1
  63705. 164
  63706. 0
  63707. 0
  63708. 31
  63709. 5
  63710. 77
  63711. 5
  63712. 5
  63713. 77
  63714. 5
  63715. 5
  63716. 77
  63717. 5
  63718. 5
  63719. 77
  63720. 5
  63721. 5
  63722. 77
  63723. 5
  63724. 5
  63725. 77
  63726. 5
  63727. 0
  63728. 1
  63729. 2
  63730. 1
  63731. 0
  63732. 1
  63733. 2
  63734. 1
  63735. 5
  63736. 77
  63737. 5
  63738. 5
  63739. 77
  63740. 5
  63741. 5
  63742. 77
  63743. 5
  63744. 5
  63745. 77
  63746. 5
  63747. 5
  63748. 77
  63749. 5
  63750. 5
  63751. 77
  63752. 5
  63753. 5
  63754. 77
  63755. 5
  63756. 5
  63757. 77
  63758. 5
  63759. 5
  63760. 77
  63761. 5
  63762. 0
  63763. 0
  63764. 2
  63765. 1
  63766. 5
  63767. 77
  63768. 4
  63769. 5
  63770. 77
  63771. 5
  63772. 5
  63773. 77
  63774. 5
  63775. 5
  63776. 77
  63777. 5
  63778. 5
  63779. 77
  63780. 5
  63781. 5
  63782. 77
  63783. 5
  63784. 5
  63785. 77
  63786. 5
  63787. 5
  63788. 77
  63789. 5
  63790. 5
  63791. 77
  63792. 5
  63793. 0
  63794. 0
  63795. 77
  63796. 4
  63797. 4
  63798. 3
  63799. 2
  63800. Orion Killer Guard Rabbit
  63801. 2
  63802. Rabbit
  63803. 2
  63804. Bunny
  63805. 77
  63806. 5
  63807. 2
  63808. This bunny is furred with Federal Express purple and orange.  He has big, sad, plasticy eyes.
  63809. 77
  63810. 5
  63811. 4
  63812. 2
  63813. 0
  63814. 0
  63815. 0
  63816. 0
  63817. 2
  63818. 1
  63819. #158
  63820. Main Hallway
  63821.  
  63822. 0
  63823. 2
  63824. -1
  63825. -1
  63826. -1
  63827. 3
  63828. -1
  63829. 161
  63830. 0
  63831. 0
  63832. 17
  63833. 5
  63834. 2
  63835. 5
  63836. 5
  63837. 2
  63838. 5
  63839. 5
  63840. 2
  63841. 5
  63842. 5
  63843. 2
  63844. 5
  63845. 5
  63846. 2
  63847. 5
  63848. 5
  63849. 2
  63850. 5
  63851. 5
  63852. 2
  63853. 5
  63854. 4
  63855. 3
  63856. 1
  63857. 159
  63858. 1
  63859. 163
  63860. 1
  63861. 268
  63862. 2
  63863. 4
  63864. 1
  63865. -1
  63866. 2
  63867. 5
  63868. 0
  63869. 9680
  63870. 2
  63871. 5
  63872. 4
  63873. 3
  63874. 1
  63875. 160
  63876. 1
  63877. 162
  63878. 1
  63879. 173
  63880. 2
  63881. 4
  63882. 5
  63883. 2
  63884. 5
  63885. 5
  63886. 2
  63887. 5
  63888. 0
  63889. 0
  63890. 2
  63891. 4
  63892. 4
  63893. 1
  63894. 2
  63895. Main Hallway
  63896. 2
  63897. 5
  63898. 2
  63899. You are in a north-south hallway. There is another hallway here leading west.
  63900. 2
  63901. 5
  63902. 4
  63903. 2
  63904. 0
  63905. 0
  63906. 0
  63907. 0
  63908. 2
  63909. 1
  63910. #159
  63911. south
  63912.  
  63913. 0
  63914. 2
  63915. -1
  63916. -1
  63917. -1
  63918. 7
  63919. -1
  63920. 160
  63921. 0
  63922. 0
  63923. 13
  63924. 5
  63925. 2
  63926. 5
  63927. 1
  63928. 156
  63929. 2
  63930. 5
  63931. 1
  63932. 158
  63933. 2
  63934. 5
  63935. 5
  63936. 2
  63937. 5
  63938. 5
  63939. 2
  63940. 5
  63941. 5
  63942. 2
  63943. 5
  63944. 5
  63945. 2
  63946. 5
  63947. 5
  63948. 2
  63949. 5
  63950. 5
  63951. 2
  63952. 5
  63953. 0
  63954. 0
  63955. 2
  63956. 4
  63957. 4
  63958. 2
  63959. 2
  63960. south
  63961. 2
  63962. s
  63963. 2
  63964. 5
  63965. 5
  63966. 2
  63967. 5
  63968. 4
  63969. 2
  63970. 0
  63971. 0
  63972. 0
  63973. 0
  63974. 2
  63975. 1
  63976. #160
  63977. north
  63978.  
  63979. 0
  63980. 2
  63981. -1
  63982. -1
  63983. -1
  63984. 7
  63985. -1
  63986. 162
  63987. 0
  63988. 0
  63989. 13
  63990. 5
  63991. 2
  63992. 5
  63993. 1
  63994. 158
  63995. 2
  63996. 5
  63997. 1
  63998. 156
  63999. 2
  64000. 5
  64001. 5
  64002. 2
  64003. 5
  64004. 5
  64005. 2
  64006. 5
  64007. 5
  64008. 2
  64009. 5
  64010. 5
  64011. 2
  64012. 5
  64013. 5
  64014. 2
  64015. 5
  64016. 5
  64017. 2
  64018. 5
  64019. 0
  64020. 0
  64021. 2
  64022. 4
  64023. 4
  64024. 2
  64025. 2
  64026. north
  64027. 2
  64028. n
  64029. 2
  64030. 5
  64031. 5
  64032. 2
  64033. 5
  64034. 4
  64035. 2
  64036. 0
  64037. 0
  64038. 0
  64039. 0
  64040. 2
  64041. 1
  64042. #161
  64043. first aid hallway
  64044.  
  64045. 0
  64046. 2
  64047. -1
  64048. 164
  64049. -1
  64050. 3
  64051. -1
  64052. 168
  64053. 0
  64054. 0
  64055. 17
  64056. 5
  64057. 2
  64058. 5
  64059. 5
  64060. 2
  64061. 5
  64062. 5
  64063. 2
  64064. 5
  64065. 5
  64066. 2
  64067. 5
  64068. 5
  64069. 2
  64070. 5
  64071. 5
  64072. 2
  64073. 5
  64074. 5
  64075. 2
  64076. 5
  64077. 4
  64078. 3
  64079. 1
  64080. 162
  64081. 1
  64082. 280
  64083. 1
  64084. 286
  64085. 2
  64086. 4
  64087. 1
  64088. -1
  64089. 2
  64090. 5
  64091. 0
  64092. 341
  64093. 2
  64094. 5
  64095. 4
  64096. 3
  64097. 1
  64098. 163
  64099. 1
  64100. 279
  64101. 1
  64102. 285
  64103. 2
  64104. 4
  64105. 5
  64106. 2
  64107. 5
  64108. 5
  64109. 2
  64110. 5
  64111. 0
  64112. 0
  64113. 2
  64114. 4
  64115. 4
  64116. 1
  64117. 2
  64118. first aid hallway
  64119. 2
  64120. 5
  64121. 2
  64122. You are in a north-south hallway. There is a door to the east.
  64123. 2
  64124. 5
  64125. 4
  64126. 2
  64127. 0
  64128. 0
  64129. 0
  64130. 0
  64131. 2
  64132. 1
  64133. #162
  64134. south
  64135.  
  64136. 0
  64137. 2
  64138. -1
  64139. -1
  64140. -1
  64141. 7
  64142. -1
  64143. 163
  64144. 0
  64145. 0
  64146. 13
  64147. 5
  64148. 2
  64149. 5
  64150. 1
  64151. 158
  64152. 2
  64153. 5
  64154. 1
  64155. 161
  64156. 2
  64157. 5
  64158. 5
  64159. 2
  64160. 5
  64161. 5
  64162. 2
  64163. 5
  64164. 5
  64165. 2
  64166. 5
  64167. 5
  64168. 2
  64169. 5
  64170. 5
  64171. 2
  64172. 5
  64173. 5
  64174. 2
  64175. 5
  64176. 0
  64177. 0
  64178. 2
  64179. 4
  64180. 4
  64181. 2
  64182. 2
  64183. south
  64184. 2
  64185. s
  64186. 2
  64187. 5
  64188. 5
  64189. 2
  64190. 5
  64191. 4
  64192. 2
  64193. 0
  64194. 0
  64195. 0
  64196. 0
  64197. 2
  64198. 1
  64199. #163
  64200. north
  64201.  
  64202. 0
  64203. 2
  64204. -1
  64205. -1
  64206. -1
  64207. 7
  64208. -1
  64209. 169
  64210. 0
  64211. 0
  64212. 13
  64213. 5
  64214. 2
  64215. 5
  64216. 1
  64217. 161
  64218. 2
  64219. 5
  64220. 1
  64221. 158
  64222. 2
  64223. 5
  64224. 5
  64225. 2
  64226. 5
  64227. 5
  64228. 2
  64229. 5
  64230. 5
  64231. 2
  64232. 5
  64233. 5
  64234. 2
  64235. 5
  64236. 5
  64237. 2
  64238. 5
  64239. 5
  64240. 2
  64241. 5
  64242. 0
  64243. 0
  64244. 2
  64245. 4
  64246. 4
  64247. 2
  64248. 2
  64249. north
  64250. 2
  64251. n
  64252. 2
  64253. 5
  64254. 5
  64255. 2
  64256. 5
  64257. 4
  64258. 2
  64259. 0
  64260. 0
  64261. 0
  64262. 0
  64263. 2
  64264. 1
  64265. #164
  64266. the Laserwriter
  64267.  
  64268. 0
  64269. 2
  64270. 161
  64271. 165
  64272. -1
  64273. 8
  64274. 341
  64275. 167
  64276. 1
  64277. close
  64278. 2
  64279. 41
  64280. -1
  64281. 0
  64282. 31
  64283. 5
  64284. 2
  64285. 5
  64286. 5
  64287. 2
  64288. 5
  64289. 5
  64290. 2
  64291. 5
  64292. 5
  64293. 2
  64294. 5
  64295. 5
  64296. 2
  64297. 5
  64298. 5
  64299. 2
  64300. 5
  64301. 5
  64302. 2
  64303. 1
  64304. 0
  64305. 1
  64306. 2
  64307. 1
  64308. 5
  64309. 2
  64310. 5
  64311. 5
  64312. 2
  64313. 5
  64314. 5
  64315. 2
  64316. 5
  64317. 5
  64318. 2
  64319. 5
  64320. 5
  64321. 2
  64322. 5
  64323. 5
  64324. 2
  64325. 5
  64326. 5
  64327. 2
  64328. 5
  64329. 5
  64330. 2
  64331. 5
  64332. 5
  64333. 2
  64334. 5
  64335. 0
  64336. 0
  64337. 2
  64338. 1
  64339. 5
  64340. 2
  64341. 4
  64342. 5
  64343. 2
  64344. 5
  64345. 5
  64346. 2
  64347. 5
  64348. 5
  64349. 2
  64350. 5
  64351. 5
  64352. 2
  64353. 5
  64354. 5
  64355. 2
  64356. 5
  64357. 5
  64358. 2
  64359. 5
  64360. 5
  64361. 2
  64362. 5
  64363. 5
  64364. 2
  64365. 5
  64366. 0
  64367. 0
  64368. 2
  64369. 4
  64370. 4
  64371. 3
  64372. 2
  64373. the Laserwriter
  64374. 2
  64375. printer
  64376. 2
  64377. laserwriter
  64378. 2
  64379. 5
  64380. 2
  64381. a laserwriter
  64382. 2
  64383. 5
  64384. 4
  64385. 2
  64386. 0
  64387. 0
  64388. 0
  64389. 0
  64390. 2
  64391. 1
  64392. #165
  64393. toner
  64394.  
  64395. 0
  64396. 2
  64397. 164
  64398. -1
  64399. 171
  64400. 5
  64401. -1
  64402. 166
  64403. 0
  64404. 0
  64405. 12
  64406. 5
  64407. 2
  64408. 5
  64409. 5
  64410. 2
  64411. 5
  64412. 5
  64413. 2
  64414. 5
  64415. 5
  64416. 2
  64417. 5
  64418. 5
  64419. 2
  64420. 5
  64421. 5
  64422. 2
  64423. 5
  64424. 5
  64425. 2
  64426. 5
  64427. 5
  64428. 2
  64429. 5
  64430. 0
  64431. 0
  64432. 2
  64433. 4
  64434. 4
  64435. 1
  64436. 2
  64437. toner
  64438. 2
  64439. 5
  64440. 5
  64441. 2
  64442. 5
  64443. 4
  64444. 2
  64445. 0
  64446. 0
  64447. 0
  64448. 0
  64449. 2
  64450. 1
  64451. #166
  64452. Orion Safety Helmet
  64453.  
  64454. 0
  64455. 77
  64456. 77
  64457. -1
  64458. 331
  64459. 5
  64460. 155
  64461. 171
  64462. 2
  64463. g*et t*ake
  64464. 77
  64465. 41
  64466. -1
  64467. label
  64468. 77
  64469. 105
  64470. 0
  64471. 2
  64472. label
  64473. tile_fell_on_it
  64474. 14
  64475. 2
  64476. Your Name Here
  64477. 77
  64478. 5
  64479. 0
  64480. 0
  64481. 77
  64482. 5
  64483. 2
  64484. You can't drop %t here.  You probably don't want to anyway -- wouldn't you really rather hang on to it?
  64485. 77
  64486. 5
  64487. 2
  64488. You feel exposed and naked without a certified %t.
  64489. 77
  64490. 5
  64491. 2
  64492. starts to drop %t but reconsiders the safety implications.
  64493. 77
  64494. 5
  64495. 2
  64496. removes %t with a flourish.  A very reckless thing to do...
  64497. 77
  64498. 5
  64499. 2
  64500. "You feel much better, much safer with a genuine Orion Safety Helmet."
  64501. 77
  64502. 5
  64503. 5
  64504. 77
  64505. 5
  64506. 2
  64507. You feel much better, much safer with an approved %t.
  64508. 77
  64509. 5
  64510. 2
  64511. You can't have this %t.  Keep your head covered!
  64512. 77
  64513. 5
  64514. 0
  64515. 0
  64516. 77
  64517. 4
  64518. 4
  64519. 2
  64520. 2
  64521. Orion Safety Helmet
  64522. 2
  64523. Helmet
  64524. 77
  64525. 5
  64526. 4
  64527. 3
  64528. 2
  64529. A standard-issue Orion Safety Helmet is made of clean, shiny, white plastic.
  64530. 2
  64531. It is not likely to save your life should anything heavy fall on your head,
  64532. 2
  64533. but it would probably protect you from falling acoustic tiles.
  64534. 77
  64535. 5
  64536. 4
  64537. 2
  64538. 0
  64539. 0
  64540. 0
  64541. 0
  64542. 2
  64543. 1
  64544. #167
  64545. Generic Apple Recycle-able Employee
  64546.  
  64547. 0
  64548. 77
  64549. 77
  64550. -1
  64551. 166
  64552. 8
  64553. -1
  64554. 170
  64555. 2
  64556. layoff
  64557. 77
  64558. 105
  64559. 0
  64560. layoff
  64561. 77
  64562. 9
  64563. -1
  64564. 0
  64565. 31
  64566. 5
  64567. 77
  64568. 5
  64569. 5
  64570. 77
  64571. 5
  64572. 5
  64573. 77
  64574. 5
  64575. 5
  64576. 77
  64577. 5
  64578. 5
  64579. 77
  64580. 5
  64581. 5
  64582. 77
  64583. 5
  64584. 5
  64585. 2
  64586. 1
  64587. 5
  64588. 2
  64589. 1
  64590. 5
  64591. 77
  64592. 5
  64593. 5
  64594. 77
  64595. 5
  64596. 5
  64597. 77
  64598. 5
  64599. 5
  64600. 77
  64601. 5
  64602. 5
  64603. 77
  64604. 5
  64605. 5
  64606. 77
  64607. 5
  64608. 5
  64609. 77
  64610. 5
  64611. 5
  64612. 77
  64613. 5
  64614. 5
  64615. 77
  64616. 5
  64617. 5
  64618. 2
  64619. 1
  64620. 5
  64621. 77
  64622. 4
  64623. 5
  64624. 77
  64625. 5
  64626. 5
  64627. 77
  64628. 5
  64629. 5
  64630. 77
  64631. 5
  64632. 5
  64633. 77
  64634. 5
  64635. 5
  64636. 77
  64637. 5
  64638. 5
  64639. 77
  64640. 5
  64641. 5
  64642. 77
  64643. 5
  64644. 5
  64645. 77
  64646. 5
  64647. 0
  64648. 0
  64649. 77
  64650. 4
  64651. 4
  64652. 1
  64653. 2
  64654. Generic Apple Recycle-able Employee
  64655. 77
  64656. 5
  64657. 5
  64658. 77
  64659. 5
  64660. 4
  64661. 2
  64662. 0
  64663. 0
  64664. 0
  64665. 0
  64666. 2
  64667. 1
  64668. #168
  64669. Hell
  64670.  
  64671. 0
  64672. 2
  64673. -1
  64674. 433
  64675. -1
  64676. 3
  64677. -1
  64678. 172
  64679. 0
  64680. 0
  64681. 17
  64682. 5
  64683. 2
  64684. 5
  64685. 5
  64686. 2
  64687. 5
  64688. 5
  64689. 2
  64690. 5
  64691. 5
  64692. 2
  64693. 5
  64694. 5
  64695. 2
  64696. 5
  64697. 5
  64698. 2
  64699. 5
  64700. 5
  64701. 2
  64702. 5
  64703. 4
  64704. 3
  64705. 1
  64706. 169
  64707. 1
  64708. 278
  64709. 1
  64710. 298
  64711. 2
  64712. 4
  64713. 1
  64714. -1
  64715. 2
  64716. 5
  64717. 0
  64718. 24814
  64719. 2
  64720. 5
  64721. 4
  64722. 1
  64723. 1
  64724. 301
  64725. 2
  64726. 4
  64727. 5
  64728. 2
  64729. 5
  64730. 5
  64731. 2
  64732. 5
  64733. 0
  64734. 0
  64735. 2
  64736. 4
  64737. 4
  64738. 1
  64739. 2
  64740. Hell
  64741. 2
  64742. 5
  64743. 2
  64744. You are in hell. The flames of perdition burn all around you.
  64745. 2
  64746. 5
  64747. 4
  64748. 2
  64749. 0
  64750. 0
  64751. 0
  64752. 0
  64753. 2
  64754. 1
  64755. #169
  64756. die
  64757.  
  64758. 0
  64759. 2
  64760. -1
  64761. -1
  64762. -1
  64763. 7
  64764. -1
  64765. 176
  64766. 0
  64767. 0
  64768. 13
  64769. 5
  64770. 2
  64771. 5
  64772. 1
  64773. 82
  64774. 2
  64775. 5
  64776. 1
  64777. 168
  64778. 2
  64779. 5
  64780. 5
  64781. 2
  64782. 5
  64783. 5
  64784. 2
  64785. 5
  64786. 5
  64787. 2
  64788. 5
  64789. 5
  64790. 2
  64791. 5
  64792. 5
  64793. 2
  64794. 5
  64795. 5
  64796. 2
  64797. 5
  64798. 0
  64799. 0
  64800. 2
  64801. 4
  64802. 4
  64803. 1
  64804. 2
  64805. die
  64806. 2
  64807. 5
  64808. 5
  64809. 2
  64810. 5
  64811. 4
  64812. 2
  64813. 0
  64814. 0
  64815. 0
  64816. 0
  64817. 2
  64818. 1
  64819. #170
  64820. an air conditioner
  64821.  
  64822. 0
  64823. 2
  64824. 11
  64825. -1
  64826. -1
  64827. 8
  64828. -1
  64829. 178
  64830. 1
  64831. enter
  64832. 2
  64833. 41
  64834. -1
  64835. 0
  64836. 31
  64837. 5
  64838. 2
  64839. 5
  64840. 5
  64841. 2
  64842. 5
  64843. 5
  64844. 2
  64845. 5
  64846. 5
  64847. 2
  64848. 5
  64849. 5
  64850. 2
  64851. 5
  64852. 5
  64853. 2
  64854. 5
  64855. 5
  64856. 2
  64857. 1
  64858. 5
  64859. 2
  64860. 1
  64861. 5
  64862. 2
  64863. 5
  64864. 5
  64865. 2
  64866. 5
  64867. 5
  64868. 2
  64869. 5
  64870. 5
  64871. 2
  64872. 5
  64873. 5
  64874. 2
  64875. 5
  64876. 5
  64877. 2
  64878. 5
  64879. 5
  64880. 2
  64881. 5
  64882. 5
  64883. 2
  64884. 5
  64885. 5
  64886. 2
  64887. 5
  64888. 5
  64889. 2
  64890. 1
  64891. 5
  64892. 2
  64893. 4
  64894. 5
  64895. 2
  64896. 5
  64897. 5
  64898. 2
  64899. 5
  64900. 5
  64901. 2
  64902. 5
  64903. 5
  64904. 2
  64905. 5
  64906. 5
  64907. 2
  64908. 5
  64909. 5
  64910. 2
  64911. 5
  64912. 5
  64913. 2
  64914. 5
  64915. 5
  64916. 2
  64917. 5
  64918. 0
  64919. 0
  64920. 2
  64921. 4
  64922. 4
  64923. 3
  64924. 2
  64925. an air conditioner
  64926. 2
  64927. air conditioner
  64928. 2
  64929. conditioner
  64930. 2
  64931. 5
  64932. 5
  64933. 2
  64934. 5
  64935. 4
  64936. 2
  64937. 0
  64938. 0
  64939. 0
  64940. 0
  64941. 2
  64942. 1
  64943. #171
  64944. paper
  64945.  
  64946. 0
  64947. 2
  64948. 164
  64949. -1
  64950. -1
  64951. 5
  64952. -1
  64953. 179
  64954. 0
  64955. 0
  64956. 12
  64957. 5
  64958. 2
  64959. 5
  64960. 5
  64961. 2
  64962. 5
  64963. 5
  64964. 2
  64965. 5
  64966. 5
  64967. 2
  64968. 5
  64969. 5
  64970. 2
  64971. 5
  64972. 5
  64973. 2
  64974. 5
  64975. 5
  64976. 2
  64977. 5
  64978. 5
  64979. 2
  64980. 5
  64981. 0
  64982. 0
  64983. 2
  64984. 4
  64985. 4
  64986. 1
  64987. 2
  64988. paper
  64989. 2
  64990. 5
  64991. 5
  64992. 2
  64993. 5
  64994. 4
  64995. 2
  64996. 0
  64997. 0
  64998. 0
  64999. 0
  65000. 2
  65001. 1
  65002. #172
  65003. xerox room hallway
  65004.  
  65005. 0
  65006. 2
  65007. -1
  65008. -1
  65009. -1
  65010. 3
  65011. -1
  65012. 175
  65013. 0
  65014. 0
  65015. 17
  65016. 5
  65017. 2
  65018. 5
  65019. 5
  65020. 2
  65021. 5
  65022. 5
  65023. 2
  65024. 5
  65025. 5
  65026. 2
  65027. 5
  65028. 5
  65029. 2
  65030. 5
  65031. 5
  65032. 2
  65033. 5
  65034. 5
  65035. 2
  65036. 5
  65037. 4
  65038. 3
  65039. 1
  65040. 177
  65041. 1
  65042. 182
  65043. 1
  65044. 269
  65045. 2
  65046. 4
  65047. 1
  65048. -1
  65049. 2
  65050. 5
  65051. 0
  65052. 17251
  65053. 2
  65054. 5
  65055. 4
  65056. 3
  65057. 1
  65058. 176
  65059. 1
  65060. 181
  65061. 1
  65062. 174
  65063. 2
  65064. 4
  65065. 5
  65066. 2
  65067. 5
  65068. 5
  65069. 2
  65070. 5
  65071. 0
  65072. 0
  65073. 2
  65074. 4
  65075. 4
  65076. 1
  65077. 2
  65078. xerox room hallway
  65079. 2
  65080. 5
  65081. 2
  65082. You are in an east-west hallway. To the south is a xerox room.
  65083. 2
  65084. 5
  65085. 4
  65086. 2
  65087. 0
  65088. 0
  65089. 0
  65090. 0
  65091. 2
  65092. 1
  65093. #173
  65094. west
  65095.  
  65096. 0
  65097. 2
  65098. -1
  65099. -1
  65100. -1
  65101. 7
  65102. -1
  65103. 269
  65104. 0
  65105. 0
  65106. 13
  65107. 5
  65108. 2
  65109. 5
  65110. 1
  65111. 158
  65112. 2
  65113. 5
  65114. 1
  65115. 267
  65116. 2
  65117. 5
  65118. 5
  65119. 2
  65120. 5
  65121. 5
  65122. 2
  65123. 5
  65124. 5
  65125. 2
  65126. 5
  65127. 5
  65128. 2
  65129. 5
  65130. 5
  65131. 2
  65132. 5
  65133. 5
  65134. 2
  65135. 5
  65136. 0
  65137. 0
  65138. 2
  65139. 4
  65140. 4
  65141. 2
  65142. 2
  65143. west
  65144. 2
  65145. w
  65146. 2
  65147. 5
  65148. 5
  65149. 2
  65150. 5
  65151. 4
  65152. 2
  65153. 0
  65154. 0
  65155. 0
  65156. 0
  65157. 2
  65158. 1
  65159. #174
  65160. east
  65161.  
  65162. 0
  65163. 228
  65164. -1
  65165. -1
  65166. -1
  65167. 7
  65168. -1
  65169. 268
  65170. 0
  65171. 0
  65172. 13
  65173. 5
  65174. 228
  65175. 5
  65176. 1
  65177. 172
  65178. 228
  65179. 5
  65180. 1
  65181. 267
  65182. 228
  65183. 5
  65184. 5
  65185. 228
  65186. 5
  65187. 5
  65188. 228
  65189. 5
  65190. 5
  65191. 228
  65192. 5
  65193. 5
  65194. 228
  65195. 5
  65196. 5
  65197. 228
  65198. 5
  65199. 5
  65200. 228
  65201. 5
  65202. 0
  65203. 0
  65204. 228
  65205. 4
  65206. 4
  65207. 2
  65208. 2
  65209. east
  65210. 2
  65211. e
  65212. 228
  65213. 5
  65214. 5
  65215. 228
  65216. 5
  65217. 4
  65218. 2
  65219. 0
  65220. 0
  65221. 0
  65222. 0
  65223. 2
  65224. 1
  65225. #175
  65226. Xerox Room
  65227.  
  65228. 0
  65229. 2
  65230. -1
  65231. 178
  65232. -1
  65233. 3
  65234. -1
  65235. 180
  65236. 0
  65237. 0
  65238. 17
  65239. 5
  65240. 2
  65241. 5
  65242. 5
  65243. 2
  65244. 5
  65245. 5
  65246. 2
  65247. 5
  65248. 5
  65249. 2
  65250. 5
  65251. 5
  65252. 2
  65253. 5
  65254. 5
  65255. 2
  65256. 5
  65257. 5
  65258. 2
  65259. 5
  65260. 4
  65261. 1
  65262. 1
  65263. 176
  65264. 2
  65265. 4
  65266. 1
  65267. -1
  65268. 2
  65269. 5
  65270. 0
  65271. 10029
  65272. 2
  65273. 5
  65274. 4
  65275. 1
  65276. 1
  65277. 177
  65278. 2
  65279. 4
  65280. 5
  65281. 2
  65282. 5
  65283. 5
  65284. 2
  65285. 5
  65286. 0
  65287. 0
  65288. 2
  65289. 4
  65290. 4
  65291. 1
  65292. 2
  65293. Xerox Room
  65294. 2
  65295. 5
  65296. 2
  65297. You are in the xerox room. There is an exit to the north.
  65298. 2
  65299. 5
  65300. 4
  65301. 2
  65302. 0
  65303. 0
  65304. 0
  65305. 0
  65306. 2
  65307. 1
  65308. #176
  65309. south
  65310.  
  65311. 0
  65312. 2
  65313. -1
  65314. -1
  65315. -1
  65316. 7
  65317. -1
  65318. 177
  65319. 0
  65320. 0
  65321. 13
  65322. 5
  65323. 2
  65324. 5
  65325. 1
  65326. 172
  65327. 2
  65328. 5
  65329. 1
  65330. 175
  65331. 2
  65332. 5
  65333. 5
  65334. 2
  65335. 5
  65336. 5
  65337. 2
  65338. 5
  65339. 5
  65340. 2
  65341. 5
  65342. 5
  65343. 2
  65344. 5
  65345. 5
  65346. 2
  65347. 5
  65348. 5
  65349. 2
  65350. 5
  65351. 0
  65352. 0
  65353. 2
  65354. 4
  65355. 4
  65356. 2
  65357. 2
  65358. south
  65359. 2
  65360. s
  65361. 2
  65362. 5
  65363. 5
  65364. 2
  65365. 5
  65366. 4
  65367. 2
  65368. 0
  65369. 0
  65370. 0
  65371. 0
  65372. 2
  65373. 1
  65374. #177
  65375. north
  65376.  
  65377. 0
  65378. 2
  65379. -1
  65380. -1
  65381. -1
  65382. 7
  65383. -1
  65384. 181
  65385. 0
  65386. 0
  65387. 13
  65388. 5
  65389. 2
  65390. 5
  65391. 1
  65392. 175
  65393. 2
  65394. 5
  65395. 1
  65396. 172
  65397. 2
  65398. 5
  65399. 5
  65400. 2
  65401. 5
  65402. 5
  65403. 2
  65404. 5
  65405. 5
  65406. 2
  65407. 5
  65408. 5
  65409. 2
  65410. 5
  65411. 5
  65412. 2
  65413. 5
  65414. 5
  65415. 2
  65416. 5
  65417. 0
  65418. 0
  65419. 2
  65420. 4
  65421. 4
  65422. 2
  65423. 2
  65424. north
  65425. 2
  65426. n
  65427. 2
  65428. 5
  65429. 5
  65430. 2
  65431. 5
  65432. 4
  65433. 2
  65434. 0
  65435. 0
  65436. 0
  65437. 0
  65438. 2
  65439. 1
  65440. #178
  65441. the xerox machine
  65442.  
  65443. 0
  65444. 2
  65445. 175
  65446. -1
  65447. 179
  65448. 8
  65449. -1
  65450. 265
  65451. 2
  65452. copy
  65453. 2
  65454. 153
  65455. 4
  65456. copy
  65457. 2
  65458. 153
  65459. 0
  65460. 0
  65461. 31
  65462. 5
  65463. 2
  65464. 5
  65465. 5
  65466. 2
  65467. 5
  65468. 5
  65469. 2
  65470. 5
  65471. 5
  65472. 2
  65473. 5
  65474. 5
  65475. 2
  65476. 5
  65477. 5
  65478. 2
  65479. 5
  65480. 5
  65481. 2
  65482. 1
  65483. 5
  65484. 2
  65485. 1
  65486. 5
  65487. 2
  65488. 5
  65489. 5
  65490. 2
  65491. 5
  65492. 5
  65493. 2
  65494. 5
  65495. 5
  65496. 2
  65497. 5
  65498. 5
  65499. 2
  65500. 5
  65501. 5
  65502. 2
  65503. 5
  65504. 5
  65505. 2
  65506. 5
  65507. 5
  65508. 2
  65509. 5
  65510. 5
  65511. 2
  65512. 5
  65513. 5
  65514. 2
  65515. 1
  65516. 5
  65517. 2
  65518. 4
  65519. 5
  65520. 2
  65521. 5
  65522. 5
  65523. 2
  65524. 5
  65525. 5
  65526. 2
  65527. 5
  65528. 5
  65529. 2
  65530. 5
  65531. 5
  65532. 2
  65533. 5
  65534. 5
  65535. 2
  65536. 5
  65537. 5
  65538. 2
  65539. 5
  65540. 5
  65541. 2
  65542. 5
  65543. 0
  65544. 0
  65545. 2
  65546. 4
  65547. 4
  65548. 3
  65549. 2
  65550. the xerox machine
  65551. 2
  65552. copier
  65553. 2
  65554. xerox machine
  65555. 2
  65556. 5
  65557. 5
  65558. 2
  65559. 5
  65560. 4
  65561. 2
  65562. 0
  65563. 0
  65564. 0
  65565. 0
  65566. 2
  65567. 1
  65568. #179
  65569. the telephone
  65570.  
  65571. 0
  65572. 2
  65573. 175
  65574. -1
  65575. -1
  65576. 5
  65577. -1
  65578. 289
  65579. 1
  65580. dial
  65581. 2
  65582. 105
  65583. 0
  65584. 0
  65585. 12
  65586. 5
  65587. 2
  65588. 5
  65589. 5
  65590. 2
  65591. 5
  65592. 5
  65593. 2
  65594. 5
  65595. 5
  65596. 2
  65597. 5
  65598. 5
  65599. 2
  65600. 5
  65601. 5
  65602. 2
  65603. 5
  65604. 5
  65605. 2
  65606. 5
  65607. 5
  65608. 2
  65609. 5
  65610. 0
  65611. 0
  65612. 2
  65613. 4
  65614. 4
  65615. 3
  65616. 2
  65617. the telephone
  65618. 2
  65619. telephone
  65620. 2
  65621. phone
  65622. 2
  65623. 5
  65624. 5
  65625. 2
  65626. 5
  65627. 4
  65628. 2
  65629. 0
  65630. 0
  65631. 0
  65632. 0
  65633. 2
  65634. 1
  65635. #180
  65636. Tee Hallway
  65637.  
  65638. 0
  65639. 2
  65640. -1
  65641. -1
  65642. -1
  65643. 3
  65644. -1
  65645. 185
  65646. 0
  65647. 0
  65648. 17
  65649. 5
  65650. 2
  65651. 5
  65652. 5
  65653. 2
  65654. 5
  65655. 5
  65656. 2
  65657. 5
  65658. 5
  65659. 2
  65660. 5
  65661. 5
  65662. 2
  65663. 5
  65664. 5
  65665. 2
  65666. 5
  65667. 5
  65668. 2
  65669. 5
  65670. 4
  65671. 4
  65672. 1
  65673. 181
  65674. 1
  65675. 183
  65676. 1
  65677. 187
  65678. 1
  65679. 190
  65680. 2
  65681. 4
  65682. 1
  65683. -1
  65684. 2
  65685. 5
  65686. 0
  65687. 11286
  65688. 2
  65689. 5
  65690. 4
  65691. 4
  65692. 1
  65693. 182
  65694. 1
  65695. 184
  65696. 1
  65697. 186
  65698. 1
  65699. 189
  65700. 2
  65701. 4
  65702. 5
  65703. 2
  65704. 5
  65705. 5
  65706. 2
  65707. 5
  65708. 0
  65709. 0
  65710. 2
  65711. 4
  65712. 4
  65713. 1
  65714. 2
  65715. Tee Hallway
  65716. 2
  65717. 5
  65718. 2
  65719. You are in an east-west hallway. There is another hall leading north, and a conference room to the south.
  65720. 2
  65721. 5
  65722. 4
  65723. 2
  65724. 0
  65725. 0
  65726. 0
  65727. 0
  65728. 2
  65729. 1
  65730. #181
  65731. west
  65732.  
  65733. 0
  65734. 2
  65735. -1
  65736. -1
  65737. -1
  65738. 7
  65739. -1
  65740. 182
  65741. 0
  65742. 0
  65743. 13
  65744. 5
  65745. 2
  65746. 5
  65747. 1
  65748. 172
  65749. 2
  65750. 5
  65751. 1
  65752. 180
  65753. 2
  65754. 5
  65755. 5
  65756. 2
  65757. 5
  65758. 5
  65759. 2
  65760. 5
  65761. 5
  65762. 2
  65763. 5
  65764. 5
  65765. 2
  65766. 5
  65767. 5
  65768. 2
  65769. 5
  65770. 5
  65771. 2
  65772. 5
  65773. 0
  65774. 0
  65775. 2
  65776. 4
  65777. 4
  65778. 2
  65779. 2
  65780. west
  65781. 2
  65782. w
  65783. 2
  65784. 5
  65785. 5
  65786. 2
  65787. 5
  65788. 4
  65789. 2
  65790. 0
  65791. 0
  65792. 0
  65793. 0
  65794. 2
  65795. 1
  65796. #182
  65797. east
  65798.  
  65799. 0
  65800. 2
  65801. -1
  65802. -1
  65803. -1
  65804. 7
  65805. -1
  65806. 183
  65807. 0
  65808. 0
  65809. 13
  65810. 5
  65811. 2
  65812. 5
  65813. 1
  65814. 180
  65815. 2
  65816. 5
  65817. 1
  65818. 172
  65819. 2
  65820. 5
  65821. 5
  65822. 2
  65823. 5
  65824. 5
  65825. 2
  65826. 5
  65827. 5
  65828. 2
  65829. 5
  65830. 5
  65831. 2
  65832. 5
  65833. 5
  65834. 2
  65835. 5
  65836. 5
  65837. 2
  65838. 5
  65839. 0
  65840. 0
  65841. 2
  65842. 4
  65843. 4
  65844. 2
  65845. 2
  65846. east
  65847. 2
  65848. e
  65849. 2
  65850. 5
  65851. 5
  65852. 2
  65853. 5
  65854. 4
  65855. 2
  65856. 0
  65857. 0
  65858. 0
  65859. 0
  65860. 2
  65861. 1
  65862. #183
  65863. south
  65864.  
  65865. 0
  65866. 2
  65867. -1
  65868. -1
  65869. -1
  65870. 7
  65871. -1
  65872. 184
  65873. 0
  65874. 0
  65875. 13
  65876. 5
  65877. 2
  65878. 5
  65879. 1
  65880. 131
  65881. 2
  65882. 5
  65883. 1
  65884. 180
  65885. 2
  65886. 5
  65887. 5
  65888. 2
  65889. 5
  65890. 5
  65891. 2
  65892. 5
  65893. 5
  65894. 2
  65895. 5
  65896. 5
  65897. 2
  65898. 5
  65899. 5
  65900. 2
  65901. 5
  65902. 5
  65903. 2
  65904. 5
  65905. 0
  65906. 0
  65907. 2
  65908. 4
  65909. 4
  65910. 2
  65911. 2
  65912. south
  65913. 2
  65914. s
  65915. 2
  65916. 5
  65917. 5
  65918. 2
  65919. 5
  65920. 4
  65921. 2
  65922. 0
  65923. 0
  65924. 0
  65925. 0
  65926. 2
  65927. 1
  65928. #184
  65929. north
  65930.  
  65931. 0
  65932. 2
  65933. -1
  65934. -1
  65935. -1
  65936. 7
  65937. -1
  65938. 186
  65939. 0
  65940. 0
  65941. 13
  65942. 5
  65943. 2
  65944. 5
  65945. 1
  65946. 180
  65947. 2
  65948. 5
  65949. 1
  65950. 131
  65951. 2
  65952. 5
  65953. 5
  65954. 2
  65955. 5
  65956. 5
  65957. 2
  65958. 5
  65959. 5
  65960. 2
  65961. 5
  65962. 5
  65963. 2
  65964. 5
  65965. 5
  65966. 2
  65967. 5
  65968. 5
  65969. 2
  65970. 5
  65971. 0
  65972. 0
  65973. 2
  65974. 4
  65975. 4
  65976. 2
  65977. 2
  65978. north
  65979. 2
  65980. n
  65981. 2
  65982. 5
  65983. 5
  65984. 2
  65985. 5
  65986. 4
  65987. 2
  65988. 0
  65989. 0
  65990. 0
  65991. 0
  65992. 2
  65993. 1
  65994. #185
  65995. Conference Room
  65996.  
  65997. 0
  65998. 2
  65999. -1
  66000. -1
  66001. -1
  66002. 3
  66003. -1
  66004. 188
  66005. 0
  66006. 0
  66007. 17
  66008. 5
  66009. 2
  66010. 5
  66011. 5
  66012. 2
  66013. 5
  66014. 5
  66015. 2
  66016. 5
  66017. 5
  66018. 2
  66019. 5
  66020. 5
  66021. 2
  66022. 5
  66023. 5
  66024. 2
  66025. 5
  66026. 5
  66027. 2
  66028. 5
  66029. 4
  66030. 1
  66031. 1
  66032. 186
  66033. 2
  66034. 4
  66035. 1
  66036. -1
  66037. 2
  66038. 5
  66039. 0
  66040. 9700
  66041. 2
  66042. 5
  66043. 4
  66044. 1
  66045. 1
  66046. 187
  66047. 2
  66048. 4
  66049. 5
  66050. 2
  66051. 5
  66052. 5
  66053. 2
  66054. 5
  66055. 0
  66056. 0
  66057. 2
  66058. 4
  66059. 4
  66060. 1
  66061. 2
  66062. Conference Room
  66063. 2
  66064. 5
  66065. 2
  66066. You are in the Southern Cross conference room. There is an exit to the north.
  66067. 2
  66068. 5
  66069. 4
  66070. 2
  66071. 0
  66072. 0
  66073. 0
  66074. 0
  66075. 2
  66076. 1
  66077. #186
  66078. south
  66079.  
  66080. 0
  66081. 2
  66082. -1
  66083. -1
  66084. -1
  66085. 7
  66086. -1
  66087. 187
  66088. 0
  66089. 0
  66090. 13
  66091. 5
  66092. 2
  66093. 5
  66094. 1
  66095. 180
  66096. 2
  66097. 5
  66098. 1
  66099. 185
  66100. 2
  66101. 5
  66102. 5
  66103. 2
  66104. 5
  66105. 5
  66106. 2
  66107. 5
  66108. 5
  66109. 2
  66110. 5
  66111. 5
  66112. 2
  66113. 5
  66114. 5
  66115. 2
  66116. 5
  66117. 5
  66118. 2
  66119. 5
  66120. 0
  66121. 0
  66122. 2
  66123. 4
  66124. 4
  66125. 2
  66126. 2
  66127. south
  66128. 2
  66129. s
  66130. 2
  66131. 5
  66132. 5
  66133. 2
  66134. 5
  66135. 4
  66136. 2
  66137. 0
  66138. 0
  66139. 0
  66140. 0
  66141. 2
  66142. 1
  66143. #187
  66144. north
  66145.  
  66146. 0
  66147. 2
  66148. -1
  66149. -1
  66150. -1
  66151. 7
  66152. -1
  66153. 189
  66154. 0
  66155. 0
  66156. 13
  66157. 5
  66158. 2
  66159. 5
  66160. 1
  66161. 185
  66162. 2
  66163. 5
  66164. 1
  66165. 180
  66166. 2
  66167. 5
  66168. 5
  66169. 2
  66170. 5
  66171. 5
  66172. 2
  66173. 5
  66174. 5
  66175. 2
  66176. 5
  66177. 5
  66178. 2
  66179. 5
  66180. 5
  66181. 2
  66182. 5
  66183. 5
  66184. 2
  66185. 5
  66186. 0
  66187. 0
  66188. 2
  66189. 4
  66190. 4
  66191. 2
  66192. 2
  66193. north
  66194. 2
  66195. n
  66196. 2
  66197. 5
  66198. 5
  66199. 2
  66200. 5
  66201. 4
  66202. 2
  66203. 0
  66204. 0
  66205. 0
  66206. 0
  66207. 2
  66208. 1
  66209. #188
  66210. window hallway
  66211.  
  66212. 0
  66213. 2
  66214. -1
  66215. -1
  66216. -1
  66217. 3
  66218. -1
  66219. 191
  66220. 1
  66221. look
  66222. 2
  66223. 89
  66224. -2
  66225. 0
  66226. 17
  66227. 5
  66228. 2
  66229. 5
  66230. 5
  66231. 2
  66232. 5
  66233. 5
  66234. 2
  66235. 5
  66236. 5
  66237. 2
  66238. 5
  66239. 5
  66240. 2
  66241. 5
  66242. 5
  66243. 2
  66244. 5
  66245. 5
  66246. 2
  66247. 5
  66248. 4
  66249. 2
  66250. 1
  66251. 189
  66252. 1
  66253. 193
  66254. 2
  66255. 4
  66256. 1
  66257. -1
  66258. 2
  66259. 5
  66260. 0
  66261. 31551
  66262. 2
  66263. 5
  66264. 4
  66265. 2
  66266. 1
  66267. 190
  66268. 1
  66269. 192
  66270. 2
  66271. 4
  66272. 5
  66273. 2
  66274. 5
  66275. 5
  66276. 2
  66277. 5
  66278. 0
  66279. 0
  66280. 2
  66281. 4
  66282. 4
  66283. 1
  66284. 2
  66285. window hallway
  66286. 2
  66287. 5
  66288. 2
  66289. You are in an east-west hallway. There is a large window looking in on the Southern Cross conference room.
  66290. 2
  66291. 5
  66292. 4
  66293. 2
  66294. 0
  66295. 0
  66296. 0
  66297. 0
  66298. 2
  66299. 1
  66300. #189
  66301. west
  66302.  
  66303. 0
  66304. 2
  66305. -1
  66306. -1
  66307. -1
  66308. 7
  66309. -1
  66310. 190
  66311. 0
  66312. 0
  66313. 13
  66314. 5
  66315. 2
  66316. 5
  66317. 1
  66318. 180
  66319. 2
  66320. 5
  66321. 1
  66322. 188
  66323. 2
  66324. 5
  66325. 5
  66326. 2
  66327. 5
  66328. 5
  66329. 2
  66330. 5
  66331. 5
  66332. 2
  66333. 5
  66334. 5
  66335. 2
  66336. 5
  66337. 5
  66338. 2
  66339. 5
  66340. 5
  66341. 2
  66342. 5
  66343. 0
  66344. 0
  66345. 2
  66346. 4
  66347. 4
  66348. 2
  66349. 2
  66350. west
  66351. 2
  66352. w
  66353. 2
  66354. 5
  66355. 5
  66356. 2
  66357. 5
  66358. 4
  66359. 2
  66360. 0
  66361. 0
  66362. 0
  66363. 0
  66364. 2
  66365. 1
  66366. #190
  66367. east
  66368.  
  66369. 0
  66370. 2
  66371. -1
  66372. -1
  66373. -1
  66374. 7
  66375. -1
  66376. 192
  66377. 0
  66378. 0
  66379. 13
  66380. 5
  66381. 2
  66382. 5
  66383. 1
  66384. 188
  66385. 2
  66386. 5
  66387. 1
  66388. 180
  66389. 2
  66390. 5
  66391. 5
  66392. 2
  66393. 5
  66394. 5
  66395. 2
  66396. 5
  66397. 5
  66398. 2
  66399. 5
  66400. 5
  66401. 2
  66402. 5
  66403. 5
  66404. 2
  66405. 5
  66406. 5
  66407. 2
  66408. 5
  66409. 0
  66410. 0
  66411. 2
  66412. 4
  66413. 4
  66414. 2
  66415. 2
  66416. east
  66417. 2
  66418. e
  66419. 2
  66420. 5
  66421. 5
  66422. 2
  66423. 5
  66424. 4
  66425. 2
  66426. 0
  66427. 0
  66428. 0
  66429. 0
  66430. 2
  66431. 1
  66432. #191
  66433. kitchen-hallway
  66434.  
  66435. 0
  66436. 2
  66437. -1
  66438. -1
  66439. -1
  66440. 3
  66441. -1
  66442. 194
  66443. 0
  66444. 0
  66445. 17
  66446. 5
  66447. 2
  66448. 5
  66449. 5
  66450. 2
  66451. 5
  66452. 5
  66453. 2
  66454. 5
  66455. 5
  66456. 2
  66457. 5
  66458. 5
  66459. 2
  66460. 5
  66461. 5
  66462. 2
  66463. 5
  66464. 5
  66465. 2
  66466. 5
  66467. 4
  66468. 3
  66469. 1
  66470. 192
  66471. 1
  66472. 196
  66473. 1
  66474. 202
  66475. 2
  66476. 4
  66477. 1
  66478. -1
  66479. 2
  66480. 5
  66481. 0
  66482. 17642
  66483. 2
  66484. 5
  66485. 4
  66486. 3
  66487. 1
  66488. 193
  66489. 1
  66490. 195
  66491. 1
  66492. 201
  66493. 2
  66494. 4
  66495. 5
  66496. 2
  66497. 5
  66498. 5
  66499. 2
  66500. 5
  66501. 0
  66502. 0
  66503. 2
  66504. 4
  66505. 4
  66506. 1
  66507. 2
  66508. kitchen-hallway
  66509. 2
  66510. 5
  66511. 2
  66512. You are in an east-west hallway. There is an exit to the south.
  66513. 2
  66514. 5
  66515. 4
  66516. 2
  66517. 0
  66518. 0
  66519. 0
  66520. 0
  66521. 2
  66522. 1
  66523. #192
  66524. west
  66525.  
  66526. 0
  66527. 2
  66528. -1
  66529. -1
  66530. -1
  66531. 7
  66532. -1
  66533. 193
  66534. 0
  66535. 0
  66536. 13
  66537. 5
  66538. 2
  66539. 5
  66540. 1
  66541. 188
  66542. 2
  66543. 5
  66544. 1
  66545. 191
  66546. 2
  66547. 5
  66548. 5
  66549. 2
  66550. 5
  66551. 5
  66552. 2
  66553. 5
  66554. 5
  66555. 2
  66556. 5
  66557. 5
  66558. 2
  66559. 5
  66560. 5
  66561. 2
  66562. 5
  66563. 5
  66564. 2
  66565. 5
  66566. 0
  66567. 0
  66568. 2
  66569. 4
  66570. 4
  66571. 2
  66572. 2
  66573. west
  66574. 2
  66575. w
  66576. 2
  66577. 5
  66578. 5
  66579. 2
  66580. 5
  66581. 4
  66582. 2
  66583. 0
  66584. 0
  66585. 0
  66586. 0
  66587. 2
  66588. 1
  66589. #193
  66590. east
  66591.  
  66592. 0
  66593. 2
  66594. -1
  66595. -1
  66596. -1
  66597. 7
  66598. -1
  66599. 195
  66600. 0
  66601. 0
  66602. 13
  66603. 5
  66604. 2
  66605. 5
  66606. 1
  66607. 191
  66608. 2
  66609. 5
  66610. 1
  66611. 188
  66612. 2
  66613. 5
  66614. 5
  66615. 2
  66616. 5
  66617. 5
  66618. 2
  66619. 5
  66620. 5
  66621. 2
  66622. 5
  66623. 5
  66624. 2
  66625. 5
  66626. 5
  66627. 2
  66628. 5
  66629. 5
  66630. 2
  66631. 5
  66632. 0
  66633. 0
  66634. 2
  66635. 4
  66636. 4
  66637. 2
  66638. 2
  66639. east
  66640. 2
  66641. e
  66642. 2
  66643. 5
  66644. 5
  66645. 2
  66646. 5
  66647. 4
  66648. 2
  66649. 0
  66650. 0
  66651. 0
  66652. 0
  66653. 2
  66654. 1
  66655. #194
  66656. Kitchen
  66657.  
  66658. 0
  66659. 2
  66660. -1
  66661. 316
  66662. -1
  66663. 3
  66664. -1
  66665. 197
  66666. 0
  66667. 0
  66668. 17
  66669. 5
  66670. 2
  66671. 5
  66672. 5
  66673. 2
  66674. 5
  66675. 5
  66676. 2
  66677. 5
  66678. 5
  66679. 2
  66680. 5
  66681. 5
  66682. 2
  66683. 5
  66684. 5
  66685. 2
  66686. 5
  66687. 5
  66688. 2
  66689. 5
  66690. 4
  66691. 2
  66692. 1
  66693. 195
  66694. 1
  66695. 199
  66696. 2
  66697. 4
  66698. 1
  66699. -1
  66700. 2
  66701. 5
  66702. 0
  66703. 23263
  66704. 2
  66705. 5
  66706. 4
  66707. 2
  66708. 1
  66709. 196
  66710. 1
  66711. 198
  66712. 2
  66713. 4
  66714. 5
  66715. 2
  66716. 5
  66717. 5
  66718. 2
  66719. 5
  66720. 0
  66721. 0
  66722. 2
  66723. 4
  66724. 4
  66725. 1
  66726. 2
  66727. Kitchen
  66728. 2
  66729. 5
  66730. 2
  66731. You are in the kitchen. There are exits to the west and north.
  66732. 2
  66733. 5
  66734. 4
  66735. 2
  66736. 0
  66737. 0
  66738. 0
  66739. 0
  66740. 2
  66741. 1
  66742. #195
  66743. south
  66744.  
  66745. 0
  66746. 2
  66747. -1
  66748. -1
  66749. -1
  66750. 7
  66751. -1
  66752. 196
  66753. 0
  66754. 0
  66755. 13
  66756. 5
  66757. 2
  66758. 5
  66759. 1
  66760. 191
  66761. 2
  66762. 5
  66763. 1
  66764. 194
  66765. 2
  66766. 5
  66767. 5
  66768. 2
  66769. 5
  66770. 5
  66771. 2
  66772. 5
  66773. 5
  66774. 2
  66775. 5
  66776. 5
  66777. 2
  66778. 5
  66779. 5
  66780. 2
  66781. 5
  66782. 5
  66783. 2
  66784. 5
  66785. 0
  66786. 0
  66787. 2
  66788. 4
  66789. 4
  66790. 2
  66791. 2
  66792. south
  66793. 2
  66794. s
  66795. 2
  66796. 5
  66797. 5
  66798. 2
  66799. 5
  66800. 4
  66801. 2
  66802. 0
  66803. 0
  66804. 0
  66805. 0
  66806. 2
  66807. 1
  66808. #196
  66809. north
  66810.  
  66811. 0
  66812. 2
  66813. -1
  66814. -1
  66815. -1
  66816. 7
  66817. -1
  66818. 198
  66819. 0
  66820. 0
  66821. 13
  66822. 5
  66823. 2
  66824. 5
  66825. 1
  66826. 194
  66827. 2
  66828. 5
  66829. 1
  66830. 191
  66831. 2
  66832. 5
  66833. 5
  66834. 2
  66835. 5
  66836. 5
  66837. 2
  66838. 5
  66839. 5
  66840. 2
  66841. 5
  66842. 5
  66843. 2
  66844. 5
  66845. 5
  66846. 2
  66847. 5
  66848. 5
  66849. 2
  66850. 5
  66851. 0
  66852. 0
  66853. 2
  66854. 4
  66855. 4
  66856. 2
  66857. 2
  66858. north
  66859. 2
  66860. n
  66861. 2
  66862. 5
  66863. 5
  66864. 2
  66865. 5
  66866. 4
  66867. 2
  66868. 0
  66869. 0
  66870. 0
  66871. 0
  66872. 2
  66873. 1
  66874. #197
  66875. Dining Area
  66876.  
  66877. 0
  66878. 2
  66879. -1
  66880. 318
  66881. -1
  66882. 3
  66883. -1
  66884. 200
  66885. 0
  66886. 0
  66887. 17
  66888. 5
  66889. 2
  66890. 5
  66891. 5
  66892. 2
  66893. 5
  66894. 5
  66895. 2
  66896. 5
  66897. 5
  66898. 2
  66899. 5
  66900. 5
  66901. 2
  66902. 5
  66903. 5
  66904. 2
  66905. 5
  66906. 5
  66907. 2
  66908. 5
  66909. 4
  66910. 2
  66911. 1
  66912. 198
  66913. 1
  66914. 204
  66915. 2
  66916. 4
  66917. 1
  66918. -1
  66919. 2
  66920. 5
  66921. 0
  66922. 4526
  66923. 2
  66924. 5
  66925. 4
  66926. 2
  66927. 1
  66928. 199
  66929. 1
  66930. 203
  66931. 2
  66932. 4
  66933. 5
  66934. 2
  66935. 5
  66936. 5
  66937. 2
  66938. 5
  66939. 0
  66940. 0
  66941. 2
  66942. 4
  66943. 4
  66944. 1
  66945. 2
  66946. Dining Area
  66947. 2
  66948. 5
  66949. 2
  66950. You are in the dining area. There are exists to the east and northwest.
  66951. 2
  66952. 5
  66953. 4
  66954. 2
  66955. 0
  66956. 0
  66957. 0
  66958. 0
  66959. 2
  66960. 1
  66961. #198
  66962. west
  66963.  
  66964. 0
  66965. 2
  66966. -1
  66967. -1
  66968. -1
  66969. 7
  66970. -1
  66971. 199
  66972. 0
  66973. 0
  66974. 13
  66975. 5
  66976. 2
  66977. 5
  66978. 1
  66979. 194
  66980. 2
  66981. 5
  66982. 1
  66983. 197
  66984. 2
  66985. 5
  66986. 5
  66987. 2
  66988. 5
  66989. 5
  66990. 2
  66991. 5
  66992. 5
  66993. 2
  66994. 5
  66995. 5
  66996. 2
  66997. 5
  66998. 5
  66999. 2
  67000. 5
  67001. 5
  67002. 2
  67003. 5
  67004. 0
  67005. 0
  67006. 2
  67007. 4
  67008. 4
  67009. 2
  67010. 2
  67011. west
  67012. 2
  67013. w
  67014. 2
  67015. 5
  67016. 5
  67017. 2
  67018. 5
  67019. 4
  67020. 2
  67021. 0
  67022. 0
  67023. 0
  67024. 0
  67025. 2
  67026. 1
  67027. #199
  67028. east
  67029.  
  67030. 0
  67031. 2
  67032. -1
  67033. -1
  67034. -1
  67035. 7
  67036. -1
  67037. 201
  67038. 0
  67039. 0
  67040. 13
  67041. 5
  67042. 2
  67043. 5
  67044. 1
  67045. 197
  67046. 2
  67047. 5
  67048. 1
  67049. 194
  67050. 2
  67051. 5
  67052. 5
  67053. 2
  67054. 5
  67055. 5
  67056. 2
  67057. 5
  67058. 5
  67059. 2
  67060. 5
  67061. 5
  67062. 2
  67063. 5
  67064. 5
  67065. 2
  67066. 5
  67067. 5
  67068. 2
  67069. 5
  67070. 0
  67071. 0
  67072. 2
  67073. 4
  67074. 4
  67075. 2
  67076. 2
  67077. east
  67078. 2
  67079. e
  67080. 2
  67081. 5
  67082. 5
  67083. 2
  67084. 5
  67085. 4
  67086. 2
  67087. 0
  67088. 0
  67089. 0
  67090. 0
  67091. 2
  67092. 1
  67093. #200
  67094. hallway near Mark Farlin's cube
  67095.  
  67096. 0
  67097. 2
  67098. -1
  67099. -1
  67100. -1
  67101. 3
  67102. -1
  67103. 205
  67104. 0
  67105. 0
  67106. 17
  67107. 5
  67108. 2
  67109. 5
  67110. 5
  67111. 2
  67112. 5
  67113. 5
  67114. 2
  67115. 5
  67116. 5
  67117. 2
  67118. 5
  67119. 5
  67120. 2
  67121. 5
  67122. 5
  67123. 2
  67124. 5
  67125. 5
  67126. 2
  67127. 5
  67128. 4
  67129. 5
  67130. 1
  67131. 201
  67132. 1
  67133. 203
  67134. 1
  67135. 207
  67136. 1
  67137. 210
  67138. 1
  67139. 277
  67140. 2
  67141. 4
  67142. 1
  67143. -1
  67144. 2
  67145. 5
  67146. 0
  67147. 6112
  67148. 2
  67149. 5
  67150. 4
  67151. 5
  67152. 1
  67153. 202
  67154. 1
  67155. 204
  67156. 1
  67157. 206
  67158. 1
  67159. 209
  67160. 1
  67161. 276
  67162. 2
  67163. 4
  67164. 5
  67165. 2
  67166. 5
  67167. 5
  67168. 2
  67169. 5
  67170. 0
  67171. 0
  67172. 2
  67173. 4
  67174. 4
  67175. 1
  67176. 2
  67177. hallway near Mark Farlin's cube
  67178. 2
  67179. 5
  67180. 2
  67181. You are in a north-south hallway. Another hallway leads east, and there are doorways to the southeast and west.
  67182. 2
  67183. 5
  67184. 4
  67185. 2
  67186. 0
  67187. 0
  67188. 0
  67189. 0
  67190. 2
  67191. 1
  67192. #201
  67193. west
  67194.  
  67195. 0
  67196. 2
  67197. -1
  67198. -1
  67199. -1
  67200. 7
  67201. -1
  67202. 202
  67203. 0
  67204. 0
  67205. 13
  67206. 5
  67207. 2
  67208. 5
  67209. 1
  67210. 191
  67211. 2
  67212. 5
  67213. 1
  67214. 200
  67215. 2
  67216. 5
  67217. 5
  67218. 2
  67219. 5
  67220. 5
  67221. 2
  67222. 5
  67223. 5
  67224. 2
  67225. 5
  67226. 5
  67227. 2
  67228. 5
  67229. 5
  67230. 2
  67231. 5
  67232. 5
  67233. 2
  67234. 5
  67235. 0
  67236. 0
  67237. 2
  67238. 4
  67239. 4
  67240. 2
  67241. 2
  67242. west
  67243. 2
  67244. w
  67245. 2
  67246. 5
  67247. 5
  67248. 2
  67249. 5
  67250. 4
  67251. 2
  67252. 0
  67253. 0
  67254. 0
  67255. 0
  67256. 2
  67257. 1
  67258. #202
  67259. east
  67260.  
  67261. 0
  67262. 2
  67263. -1
  67264. -1
  67265. -1
  67266. 7
  67267. -1
  67268. 203
  67269. 0
  67270. 0
  67271. 13
  67272. 5
  67273. 2
  67274. 5
  67275. 1
  67276. 200
  67277. 2
  67278. 5
  67279. 1
  67280. 191
  67281. 2
  67282. 5
  67283. 5
  67284. 2
  67285. 5
  67286. 5
  67287. 2
  67288. 5
  67289. 5
  67290. 2
  67291. 5
  67292. 5
  67293. 2
  67294. 5
  67295. 5
  67296. 2
  67297. 5
  67298. 5
  67299. 2
  67300. 5
  67301. 0
  67302. 0
  67303. 2
  67304. 4
  67305. 4
  67306. 2
  67307. 2
  67308. east
  67309. 2
  67310. e
  67311. 2
  67312. 5
  67313. 5
  67314. 2
  67315. 5
  67316. 4
  67317. 2
  67318. 0
  67319. 0
  67320. 0
  67321. 0
  67322. 2
  67323. 1
  67324. #203
  67325. northwest
  67326.  
  67327. 0
  67328. 2
  67329. -1
  67330. -1
  67331. -1
  67332. 7
  67333. -1
  67334. 204
  67335. 0
  67336. 0
  67337. 13
  67338. 5
  67339. 2
  67340. 5
  67341. 1
  67342. 197
  67343. 2
  67344. 5
  67345. 1
  67346. 200
  67347. 2
  67348. 5
  67349. 5
  67350. 2
  67351. 5
  67352. 5
  67353. 2
  67354. 5
  67355. 5
  67356. 2
  67357. 5
  67358. 5
  67359. 2
  67360. 5
  67361. 5
  67362. 2
  67363. 5
  67364. 5
  67365. 2
  67366. 5
  67367. 0
  67368. 0
  67369. 2
  67370. 4
  67371. 4
  67372. 2
  67373. 2
  67374. northwest
  67375. 2
  67376. nw
  67377. 2
  67378. 5
  67379. 5
  67380. 2
  67381. 5
  67382. 4
  67383. 2
  67384. 0
  67385. 0
  67386. 0
  67387. 0
  67388. 2
  67389. 1
  67390. #204
  67391. southeast
  67392.  
  67393. 0
  67394. 2
  67395. -1
  67396. -1
  67397. -1
  67398. 7
  67399. -1
  67400. 206
  67401. 0
  67402. 0
  67403. 13
  67404. 5
  67405. 2
  67406. 5
  67407. 1
  67408. 200
  67409. 2
  67410. 5
  67411. 1
  67412. 197
  67413. 2
  67414. 5
  67415. 5
  67416. 2
  67417. 5
  67418. 5
  67419. 2
  67420. 5
  67421. 5
  67422. 2
  67423. 5
  67424. 5
  67425. 2
  67426. 5
  67427. 5
  67428. 2
  67429. 5
  67430. 5
  67431. 2
  67432. 5
  67433. 0
  67434. 0
  67435. 2
  67436. 4
  67437. 4
  67438. 2
  67439. 2
  67440. southeast
  67441. 2
  67442. se
  67443. 2
  67444. 5
  67445. 5
  67446. 2
  67447. 5
  67448. 4
  67449. 2
  67450. 0
  67451. 0
  67452. 0
  67453. 0
  67454. 2
  67455. 1
  67456. #205
  67457. Mark Farlin's Cube
  67458.  
  67459. 0
  67460. 2
  67461. -1
  67462. -1
  67463. -1
  67464. 3
  67465. -1
  67466. 208
  67467. 0
  67468. 0
  67469. 17
  67470. 5
  67471. 2
  67472. 5
  67473. 5
  67474. 2
  67475. 5
  67476. 5
  67477. 2
  67478. 5
  67479. 5
  67480. 2
  67481. 5
  67482. 5
  67483. 2
  67484. 5
  67485. 5
  67486. 2
  67487. 5
  67488. 5
  67489. 2
  67490. 5
  67491. 4
  67492. 1
  67493. 1
  67494. 206
  67495. 2
  67496. 4
  67497. 1
  67498. -1
  67499. 2
  67500. 5
  67501. 0
  67502. 11986
  67503. 2
  67504. 5
  67505. 4
  67506. 1
  67507. 1
  67508. 207
  67509. 2
  67510. 4
  67511. 5
  67512. 2
  67513. 5
  67514. 5
  67515. 2
  67516. 5
  67517. 0
  67518. 0
  67519. 2
  67520. 4
  67521. 4
  67522. 1
  67523. 2
  67524. Mark Farlin's Cube
  67525. 2
  67526. 5
  67527. 2
  67528. There are lots of lonely computers here, all running after dark. There is dust on the furniture.
  67529. 2
  67530. 5
  67531. 4
  67532. 2
  67533. 0
  67534. 0
  67535. 0
  67536. 0
  67537. 2
  67538. 1
  67539. #206
  67540. west
  67541.  
  67542. 0
  67543. 2
  67544. -1
  67545. -1
  67546. -1
  67547. 7
  67548. -1
  67549. 207
  67550. 0
  67551. 0
  67552. 13
  67553. 5
  67554. 2
  67555. 5
  67556. 1
  67557. 200
  67558. 2
  67559. 5
  67560. 1
  67561. 205
  67562. 2
  67563. 5
  67564. 5
  67565. 2
  67566. 5
  67567. 5
  67568. 2
  67569. 5
  67570. 5
  67571. 2
  67572. 5
  67573. 5
  67574. 2
  67575. 5
  67576. 5
  67577. 2
  67578. 5
  67579. 5
  67580. 2
  67581. 5
  67582. 0
  67583. 0
  67584. 2
  67585. 4
  67586. 4
  67587. 2
  67588. 2
  67589. west
  67590. 2
  67591. w
  67592. 2
  67593. 5
  67594. 5
  67595. 2
  67596. 5
  67597. 4
  67598. 2
  67599. 0
  67600. 0
  67601. 0
  67602. 0
  67603. 2
  67604. 1
  67605. #207
  67606. east
  67607.  
  67608. 0
  67609. 2
  67610. -1
  67611. -1
  67612. -1
  67613. 7
  67614. -1
  67615. 209
  67616. 0
  67617. 0
  67618. 13
  67619. 5
  67620. 2
  67621. 5
  67622. 1
  67623. 205
  67624. 2
  67625. 5
  67626. 1
  67627. 200
  67628. 2
  67629. 5
  67630. 5
  67631. 2
  67632. 5
  67633. 5
  67634. 2
  67635. 5
  67636. 5
  67637. 2
  67638. 5
  67639. 5
  67640. 2
  67641. 5
  67642. 5
  67643. 2
  67644. 5
  67645. 5
  67646. 2
  67647. 5
  67648. 0
  67649. 0
  67650. 2
  67651. 4
  67652. 4
  67653. 3
  67654. 2
  67655. east
  67656. 2
  67657. e
  67658. 2
  67659. out
  67660. 2
  67661. 5
  67662. 5
  67663. 2
  67664. 5
  67665. 4
  67666. 2
  67667. 0
  67668. 0
  67669. 0
  67670. 0
  67671. 2
  67672. 1
  67673. #208
  67674. library hallway
  67675.  
  67676. 0
  67677. 2
  67678. -1
  67679. -1
  67680. -1
  67681. 3
  67682. -1
  67683. 211
  67684. 0
  67685. 0
  67686. 17
  67687. 5
  67688. 2
  67689. 5
  67690. 5
  67691. 2
  67692. 5
  67693. 5
  67694. 2
  67695. 5
  67696. 5
  67697. 2
  67698. 5
  67699. 5
  67700. 2
  67701. 5
  67702. 5
  67703. 2
  67704. 5
  67705. 5
  67706. 2
  67707. 5
  67708. 4
  67709. 3
  67710. 1
  67711. 209
  67712. 1
  67713. 213
  67714. 1
  67715. 216
  67716. 2
  67717. 4
  67718. 1
  67719. -1
  67720. 2
  67721. 5
  67722. 0
  67723. 28532
  67724. 2
  67725. 5
  67726. 4
  67727. 3
  67728. 1
  67729. 210
  67730. 1
  67731. 212
  67732. 1
  67733. 215
  67734. 2
  67735. 4
  67736. 5
  67737. 2
  67738. 5
  67739. 5
  67740. 2
  67741. 5
  67742. 0
  67743. 0
  67744. 2
  67745. 4
  67746. 4
  67747. 1
  67748. 2
  67749. library hallway
  67750. 2
  67751. 5
  67752. 2
  67753. You are at the corner of two hallways which run east and south. There is a door to the west.
  67754. 2
  67755. 5
  67756. 4
  67757. 2
  67758. 0
  67759. 0
  67760. 0
  67761. 0
  67762. 2
  67763. 1
  67764. #209
  67765. north
  67766.  
  67767. 0
  67768. 2
  67769. -1
  67770. -1
  67771. -1
  67772. 7
  67773. -1
  67774. 210
  67775. 0
  67776. 0
  67777. 13
  67778. 5
  67779. 2
  67780. 5
  67781. 1
  67782. 200
  67783. 2
  67784. 5
  67785. 1
  67786. 208
  67787. 2
  67788. 5
  67789. 5
  67790. 2
  67791. 5
  67792. 5
  67793. 2
  67794. 5
  67795. 5
  67796. 2
  67797. 5
  67798. 5
  67799. 2
  67800. 5
  67801. 5
  67802. 2
  67803. 5
  67804. 5
  67805. 2
  67806. 5
  67807. 0
  67808. 0
  67809. 2
  67810. 4
  67811. 4
  67812. 2
  67813. 2
  67814. north
  67815. 2
  67816. n
  67817. 2
  67818. 5
  67819. 5
  67820. 2
  67821. 5
  67822. 4
  67823. 2
  67824. 0
  67825. 0
  67826. 0
  67827. 0
  67828. 2
  67829. 1
  67830. #210
  67831. south
  67832.  
  67833. 0
  67834. 2
  67835. -1
  67836. -1
  67837. -1
  67838. 7
  67839. -1
  67840. 212
  67841. 0
  67842. 0
  67843. 13
  67844. 5
  67845. 2
  67846. 5
  67847. 1
  67848. 208
  67849. 2
  67850. 5
  67851. 1
  67852. 200
  67853. 2
  67854. 5
  67855. 5
  67856. 2
  67857. 5
  67858. 5
  67859. 2
  67860. 5
  67861. 5
  67862. 2
  67863. 5
  67864. 5
  67865. 2
  67866. 5
  67867. 5
  67868. 2
  67869. 5
  67870. 5
  67871. 2
  67872. 5
  67873. 0
  67874. 0
  67875. 2
  67876. 4
  67877. 4
  67878. 2
  67879. 2
  67880. south
  67881. 2
  67882. s
  67883. 2
  67884. 5
  67885. 5
  67886. 2
  67887. 5
  67888. 4
  67889. 2
  67890. 0
  67891. 0
  67892. 0
  67893. 0
  67894. 2
  67895. 1
  67896. #211
  67897. Library
  67898.  
  67899. 0
  67900. 2
  67901. -1
  67902. 311
  67903. -1
  67904. 3
  67905. -1
  67906. 214
  67907. 0
  67908. 0
  67909. 17
  67910. 5
  67911. 2
  67912. 5
  67913. 5
  67914. 2
  67915. 5
  67916. 5
  67917. 2
  67918. 5
  67919. 5
  67920. 2
  67921. 5
  67922. 5
  67923. 2
  67924. 5
  67925. 5
  67926. 2
  67927. 5
  67928. 5
  67929. 2
  67930. 5
  67931. 4
  67932. 1
  67933. 1
  67934. 212
  67935. 2
  67936. 4
  67937. 1
  67938. -1
  67939. 2
  67940. 5
  67941. 0
  67942. 28698
  67943. 2
  67944. 5
  67945. 4
  67946. 1
  67947. 1
  67948. 213
  67949. 2
  67950. 4
  67951. 5
  67952. 2
  67953. 5
  67954. 5
  67955. 2
  67956. 5
  67957. 0
  67958. 0
  67959. 2
  67960. 4
  67961. 4
  67962. 1
  67963. 2
  67964. Library
  67965. 2
  67966. 5
  67967. 2
  67968. You are in the Orion library. There are lots of out-of-date publications here.
  67969. 2
  67970. 5
  67971. 4
  67972. 2
  67973. 0
  67974. 0
  67975. 0
  67976. 0
  67977. 2
  67978. 1
  67979. #212
  67980. west
  67981.  
  67982. 0
  67983. 2
  67984. -1
  67985. -1
  67986. -1
  67987. 7
  67988. -1
  67989. 213
  67990. 0
  67991. 0
  67992. 13
  67993. 5
  67994. 2
  67995. 5
  67996. 1
  67997. 208
  67998. 2
  67999. 5
  68000. 1
  68001. 211
  68002. 2
  68003. 5
  68004. 5
  68005. 2
  68006. 5
  68007. 5
  68008. 2
  68009. 5
  68010. 5
  68011. 2
  68012. 5
  68013. 5
  68014. 2
  68015. 5
  68016. 5
  68017. 2
  68018. 5
  68019. 5
  68020. 2
  68021. 5
  68022. 0
  68023. 0
  68024. 2
  68025. 4
  68026. 4
  68027. 2
  68028. 2
  68029. west
  68030. 2
  68031. w
  68032. 2
  68033. 5
  68034. 5
  68035. 2
  68036. 5
  68037. 4
  68038. 2
  68039. 0
  68040. 0
  68041. 0
  68042. 0
  68043. 2
  68044. 1
  68045. #213
  68046. east
  68047.  
  68048. 0
  68049. 2
  68050. -1
  68051. -1
  68052. -1
  68053. 7
  68054. -1
  68055. 215
  68056. 0
  68057. 0
  68058. 13
  68059. 5
  68060. 2
  68061. 5
  68062. 1
  68063. 211
  68064. 2
  68065. 5
  68066. 1
  68067. 208
  68068. 2
  68069. 5
  68070. 5
  68071. 2
  68072. 5
  68073. 5
  68074. 2
  68075. 5
  68076. 5
  68077. 2
  68078. 5
  68079. 5
  68080. 2
  68081. 5
  68082. 5
  68083. 2
  68084. 5
  68085. 5
  68086. 2
  68087. 5
  68088. 0
  68089. 0
  68090. 2
  68091. 4
  68092. 4
  68093. 3
  68094. 2
  68095. east
  68096. 2
  68097. e
  68098. 2
  68099. out
  68100. 2
  68101. 5
  68102. 5
  68103. 2
  68104. 5
  68105. 4
  68106. 2
  68107. 0
  68108. 0
  68109. 0
  68110. 0
  68111. 2
  68112. 1
  68113. #214
  68114. hallway near Tony's office
  68115.  
  68116. 0
  68117. 2
  68118. -1
  68119. -1
  68120. -1
  68121. 3
  68122. -1
  68123. 217
  68124. 0
  68125. 0
  68126. 17
  68127. 5
  68128. 2
  68129. 5
  68130. 5
  68131. 2
  68132. 5
  68133. 5
  68134. 2
  68135. 5
  68136. 5
  68137. 2
  68138. 5
  68139. 5
  68140. 2
  68141. 5
  68142. 5
  68143. 2
  68144. 5
  68145. 5
  68146. 2
  68147. 5
  68148. 4
  68149. 4
  68150. 1
  68151. 215
  68152. 1
  68153. 219
  68154. 1
  68155. 222
  68156. 1
  68157. 224
  68158. 2
  68159. 4
  68160. 1
  68161. -1
  68162. 2
  68163. 5
  68164. 0
  68165. 13181
  68166. 2
  68167. 5
  68168. 4
  68169. 4
  68170. 1
  68171. 216
  68172. 1
  68173. 218
  68174. 1
  68175. 221
  68176. 1
  68177. 223
  68178. 2
  68179. 4
  68180. 5
  68181. 2
  68182. 5
  68183. 5
  68184. 2
  68185. 5
  68186. 0
  68187. 0
  68188. 2
  68189. 4
  68190. 4
  68191. 1
  68192. 2
  68193. hallway near Tony's office
  68194. 2
  68195. 5
  68196. 2
  68197. You are in an east-west corridor. There are openings to the north and south.
  68198. 2
  68199. 5
  68200. 4
  68201. 2
  68202. 0
  68203. 0
  68204. 0
  68205. 0
  68206. 2
  68207. 1
  68208. #215
  68209. east
  68210.  
  68211. 0
  68212. 2
  68213. -1
  68214. -1
  68215. -1
  68216. 7
  68217. -1
  68218. 216
  68219. 0
  68220. 0
  68221. 13
  68222. 5
  68223. 2
  68224. 5
  68225. 1
  68226. 208
  68227. 2
  68228. 5
  68229. 1
  68230. 214
  68231. 2
  68232. 5
  68233. 5
  68234. 2
  68235. 5
  68236. 5
  68237. 2
  68238. 5
  68239. 5
  68240. 2
  68241. 5
  68242. 5
  68243. 2
  68244. 5
  68245. 5
  68246. 2
  68247. 5
  68248. 5
  68249. 2
  68250. 5
  68251. 0
  68252. 0
  68253. 2
  68254. 4
  68255. 4
  68256. 2
  68257. 2
  68258. east
  68259. 2
  68260. e
  68261. 2
  68262. 5
  68263. 5
  68264. 2
  68265. 5
  68266. 4
  68267. 2
  68268. 0
  68269. 0
  68270. 0
  68271. 0
  68272. 2
  68273. 1
  68274. #216
  68275. west
  68276.  
  68277. 0
  68278. 2
  68279. -1
  68280. -1
  68281. -1
  68282. 7
  68283. -1
  68284. 218
  68285. 0
  68286. 0
  68287. 13
  68288. 5
  68289. 2
  68290. 5
  68291. 1
  68292. 214
  68293. 2
  68294. 5
  68295. 1
  68296. 208
  68297. 2
  68298. 5
  68299. 5
  68300. 2
  68301. 5
  68302. 5
  68303. 2
  68304. 5
  68305. 5
  68306. 2
  68307. 5
  68308. 5
  68309. 2
  68310. 5
  68311. 5
  68312. 2
  68313. 5
  68314. 5
  68315. 2
  68316. 5
  68317. 0
  68318. 0
  68319. 2
  68320. 4
  68321. 4
  68322. 2
  68323. 2
  68324. west
  68325. 2
  68326. w
  68327. 2
  68328. 5
  68329. 5
  68330. 2
  68331. 5
  68332. 4
  68333. 2
  68334. 0
  68335. 0
  68336. 0
  68337. 0
  68338. 2
  68339. 1
  68340. #217
  68341. Tony's Office
  68342.  
  68343. 0
  68344. 2
  68345. -1
  68346. -1
  68347. -1
  68348. 3
  68349. -1
  68350. 220
  68351. 0
  68352. 0
  68353. 17
  68354. 5
  68355. 2
  68356. 5
  68357. 5
  68358. 2
  68359. 5
  68360. 5
  68361. 2
  68362. 5
  68363. 5
  68364. 2
  68365. 5
  68366. 5
  68367. 2
  68368. 5
  68369. 5
  68370. 2
  68371. 5
  68372. 5
  68373. 2
  68374. 5
  68375. 4
  68376. 1
  68377. 1
  68378. 218
  68379. 2
  68380. 4
  68381. 1
  68382. -1
  68383. 2
  68384. 5
  68385. 0
  68386. 19660
  68387. 2
  68388. 5
  68389. 4
  68390. 1
  68391. 1
  68392. 219
  68393. 2
  68394. 4
  68395. 5
  68396. 2
  68397. 5
  68398. 5
  68399. 2
  68400. 5
  68401. 0
  68402. 0
  68403. 2
  68404. 4
  68405. 4
  68406. 1
  68407. 2
  68408. Tony's Office
  68409. 2
  68410. 5
  68411. 2
  68412. You are in Tony Godino's office. Tony isn't here...
  68413. 2
  68414. 5
  68415. 4
  68416. 2
  68417. 0
  68418. 0
  68419. 0
  68420. 0
  68421. 2
  68422. 1
  68423. #218
  68424. north
  68425.  
  68426. 0
  68427. 2
  68428. -1
  68429. -1
  68430. -1
  68431. 7
  68432. -1
  68433. 219
  68434. 0
  68435. 0
  68436. 13
  68437. 5
  68438. 2
  68439. 5
  68440. 1
  68441. 214
  68442. 2
  68443. 5
  68444. 1
  68445. 217
  68446. 2
  68447. 5
  68448. 5
  68449. 2
  68450. 5
  68451. 5
  68452. 2
  68453. 5
  68454. 5
  68455. 2
  68456. 5
  68457. 5
  68458. 2
  68459. 5
  68460. 5
  68461. 2
  68462. 5
  68463. 5
  68464. 2
  68465. 5
  68466. 0
  68467. 0
  68468. 2
  68469. 4
  68470. 4
  68471. 2
  68472. 2
  68473. north
  68474. 2
  68475. n
  68476. 2
  68477. 5
  68478. 5
  68479. 2
  68480. 5
  68481. 4
  68482. 2
  68483. 0
  68484. 0
  68485. 0
  68486. 0
  68487. 2
  68488. 1
  68489. #219
  68490. south
  68491.  
  68492. 0
  68493. 2
  68494. -1
  68495. -1
  68496. -1
  68497. 7
  68498. -1
  68499. 221
  68500. 0
  68501. 0
  68502. 13
  68503. 5
  68504. 2
  68505. 5
  68506. 1
  68507. 217
  68508. 2
  68509. 5
  68510. 1
  68511. 214
  68512. 2
  68513. 5
  68514. 5
  68515. 2
  68516. 5
  68517. 5
  68518. 2
  68519. 5
  68520. 5
  68521. 2
  68522. 5
  68523. 5
  68524. 2
  68525. 5
  68526. 5
  68527. 2
  68528. 5
  68529. 5
  68530. 2
  68531. 5
  68532. 0
  68533. 0
  68534. 2
  68535. 4
  68536. 4
  68537. 2
  68538. 2
  68539. south
  68540. 2
  68541. s
  68542. 2
  68543. 5
  68544. 5
  68545. 2
  68546. 5
  68547. 4
  68548. 2
  68549. 0
  68550. 0
  68551. 0
  68552. 0
  68553. 2
  68554. 1
  68555. #220
  68556. Tools Cube
  68557.  
  68558. 0
  68559. 2
  68560. -1
  68561. -1
  68562. -1
  68563. 3
  68564. -1
  68565. 144
  68566. 0
  68567. 0
  68568. 17
  68569. 5
  68570. 2
  68571. 5
  68572. 5
  68573. 2
  68574. 5
  68575. 5
  68576. 2
  68577. 5
  68578. 5
  68579. 2
  68580. 5
  68581. 5
  68582. 2
  68583. 5
  68584. 5
  68585. 2
  68586. 5
  68587. 5
  68588. 2
  68589. 5
  68590. 4
  68591. 1
  68592. 1
  68593. 221
  68594. 2
  68595. 4
  68596. 1
  68597. -1
  68598. 2
  68599. 5
  68600. 0
  68601. 12123
  68602. 2
  68603. 5
  68604. 4
  68605. 1
  68606. 1
  68607. 222
  68608. 2
  68609. 4
  68610. 5
  68611. 2
  68612. 5
  68613. 5
  68614. 2
  68615. 5
  68616. 0
  68617. 0
  68618. 2
  68619. 4
  68620. 4
  68621. 1
  68622. 2
  68623. Tools Cube
  68624. 2
  68625. 5
  68626. 5
  68627. 2
  68628. 5
  68629. 4
  68630. 2
  68631. 0
  68632. 0
  68633. 0
  68634. 0
  68635. 2
  68636. 1
  68637. #221
  68638. south
  68639.  
  68640. 0
  68641. 2
  68642. -1
  68643. -1
  68644. -1
  68645. 7
  68646. -1
  68647. 222
  68648. 0
  68649. 0
  68650. 13
  68651. 5
  68652. 2
  68653. 5
  68654. 1
  68655. 214
  68656. 2
  68657. 5
  68658. 1
  68659. 220
  68660. 2
  68661. 5
  68662. 5
  68663. 2
  68664. 5
  68665. 5
  68666. 2
  68667. 5
  68668. 5
  68669. 2
  68670. 5
  68671. 5
  68672. 2
  68673. 5
  68674. 5
  68675. 2
  68676. 5
  68677. 5
  68678. 2
  68679. 5
  68680. 0
  68681. 0
  68682. 2
  68683. 4
  68684. 4
  68685. 2
  68686. 2
  68687. south
  68688. 2
  68689. s
  68690. 2
  68691. 5
  68692. 5
  68693. 2
  68694. 5
  68695. 4
  68696. 2
  68697. 0
  68698. 0
  68699. 0
  68700. 0
  68701. 2
  68702. 1
  68703. #222
  68704. north
  68705.  
  68706. 0
  68707. 2
  68708. -1
  68709. -1
  68710. -1
  68711. 7
  68712. -1
  68713. 223
  68714. 0
  68715. 0
  68716. 13
  68717. 5
  68718. 2
  68719. 5
  68720. 1
  68721. 220
  68722. 2
  68723. 5
  68724. 1
  68725. 214
  68726. 2
  68727. 5
  68728. 5
  68729. 2
  68730. 5
  68731. 5
  68732. 2
  68733. 5
  68734. 5
  68735. 2
  68736. 5
  68737. 5
  68738. 2
  68739. 5
  68740. 5
  68741. 2
  68742. 5
  68743. 5
  68744. 2
  68745. 5
  68746. 0
  68747. 0
  68748. 2
  68749. 4
  68750. 4
  68751. 2
  68752. 2
  68753. north
  68754. 2
  68755. n
  68756. 2
  68757. 5
  68758. 5
  68759. 2
  68760. 5
  68761. 4
  68762. 2
  68763. 0
  68764. 0
  68765. 0
  68766. 0
  68767. 2
  68768. 1
  68769. #223
  68770. east
  68771.  
  68772. 0
  68773. 2
  68774. -1
  68775. -1
  68776. -1
  68777. 7
  68778. -1
  68779. 224
  68780. 0
  68781. 0
  68782. 13
  68783. 5
  68784. 2
  68785. 5
  68786. 1
  68787. 214
  68788. 2
  68789. 5
  68790. 1
  68791. 148
  68792. 2
  68793. 5
  68794. 5
  68795. 2
  68796. 5
  68797. 5
  68798. 2
  68799. 5
  68800. 5
  68801. 2
  68802. 5
  68803. 5
  68804. 2
  68805. 5
  68806. 5
  68807. 2
  68808. 5
  68809. 5
  68810. 2
  68811. 5
  68812. 0
  68813. 0
  68814. 2
  68815. 4
  68816. 4
  68817. 2
  68818. 2
  68819. east
  68820. 2
  68821. e
  68822. 2
  68823. 5
  68824. 5
  68825. 2
  68826. 5
  68827. 4
  68828. 2
  68829. 0
  68830. 0
  68831. 0
  68832. 0
  68833. 2
  68834. 1
  68835. #224
  68836. west
  68837.  
  68838. 0
  68839. 2
  68840. -1
  68841. -1
  68842. -1
  68843. 7
  68844. -1
  68845. 225
  68846. 0
  68847. 0
  68848. 13
  68849. 5
  68850. 2
  68851. 5
  68852. 1
  68853. 148
  68854. 2
  68855. 5
  68856. 1
  68857. 214
  68858. 2
  68859. 5
  68860. 5
  68861. 2
  68862. 5
  68863. 5
  68864. 2
  68865. 5
  68866. 5
  68867. 2
  68868. 5
  68869. 5
  68870. 2
  68871. 5
  68872. 5
  68873. 2
  68874. 5
  68875. 5
  68876. 2
  68877. 5
  68878. 0
  68879. 0
  68880. 2
  68881. 4
  68882. 4
  68883. 2
  68884. 2
  68885. west
  68886. 2
  68887. w
  68888. 2
  68889. 5
  68890. 5
  68891. 2
  68892. 5
  68893. 4
  68894. 2
  68895. 0
  68896. 0
  68897. 0
  68898. 0
  68899. 2
  68900. 1
  68901. #225
  68902. south
  68903.  
  68904. 0
  68905. 2
  68906. -1
  68907. -1
  68908. -1
  68909. 7
  68910. -1
  68911. 145
  68912. 0
  68913. 0
  68914. 13
  68915. 5
  68916. 2
  68917. 5
  68918. 1
  68919. 148
  68920. 2
  68921. 5
  68922. 1
  68923. 143
  68924. 2
  68925. 5
  68926. 5
  68927. 2
  68928. 5
  68929. 5
  68930. 2
  68931. 5
  68932. 5
  68933. 2
  68934. 5
  68935. 5
  68936. 2
  68937. 5
  68938. 5
  68939. 2
  68940. 5
  68941. 5
  68942. 2
  68943. 5
  68944. 0
  68945. 0
  68946. 2
  68947. 4
  68948. 4
  68949. 2
  68950. 2
  68951. south
  68952. 2
  68953. s
  68954. 2
  68955. 5
  68956. 5
  68957. 2
  68958. 5
  68959. 4
  68960. 2
  68961. 0
  68962. 0
  68963. 0
  68964. 0
  68965. 2
  68966. 1
  68967. #226
  68968. south
  68969.  
  68970. 0
  68971. 2
  68972. -1
  68973. -1
  68974. -1
  68975. 7
  68976. -1
  68977. 227
  68978. 0
  68979. 0
  68980. 13
  68981. 5
  68982. 2
  68983. 5
  68984. 1
  68985. 137
  68986. 2
  68987. 5
  68988. 1
  68989. 144
  68990. 2
  68991. 5
  68992. 5
  68993. 2
  68994. 5
  68995. 5
  68996. 2
  68997. 5
  68998. 5
  68999. 2
  69000. 5
  69001. 5
  69002. 2
  69003. 5
  69004. 5
  69005. 2
  69006. 5
  69007. 5
  69008. 2
  69009. 5
  69010. 0
  69011. 0
  69012. 2
  69013. 4
  69014. 4
  69015. 2
  69016. 2
  69017. south
  69018. 2
  69019. s
  69020. 2
  69021. 5
  69022. 5
  69023. 2
  69024. 5
  69025. 4
  69026. 2
  69027. 0
  69028. 0
  69029. 0
  69030. 0
  69031. 2
  69032. 1
  69033. #227
  69034. north
  69035.  
  69036. 0
  69037. 2
  69038. -1
  69039. -1
  69040. -1
  69041. 7
  69042. -1
  69043. 230
  69044. 0
  69045. 0
  69046. 13
  69047. 5
  69048. 2
  69049. 5
  69050. 1
  69051. 144
  69052. 2
  69053. 5
  69054. 1
  69055. 137
  69056. 2
  69057. 5
  69058. 5
  69059. 2
  69060. 5
  69061. 5
  69062. 2
  69063. 5
  69064. 5
  69065. 2
  69066. 5
  69067. 5
  69068. 2
  69069. 5
  69070. 5
  69071. 2
  69072. 5
  69073. 5
  69074. 2
  69075. 5
  69076. 0
  69077. 0
  69078. 2
  69079. 4
  69080. 4
  69081. 3
  69082. 2
  69083. north
  69084. 2
  69085. n
  69086. 2
  69087. out
  69088. 2
  69089. 5
  69090. 5
  69091. 2
  69092. 5
  69093. 4
  69094. 2
  69095. 0
  69096. 0
  69097. 0
  69098. 0
  69099. 2
  69100. 1
  69101. #228
  69102. builder
  69103.  
  69104. 7
  69105. 228
  69106. 17
  69107. -1
  69108. 85
  69109. 58
  69110. -1
  69111. 147
  69112. 0
  69113. 0
  69114. 69
  69115. 5
  69116. 228
  69117. 5
  69118. 5
  69119. 228
  69120. 5
  69121. 5
  69122. 228
  69123. 5
  69124. 5
  69125. 228
  69126. 5
  69127. 5
  69128. 228
  69129. 5
  69130. 5
  69131. 228
  69132. 5
  69133. 5
  69134. 228
  69135. 5
  69136. 5
  69137. 228
  69138. 4
  69139. 5
  69140. 38
  69141. 1
  69142. 5
  69143. 228
  69144. 5
  69145. 5
  69146. 228
  69147. 5
  69148. 5
  69149. 228
  69150. 5
  69151. 5
  69152. 228
  69153. 5
  69154. 5
  69155. 38
  69156. 1
  69157. 4
  69158. 2
  69159. 0
  69160. -1464684526
  69161. 2
  69162. s_Macintosh.E.T._Phone_Home
  69163. 2
  69164. 0
  69165. 5
  69166. 228
  69167. 5
  69168. 2
  69169. any.orion
  69170. 2
  69171. 0
  69172. 0
  69173. -1463731235
  69174. 2
  69175. 1
  69176. 0
  69177. 0
  69178. 228
  69179. 5
  69180. 5
  69181. 228
  69182. 5
  69183. 5
  69184. 38
  69185. 1
  69186. 5
  69187. 38
  69188. 1
  69189. 5
  69190. 38
  69191. 0
  69192. 5
  69193. 38
  69194. 1
  69195. 5
  69196. 228
  69197. 5
  69198. 4
  69199. 132
  69200. 1
  69201. 228
  69202. 1
  69203. 231
  69204. 1
  69205. 232
  69206. 1
  69207. 233
  69208. 1
  69209. 234
  69210. 1
  69211. 235
  69212. 1
  69213. 236
  69214. 1
  69215. 237
  69216. 1
  69217. 238
  69218. 1
  69219. 239
  69220. 1
  69221. 240
  69222. 1
  69223. 241
  69224. 1
  69225. 242
  69226. 1
  69227. 243
  69228. 1
  69229. 244
  69230. 1
  69231. 245
  69232. 1
  69233. 246
  69234. 1
  69235. 247
  69236. 1
  69237. 248
  69238. 1
  69239. 249
  69240. 1
  69241. 250
  69242. 1
  69243. 251
  69244. 1
  69245. 252
  69246. 1
  69247. 253
  69248. 1
  69249. 254
  69250. 1
  69251. 255
  69252. 1
  69253. 256
  69254. 1
  69255. 257
  69256. 1
  69257. 258
  69258. 1
  69259. 259
  69260. 1
  69261. 260
  69262. 1
  69263. 261
  69264. 1
  69265. 262
  69266. 1
  69267. 263
  69268. 1
  69269. 264
  69270. 1
  69271. 267
  69272. 1
  69273. 174
  69274. 1
  69275. 268
  69276. 1
  69277. 270
  69278. 1
  69279. 271
  69280. 1
  69281. 272
  69282. 1
  69283. 273
  69284. 1
  69285. 274
  69286. 1
  69287. 275
  69288. 1
  69289. 276
  69290. 1
  69291. 277
  69292. 1
  69293. 278
  69294. 1
  69295. 266
  69296. 1
  69297. 279
  69298. 1
  69299. 280
  69300. 1
  69301. 281
  69302. 1
  69303. 282
  69304. 1
  69305. 265
  69306. 1
  69307. 283
  69308. 1
  69309. 284
  69310. 1
  69311. 285
  69312. 1
  69313. 286
  69314. 1
  69315. 287
  69316. 1
  69317. 288
  69318. 1
  69319. 289
  69320. 1
  69321. 290
  69322. 1
  69323. 299
  69324. 1
  69325. 300
  69326. 1
  69327. 354
  69328. 1
  69329. 355
  69330. 1
  69331. 356
  69332. 1
  69333. 357
  69334. 1
  69335. 358
  69336. 1
  69337. 359
  69338. 1
  69339. 360
  69340. 1
  69341. 361
  69342. 1
  69343. 362
  69344. 1
  69345. 363
  69346. 1
  69347. 364
  69348. 1
  69349. 365
  69350. 1
  69351. 366
  69352. 1
  69353. 367
  69354. 1
  69355. 368
  69356. 1
  69357. 369
  69358. 1
  69359. 370
  69360. 1
  69361. 371
  69362. 1
  69363. 372
  69364. 1
  69365. 373
  69366. 1
  69367. 374
  69368. 1
  69369. 375
  69370. 1
  69371. 376
  69372. 1
  69373. 377
  69374. 1
  69375. 378
  69376. 1
  69377. 379
  69378. 1
  69379. 380
  69380. 1
  69381. 381
  69382. 1
  69383. 382
  69384. 1
  69385. 383
  69386. 1
  69387. 384
  69388. 1
  69389. 385
  69390. 1
  69391. 386
  69392. 1
  69393. 387
  69394. 1
  69395. 388
  69396. 1
  69397. 389
  69398. 1
  69399. 390
  69400. 1
  69401. 391
  69402. 1
  69403. 392
  69404. 1
  69405. 393
  69406. 1
  69407. 394
  69408. 1
  69409. 395
  69410. 1
  69411. 396
  69412. 1
  69413. 397
  69414. 1
  69415. 398
  69416. 1
  69417. 399
  69418. 1
  69419. 400
  69420. 1
  69421. 401
  69422. 1
  69423. 402
  69424. 1
  69425. 403
  69426. 1
  69427. 404
  69428. 1
  69429. 405
  69430. 1
  69431. 406
  69432. 1
  69433. 407
  69434. 1
  69435. 408
  69436. 1
  69437. 409
  69438. 1
  69439. 410
  69440. 1
  69441. 411
  69442. 1
  69443. 412
  69444. 1
  69445. 413
  69446. 1
  69447. 414
  69448. 1
  69449. 415
  69450. 1
  69451. 416
  69452. 1
  69453. 417
  69454. 1
  69455. 418
  69456. 1
  69457. 419
  69458. 1
  69459. 420
  69460. 1
  69461. 421
  69462. 1
  69463. 422
  69464. 2
  69465. 1
  69466. 5
  69467. 38
  69468. 1
  69469. 1
  69470. 228
  69471. 228
  69472. 4
  69473. 4
  69474. 3
  69475. 2
  69476. Bob_Monsen@Hawksbill_Station.E.T._Phone_Home
  69477. 2
  69478. s_Macintosh.E.T._Phone_Home
  69479. 2
  69480. Bob_Monsen@Sartre.Orion
  69481. 2
  69482. 0
  69483. 2
  69484. Bob_Monsen@Hawksbill_Station.E.T._Phone_Home
  69485. 2
  69486. 0
  69487. 5
  69488. 228
  69489. 5
  69490. 4
  69491. 0
  69492. 228
  69493. 4
  69494. 5
  69495. 228
  69496. 5
  69497. 5
  69498. 228
  69499. 4
  69500. 5
  69501. 228
  69502. 4
  69503. 5
  69504. 228
  69505. 5
  69506. 5
  69507. 228
  69508. 5
  69509. 5
  69510. 228
  69511. 5
  69512. 5
  69513. 228
  69514. 5
  69515. 5
  69516. 228
  69517. 5
  69518. 5
  69519. 228
  69520. 5
  69521. 5
  69522. 228
  69523. 5
  69524. 5
  69525. 228
  69526. 5
  69527. 5
  69528. 228
  69529. 5
  69530. 4
  69531. 2
  69532. 0
  69533. 0
  69534. 0
  69535. 0
  69536. 228
  69537. 4
  69538. 4
  69539. 1
  69540. 4
  69541. 2
  69542. 0
  69543. 1
  69544. 4
  69545. 6
  69546. 0
  69547. -1464698968
  69548. 2
  69549. Bob (#2)
  69550. 2
  69551. *New-Prog-Log (#31) and builder (#228)
  69552. 2
  69553. @programmer builder (#228)
  69554. 2
  69555.  
  69556. 2
  69557. I just gave builder a programmer bit.
  69558. 228
  69559. 4
  69560. 0
  69561. 750802956
  69562. 2
  69563. 1
  69564. 0
  69565. 96
  69566. 2
  69567. 0
  69568. 5
  69569. 228
  69570. 5
  69571. 5
  69572. 228
  69573. 5
  69574. 5
  69575. 228
  69576. 5
  69577. 5
  69578. 228
  69579. 5
  69580. 5
  69581. 228
  69582. 5
  69583. 5
  69584. 228
  69585. 5
  69586. 5
  69587. 228
  69588. 5
  69589. 5
  69590. 228
  69591. 5
  69592. 5
  69593. 228
  69594. 5
  69595. 5
  69596. 228
  69597. 5
  69598. 0
  69599. 0
  69600. 2
  69601. 0
  69602. 5
  69603. 228
  69604. 5
  69605. 5
  69606. 228
  69607. 5
  69608. 5
  69609. 228
  69610. 5
  69611. 5
  69612. 228
  69613. 5
  69614. 5
  69615. 228
  69616. 5
  69617. 0
  69618. -1465041530
  69619. 2
  69620. 1
  69621. 0
  69622. 0
  69623. 228
  69624. 4
  69625. 4
  69626. 1
  69627. 2
  69628. builder
  69629. 2
  69630. 1
  69631. 5
  69632. 228
  69633. 5
  69634. 4
  69635. 2
  69636. 0
  69637. 0
  69638. 0
  69639. 0
  69640. 2
  69641. 1
  69642. #229
  69643. hallway near Susan's Cube
  69644.  
  69645. 0
  69646. 2
  69647. -1
  69648. -1
  69649. -1
  69650. 3
  69651. -1
  69652. 232
  69653. 0
  69654. 0
  69655. 17
  69656. 5
  69657. 2
  69658. 5
  69659. 5
  69660. 2
  69661. 5
  69662. 5
  69663. 2
  69664. 5
  69665. 5
  69666. 2
  69667. 5
  69668. 5
  69669. 2
  69670. 5
  69671. 5
  69672. 2
  69673. 5
  69674. 5
  69675. 2
  69676. 5
  69677. 4
  69678. 4
  69679. 1
  69680. 230
  69681. 1
  69682. 234
  69683. 1
  69684. 237
  69685. 1
  69686. 287
  69687. 2
  69688. 4
  69689. 1
  69690. -1
  69691. 2
  69692. 5
  69693. 0
  69694. 14008
  69695. 2
  69696. 5
  69697. 4
  69698. 4
  69699. 1
  69700. 231
  69701. 1
  69702. 233
  69703. 1
  69704. 236
  69705. 1
  69706. 288
  69707. 2
  69708. 4
  69709. 5
  69710. 2
  69711. 5
  69712. 5
  69713. 2
  69714. 5
  69715. 0
  69716. 0
  69717. 2
  69718. 4
  69719. 4
  69720. 1
  69721. 2
  69722. hallway near Susan's Cube
  69723. 2
  69724. 5
  69725. 2
  69726. You are in a north-south hallway. There is an opening towards the east.
  69727. 2
  69728. 5
  69729. 4
  69730. 2
  69731. 0
  69732. 0
  69733. 0
  69734. 0
  69735. 2
  69736. 1
  69737. #230
  69738. south
  69739.  
  69740. 0
  69741. 2
  69742. -1
  69743. -1
  69744. -1
  69745. 7
  69746. -1
  69747. 231
  69748. 0
  69749. 0
  69750. 13
  69751. 5
  69752. 2
  69753. 5
  69754. 1
  69755. 87
  69756. 2
  69757. 5
  69758. 1
  69759. 229
  69760. 2
  69761. 5
  69762. 5
  69763. 2
  69764. 5
  69765. 5
  69766. 2
  69767. 5
  69768. 5
  69769. 2
  69770. 5
  69771. 5
  69772. 2
  69773. 5
  69774. 5
  69775. 2
  69776. 5
  69777. 5
  69778. 2
  69779. 5
  69780. 0
  69781. 0
  69782. 2
  69783. 4
  69784. 4
  69785. 2
  69786. 2
  69787. south
  69788. 2
  69789. s
  69790. 2
  69791. 5
  69792. 5
  69793. 2
  69794. 5
  69795. 4
  69796. 2
  69797. 0
  69798. 0
  69799. 0
  69800. 0
  69801. 2
  69802. 1
  69803. #231
  69804. north
  69805.  
  69806. 0
  69807. 228
  69808. -1
  69809. -1
  69810. -1
  69811. 7
  69812. -1
  69813. 233
  69814. 0
  69815. 0
  69816. 13
  69817. 5
  69818. 228
  69819. 5
  69820. 1
  69821. 229
  69822. 228
  69823. 5
  69824. 1
  69825. 87
  69826. 228
  69827. 5
  69828. 5
  69829. 228
  69830. 5
  69831. 5
  69832. 228
  69833. 5
  69834. 5
  69835. 228
  69836. 5
  69837. 5
  69838. 228
  69839. 5
  69840. 5
  69841. 228
  69842. 5
  69843. 5
  69844. 228
  69845. 5
  69846. 0
  69847. 0
  69848. 228
  69849. 4
  69850. 4
  69851. 2
  69852. 2
  69853. north
  69854. 2
  69855. n
  69856. 228
  69857. 5
  69858. 5
  69859. 228
  69860. 5
  69861. 4
  69862. 2
  69863. 0
  69864. 0
  69865. 0
  69866. 0
  69867. 2
  69868. 1
  69869. #232
  69870. Susan's Cube
  69871.  
  69872. 0
  69873. 228
  69874. -1
  69875. -1
  69876. -1
  69877. 3
  69878. -1
  69879. 235
  69880. 0
  69881. 0
  69882. 17
  69883. 5
  69884. 228
  69885. 5
  69886. 5
  69887. 228
  69888. 5
  69889. 5
  69890. 228
  69891. 5
  69892. 5
  69893. 228
  69894. 5
  69895. 5
  69896. 228
  69897. 5
  69898. 5
  69899. 228
  69900. 5
  69901. 5
  69902. 228
  69903. 5
  69904. 4
  69905. 1
  69906. 1
  69907. 233
  69908. 228
  69909. 4
  69910. 1
  69911. -1
  69912. 228
  69913. 5
  69914. 0
  69915. 6242
  69916. 228
  69917. 5
  69918. 4
  69919. 1
  69920. 1
  69921. 234
  69922. 228
  69923. 4
  69924. 5
  69925. 228
  69926. 5
  69927. 5
  69928. 228
  69929. 5
  69930. 0
  69931. 0
  69932. 228
  69933. 4
  69934. 4
  69935. 1
  69936. 2
  69937. Susan's Cube
  69938. 228
  69939. 5
  69940. 5
  69941. 228
  69942. 5
  69943. 4
  69944. 2
  69945. 0
  69946. 0
  69947. 0
  69948. 0
  69949. 2
  69950. 1
  69951. #233
  69952. east
  69953.  
  69954. 0
  69955. 228
  69956. -1
  69957. -1
  69958. -1
  69959. 7
  69960. -1
  69961. 234
  69962. 0
  69963. 0
  69964. 13
  69965. 5
  69966. 228
  69967. 5
  69968. 1
  69969. 229
  69970. 228
  69971. 5
  69972. 1
  69973. 232
  69974. 228
  69975. 5
  69976. 5
  69977. 228
  69978. 5
  69979. 5
  69980. 228
  69981. 5
  69982. 5
  69983. 228
  69984. 5
  69985. 5
  69986. 228
  69987. 5
  69988. 5
  69989. 228
  69990. 5
  69991. 5
  69992. 228
  69993. 5
  69994. 0
  69995. 0
  69996. 228
  69997. 4
  69998. 4
  69999. 3
  70000. 2
  70001. east
  70002. 2
  70003. e
  70004. 2
  70005. in
  70006. 228
  70007. 5
  70008. 5
  70009. 228
  70010. 5
  70011. 4
  70012. 2
  70013. 0
  70014. 0
  70015. 0
  70016. 0
  70017. 2
  70018. 1
  70019. #234
  70020. west
  70021.  
  70022. 0
  70023. 228
  70024. -1
  70025. -1
  70026. -1
  70027. 7
  70028. -1
  70029. 236
  70030. 0
  70031. 0
  70032. 13
  70033. 5
  70034. 228
  70035. 5
  70036. 1
  70037. 232
  70038. 228
  70039. 5
  70040. 1
  70041. 229
  70042. 228
  70043. 5
  70044. 5
  70045. 228
  70046. 5
  70047. 5
  70048. 228
  70049. 5
  70050. 5
  70051. 228
  70052. 5
  70053. 5
  70054. 228
  70055. 5
  70056. 5
  70057. 228
  70058. 5
  70059. 5
  70060. 228
  70061. 5
  70062. 0
  70063. 0
  70064. 228
  70065. 4
  70066. 4
  70067. 3
  70068. 2
  70069. west
  70070. 2
  70071. w
  70072. 2
  70073. out
  70074. 228
  70075. 5
  70076. 5
  70077. 228
  70078. 5
  70079. 4
  70080. 2
  70081. 0
  70082. 0
  70083. 0
  70084. 0
  70085. 2
  70086. 1
  70087. #235
  70088. hallway near Paul's cube
  70089.  
  70090. 0
  70091. 228
  70092. -1
  70093. -1
  70094. -1
  70095. 3
  70096. -1
  70097. 238
  70098. 0
  70099. 0
  70100. 17
  70101. 5
  70102. 228
  70103. 5
  70104. 5
  70105. 228
  70106. 5
  70107. 5
  70108. 228
  70109. 5
  70110. 5
  70111. 228
  70112. 5
  70113. 5
  70114. 228
  70115. 5
  70116. 5
  70117. 228
  70118. 5
  70119. 5
  70120. 228
  70121. 5
  70122. 4
  70123. 3
  70124. 1
  70125. 236
  70126. 1
  70127. 240
  70128. 1
  70129. 243
  70130. 228
  70131. 4
  70132. 1
  70133. -1
  70134. 228
  70135. 5
  70136. 0
  70137. 14008
  70138. 228
  70139. 5
  70140. 4
  70141. 3
  70142. 1
  70143. 237
  70144. 1
  70145. 239
  70146. 1
  70147. 242
  70148. 228
  70149. 4
  70150. 5
  70151. 228
  70152. 5
  70153. 5
  70154. 228
  70155. 5
  70156. 0
  70157. 0
  70158. 228
  70159. 4
  70160. 4
  70161. 1
  70162. 2
  70163. hallway near Paul's cube
  70164. 228
  70165. 5
  70166. 2
  70167. You are in a north-south hallway. There is an opening towards the east.
  70168. 228
  70169. 5
  70170. 4
  70171. 2
  70172. 0
  70173. 0
  70174. 0
  70175. 0
  70176. 2
  70177. 1
  70178. #236
  70179. south
  70180.  
  70181. 0
  70182. 228
  70183. -1
  70184. -1
  70185. -1
  70186. 7
  70187. -1
  70188. 237
  70189. 0
  70190. 0
  70191. 13
  70192. 5
  70193. 228
  70194. 5
  70195. 1
  70196. 229
  70197. 228
  70198. 5
  70199. 1
  70200. 235
  70201. 228
  70202. 5
  70203. 5
  70204. 228
  70205. 5
  70206. 5
  70207. 228
  70208. 5
  70209. 5
  70210. 228
  70211. 5
  70212. 5
  70213. 228
  70214. 5
  70215. 5
  70216. 228
  70217. 5
  70218. 5
  70219. 228
  70220. 5
  70221. 0
  70222. 0
  70223. 228
  70224. 4
  70225. 4
  70226. 2
  70227. 2
  70228. south
  70229. 2
  70230. s
  70231. 228
  70232. 5
  70233. 5
  70234. 228
  70235. 5
  70236. 4
  70237. 2
  70238. 0
  70239. 0
  70240. 0
  70241. 0
  70242. 2
  70243. 1
  70244. #237
  70245. north
  70246.  
  70247. 0
  70248. 228
  70249. -1
  70250. -1
  70251. -1
  70252. 7
  70253. -1
  70254. 239
  70255. 0
  70256. 0
  70257. 13
  70258. 5
  70259. 228
  70260. 5
  70261. 1
  70262. 235
  70263. 228
  70264. 5
  70265. 1
  70266. 229
  70267. 228
  70268. 5
  70269. 5
  70270. 228
  70271. 5
  70272. 5
  70273. 228
  70274. 5
  70275. 5
  70276. 228
  70277. 5
  70278. 5
  70279. 228
  70280. 5
  70281. 5
  70282. 228
  70283. 5
  70284. 5
  70285. 228
  70286. 5
  70287. 0
  70288. 0
  70289. 228
  70290. 4
  70291. 4
  70292. 2
  70293. 2
  70294. north
  70295. 2
  70296. n
  70297. 228
  70298. 5
  70299. 5
  70300. 228
  70301. 5
  70302. 4
  70303. 2
  70304. 0
  70305. 0
  70306. 0
  70307. 0
  70308. 2
  70309. 1
  70310. #238
  70311. Paul's Cube
  70312.  
  70313. 0
  70314. 228
  70315. -1
  70316. -1
  70317. -1
  70318. 3
  70319. -1
  70320. 241
  70321. 0
  70322. 0
  70323. 17
  70324. 5
  70325. 228
  70326. 5
  70327. 5
  70328. 228
  70329. 5
  70330. 5
  70331. 228
  70332. 5
  70333. 5
  70334. 228
  70335. 5
  70336. 5
  70337. 228
  70338. 5
  70339. 5
  70340. 228
  70341. 5
  70342. 5
  70343. 228
  70344. 5
  70345. 4
  70346. 1
  70347. 1
  70348. 239
  70349. 228
  70350. 4
  70351. 1
  70352. -1
  70353. 228
  70354. 5
  70355. 0
  70356. 32636
  70357. 228
  70358. 5
  70359. 4
  70360. 1
  70361. 1
  70362. 240
  70363. 228
  70364. 4
  70365. 5
  70366. 228
  70367. 5
  70368. 5
  70369. 228
  70370. 5
  70371. 0
  70372. 0
  70373. 228
  70374. 4
  70375. 4
  70376. 1
  70377. 2
  70378. Paul's Cube
  70379. 228
  70380. 5
  70381. 5
  70382. 228
  70383. 5
  70384. 4
  70385. 2
  70386. 0
  70387. 0
  70388. 0
  70389. 0
  70390. 2
  70391. 1
  70392. #239
  70393. east
  70394.  
  70395. 0
  70396. 228
  70397. -1
  70398. -1
  70399. -1
  70400. 7
  70401. -1
  70402. 240
  70403. 0
  70404. 0
  70405. 13
  70406. 5
  70407. 228
  70408. 5
  70409. 1
  70410. 235
  70411. 228
  70412. 5
  70413. 1
  70414. 238
  70415. 228
  70416. 5
  70417. 5
  70418. 228
  70419. 5
  70420. 5
  70421. 228
  70422. 5
  70423. 5
  70424. 228
  70425. 5
  70426. 5
  70427. 228
  70428. 5
  70429. 5
  70430. 228
  70431. 5
  70432. 5
  70433. 228
  70434. 5
  70435. 0
  70436. 0
  70437. 228
  70438. 4
  70439. 4
  70440. 3
  70441. 2
  70442. east
  70443. 2
  70444. e
  70445. 2
  70446. in
  70447. 228
  70448. 5
  70449. 5
  70450. 228
  70451. 5
  70452. 4
  70453. 2
  70454. 0
  70455. 0
  70456. 0
  70457. 0
  70458. 2
  70459. 1
  70460. #240
  70461. west
  70462.  
  70463. 0
  70464. 228
  70465. -1
  70466. -1
  70467. -1
  70468. 7
  70469. -1
  70470. 242
  70471. 0
  70472. 0
  70473. 13
  70474. 5
  70475. 228
  70476. 5
  70477. 1
  70478. 238
  70479. 228
  70480. 5
  70481. 1
  70482. 235
  70483. 228
  70484. 5
  70485. 5
  70486. 228
  70487. 5
  70488. 5
  70489. 228
  70490. 5
  70491. 5
  70492. 228
  70493. 5
  70494. 5
  70495. 228
  70496. 5
  70497. 5
  70498. 228
  70499. 5
  70500. 5
  70501. 228
  70502. 5
  70503. 0
  70504. 0
  70505. 228
  70506. 4
  70507. 4
  70508. 3
  70509. 2
  70510. west
  70511. 2
  70512. w
  70513. 2
  70514. out
  70515. 228
  70516. 5
  70517. 5
  70518. 228
  70519. 5
  70520. 4
  70521. 2
  70522. 0
  70523. 0
  70524. 0
  70525. 0
  70526. 2
  70527. 1
  70528. #241
  70529. hallway near Dirk's cube
  70530.  
  70531. 0
  70532. 228
  70533. -1
  70534. -1
  70535. -1
  70536. 3
  70537. -1
  70538. 244
  70539. 0
  70540. 0
  70541. 17
  70542. 5
  70543. 228
  70544. 5
  70545. 5
  70546. 228
  70547. 5
  70548. 5
  70549. 228
  70550. 5
  70551. 5
  70552. 228
  70553. 5
  70554. 5
  70555. 228
  70556. 5
  70557. 5
  70558. 228
  70559. 5
  70560. 5
  70561. 228
  70562. 5
  70563. 4
  70564. 4
  70565. 1
  70566. 242
  70567. 1
  70568. 246
  70569. 1
  70570. 249
  70571. 1
  70572. 252
  70573. 228
  70574. 4
  70575. 1
  70576. -1
  70577. 228
  70578. 5
  70579. 0
  70580. 14008
  70581. 228
  70582. 5
  70583. 4
  70584. 4
  70585. 1
  70586. 243
  70587. 1
  70588. 245
  70589. 1
  70590. 248
  70591. 1
  70592. 251
  70593. 228
  70594. 4
  70595. 5
  70596. 228
  70597. 5
  70598. 5
  70599. 228
  70600. 5
  70601. 0
  70602. 0
  70603. 228
  70604. 4
  70605. 4
  70606. 1
  70607. 2
  70608. hallway near Dirk's cube
  70609. 228
  70610. 5
  70611. 2
  70612. You are at the corner of two hallways heading north and west. There is an opening to the east, and a door to the south.
  70613. 228
  70614. 5
  70615. 4
  70616. 2
  70617. 0
  70618. 0
  70619. 0
  70620. 0
  70621. 2
  70622. 1
  70623. #242
  70624. south
  70625.  
  70626. 0
  70627. 228
  70628. -1
  70629. -1
  70630. -1
  70631. 7
  70632. -1
  70633. 243
  70634. 0
  70635. 0
  70636. 13
  70637. 5
  70638. 228
  70639. 5
  70640. 1
  70641. 235
  70642. 228
  70643. 5
  70644. 1
  70645. 241
  70646. 228
  70647. 5
  70648. 5
  70649. 228
  70650. 5
  70651. 5
  70652. 228
  70653. 5
  70654. 5
  70655. 228
  70656. 5
  70657. 5
  70658. 228
  70659. 5
  70660. 5
  70661. 228
  70662. 5
  70663. 5
  70664. 228
  70665. 5
  70666. 0
  70667. 0
  70668. 228
  70669. 4
  70670. 4
  70671. 2
  70672. 2
  70673. south
  70674. 2
  70675. s
  70676. 228
  70677. 5
  70678. 5
  70679. 228
  70680. 5
  70681. 4
  70682. 2
  70683. 0
  70684. 0
  70685. 0
  70686. 0
  70687. 2
  70688. 1
  70689. #243
  70690. north
  70691.  
  70692. 0
  70693. 228
  70694. -1
  70695. -1
  70696. -1
  70697. 7
  70698. -1
  70699. 245
  70700. 0
  70701. 0
  70702. 13
  70703. 5
  70704. 228
  70705. 5
  70706. 1
  70707. 241
  70708. 228
  70709. 5
  70710. 1
  70711. 235
  70712. 228
  70713. 5
  70714. 5
  70715. 228
  70716. 5
  70717. 5
  70718. 228
  70719. 5
  70720. 5
  70721. 228
  70722. 5
  70723. 5
  70724. 228
  70725. 5
  70726. 5
  70727. 228
  70728. 5
  70729. 5
  70730. 228
  70731. 5
  70732. 0
  70733. 0
  70734. 228
  70735. 4
  70736. 4
  70737. 2
  70738. 2
  70739. north
  70740. 2
  70741. n
  70742. 228
  70743. 5
  70744. 5
  70745. 228
  70746. 5
  70747. 4
  70748. 2
  70749. 0
  70750. 0
  70751. 0
  70752. 0
  70753. 2
  70754. 1
  70755. #244
  70756. Dirk's Cube
  70757.  
  70758. 0
  70759. 228
  70760. -1
  70761. -1
  70762. -1
  70763. 3
  70764. -1
  70765. 247
  70766. 0
  70767. 0
  70768. 17
  70769. 5
  70770. 228
  70771. 5
  70772. 5
  70773. 228
  70774. 5
  70775. 5
  70776. 228
  70777. 5
  70778. 5
  70779. 228
  70780. 5
  70781. 5
  70782. 228
  70783. 5
  70784. 5
  70785. 228
  70786. 5
  70787. 5
  70788. 228
  70789. 5
  70790. 4
  70791. 1
  70792. 1
  70793. 245
  70794. 228
  70795. 4
  70796. 1
  70797. -1
  70798. 228
  70799. 5
  70800. 0
  70801. 26890
  70802. 228
  70803. 5
  70804. 4
  70805. 1
  70806. 1
  70807. 246
  70808. 228
  70809. 4
  70810. 5
  70811. 228
  70812. 5
  70813. 5
  70814. 228
  70815. 5
  70816. 0
  70817. 0
  70818. 228
  70819. 4
  70820. 4
  70821. 1
  70822. 2
  70823. Dirk's Cube
  70824. 228
  70825. 5
  70826. 5
  70827. 228
  70828. 5
  70829. 4
  70830. 2
  70831. 0
  70832. 0
  70833. 0
  70834. 0
  70835. 2
  70836. 1
  70837. #245
  70838. east
  70839.  
  70840. 0
  70841. 228
  70842. -1
  70843. -1
  70844. -1
  70845. 7
  70846. -1
  70847. 246
  70848. 0
  70849. 0
  70850. 13
  70851. 5
  70852. 228
  70853. 5
  70854. 1
  70855. 241
  70856. 228
  70857. 5
  70858. 1
  70859. 244
  70860. 228
  70861. 5
  70862. 5
  70863. 228
  70864. 5
  70865. 5
  70866. 228
  70867. 5
  70868. 5
  70869. 228
  70870. 5
  70871. 5
  70872. 228
  70873. 5
  70874. 5
  70875. 228
  70876. 5
  70877. 5
  70878. 228
  70879. 5
  70880. 0
  70881. 0
  70882. 228
  70883. 4
  70884. 4
  70885. 2
  70886. 2
  70887. east
  70888. 2
  70889. e
  70890. 228
  70891. 5
  70892. 5
  70893. 228
  70894. 5
  70895. 4
  70896. 2
  70897. 0
  70898. 0
  70899. 0
  70900. 0
  70901. 2
  70902. 1
  70903. #246
  70904. west
  70905.  
  70906. 0
  70907. 228
  70908. -1
  70909. -1
  70910. -1
  70911. 7
  70912. -1
  70913. 248
  70914. 0
  70915. 0
  70916. 13
  70917. 5
  70918. 228
  70919. 5
  70920. 1
  70921. 244
  70922. 228
  70923. 5
  70924. 1
  70925. 241
  70926. 228
  70927. 5
  70928. 5
  70929. 228
  70930. 5
  70931. 5
  70932. 228
  70933. 5
  70934. 5
  70935. 228
  70936. 5
  70937. 5
  70938. 228
  70939. 5
  70940. 5
  70941. 228
  70942. 5
  70943. 5
  70944. 228
  70945. 5
  70946. 0
  70947. 0
  70948. 228
  70949. 4
  70950. 4
  70951. 3
  70952. 2
  70953. west
  70954. 2
  70955. w
  70956. 2
  70957. out
  70958. 228
  70959. 5
  70960. 5
  70961. 228
  70962. 5
  70963. 4
  70964. 2
  70965. 0
  70966. 0
  70967. 0
  70968. 0
  70969. 2
  70970. 1
  70971. #247
  70972. Karen's Office
  70973.  
  70974. 0
  70975. 228
  70976. -1
  70977. 342
  70978. -1
  70979. 3
  70980. -1
  70981. 250
  70982. 0
  70983. 0
  70984. 17
  70985. 5
  70986. 228
  70987. 5
  70988. 5
  70989. 228
  70990. 5
  70991. 5
  70992. 228
  70993. 5
  70994. 5
  70995. 228
  70996. 5
  70997. 5
  70998. 228
  70999. 5
  71000. 5
  71001. 228
  71002. 5
  71003. 5
  71004. 228
  71005. 5
  71006. 4
  71007. 1
  71008. 1
  71009. 248
  71010. 228
  71011. 4
  71012. 1
  71013. -1
  71014. 228
  71015. 5
  71016. 0
  71017. 25406
  71018. 228
  71019. 5
  71020. 4
  71021. 1
  71022. 1
  71023. 249
  71024. 228
  71025. 4
  71026. 5
  71027. 228
  71028. 5
  71029. 5
  71030. 228
  71031. 5
  71032. 0
  71033. 0
  71034. 228
  71035. 4
  71036. 4
  71037. 1
  71038. 2
  71039. Karen's Office
  71040. 228
  71041. 5
  71042. 2
  71043. You are in Karen Chan's office. There is a doorway to the north.
  71044. 228
  71045. 5
  71046. 4
  71047. 2
  71048. 0
  71049. 0
  71050. 0
  71051. 0
  71052. 2
  71053. 1
  71054. #248
  71055. south
  71056.  
  71057. 0
  71058. 228
  71059. -1
  71060. -1
  71061. -1
  71062. 7
  71063. -1
  71064. 249
  71065. 0
  71066. 0
  71067. 13
  71068. 5
  71069. 228
  71070. 5
  71071. 1
  71072. 241
  71073. 228
  71074. 5
  71075. 1
  71076. 247
  71077. 228
  71078. 5
  71079. 5
  71080. 228
  71081. 5
  71082. 5
  71083. 228
  71084. 5
  71085. 5
  71086. 228
  71087. 5
  71088. 5
  71089. 228
  71090. 5
  71091. 5
  71092. 228
  71093. 5
  71094. 5
  71095. 228
  71096. 5
  71097. 0
  71098. 0
  71099. 228
  71100. 4
  71101. 4
  71102. 2
  71103. 2
  71104. south
  71105. 2
  71106. s
  71107. 228
  71108. 5
  71109. 5
  71110. 228
  71111. 5
  71112. 4
  71113. 2
  71114. 0
  71115. 0
  71116. 0
  71117. 0
  71118. 2
  71119. 1
  71120. #249
  71121. north
  71122.  
  71123. 0
  71124. 228
  71125. -1
  71126. -1
  71127. -1
  71128. 7
  71129. -1
  71130. 251
  71131. 0
  71132. 0
  71133. 13
  71134. 5
  71135. 228
  71136. 5
  71137. 1
  71138. 247
  71139. 228
  71140. 5
  71141. 1
  71142. 241
  71143. 228
  71144. 5
  71145. 5
  71146. 228
  71147. 5
  71148. 5
  71149. 228
  71150. 5
  71151. 5
  71152. 228
  71153. 5
  71154. 5
  71155. 228
  71156. 5
  71157. 5
  71158. 228
  71159. 5
  71160. 5
  71161. 228
  71162. 5
  71163. 0
  71164. 0
  71165. 228
  71166. 4
  71167. 4
  71168. 3
  71169. 2
  71170. north
  71171. 2
  71172. n
  71173. 2
  71174. out
  71175. 228
  71176. 5
  71177. 5
  71178. 228
  71179. 5
  71180. 4
  71181. 2
  71182. 0
  71183. 0
  71184. 0
  71185. 0
  71186. 2
  71187. 1
  71188. #250
  71189. hallway near Barb's cube
  71190.  
  71191. 0
  71192. 228
  71193. -1
  71194. -1
  71195. -1
  71196. 3
  71197. -1
  71198. 253
  71199. 0
  71200. 0
  71201. 17
  71202. 5
  71203. 228
  71204. 5
  71205. 5
  71206. 228
  71207. 5
  71208. 5
  71209. 228
  71210. 5
  71211. 5
  71212. 228
  71213. 5
  71214. 5
  71215. 228
  71216. 5
  71217. 5
  71218. 228
  71219. 5
  71220. 5
  71221. 228
  71222. 5
  71223. 4
  71224. 3
  71225. 1
  71226. 251
  71227. 1
  71228. 255
  71229. 1
  71230. 258
  71231. 228
  71232. 4
  71233. 1
  71234. -1
  71235. 228
  71236. 5
  71237. 0
  71238. 14008
  71239. 228
  71240. 5
  71241. 4
  71242. 3
  71243. 1
  71244. 252
  71245. 1
  71246. 254
  71247. 1
  71248. 257
  71249. 228
  71250. 4
  71251. 5
  71252. 228
  71253. 5
  71254. 5
  71255. 228
  71256. 5
  71257. 0
  71258. 0
  71259. 228
  71260. 4
  71261. 4
  71262. 1
  71263. 2
  71264. hallway near Barb's cube
  71265. 228
  71266. 5
  71267. 2
  71268. You are in an east-west hallway. There is an opening to the south.
  71269. 228
  71270. 5
  71271. 4
  71272. 2
  71273. 0
  71274. 0
  71275. 0
  71276. 0
  71277. 2
  71278. 1
  71279. #251
  71280. west
  71281.  
  71282. 0
  71283. 228
  71284. -1
  71285. -1
  71286. -1
  71287. 7
  71288. -1
  71289. 252
  71290. 0
  71291. 0
  71292. 13
  71293. 5
  71294. 228
  71295. 5
  71296. 1
  71297. 241
  71298. 228
  71299. 5
  71300. 1
  71301. 250
  71302. 228
  71303. 5
  71304. 5
  71305. 228
  71306. 5
  71307. 5
  71308. 228
  71309. 5
  71310. 5
  71311. 228
  71312. 5
  71313. 5
  71314. 228
  71315. 5
  71316. 5
  71317. 228
  71318. 5
  71319. 5
  71320. 228
  71321. 5
  71322. 0
  71323. 0
  71324. 228
  71325. 4
  71326. 4
  71327. 2
  71328. 2
  71329. west
  71330. 2
  71331. w
  71332. 228
  71333. 5
  71334. 5
  71335. 228
  71336. 5
  71337. 4
  71338. 2
  71339. 0
  71340. 0
  71341. 0
  71342. 0
  71343. 2
  71344. 1
  71345. #252
  71346. east
  71347.  
  71348. 0
  71349. 228
  71350. -1
  71351. -1
  71352. -1
  71353. 7
  71354. -1
  71355. 254
  71356. 0
  71357. 0
  71358. 13
  71359. 5
  71360. 228
  71361. 5
  71362. 1
  71363. 250
  71364. 228
  71365. 5
  71366. 1
  71367. 241
  71368. 228
  71369. 5
  71370. 5
  71371. 228
  71372. 5
  71373. 5
  71374. 228
  71375. 5
  71376. 5
  71377. 228
  71378. 5
  71379. 5
  71380. 228
  71381. 5
  71382. 5
  71383. 228
  71384. 5
  71385. 5
  71386. 228
  71387. 5
  71388. 0
  71389. 0
  71390. 228
  71391. 4
  71392. 4
  71393. 2
  71394. 2
  71395. east
  71396. 2
  71397. e
  71398. 228
  71399. 5
  71400. 5
  71401. 228
  71402. 5
  71403. 4
  71404. 2
  71405. 0
  71406. 0
  71407. 0
  71408. 0
  71409. 2
  71410. 1
  71411. #253
  71412. Barb Nolley's Cube
  71413.  
  71414. 0
  71415. 228
  71416. -1
  71417. -1
  71418. -1
  71419. 3
  71420. -1
  71421. 256
  71422. 0
  71423. 0
  71424. 17
  71425. 5
  71426. 228
  71427. 5
  71428. 5
  71429. 228
  71430. 5
  71431. 5
  71432. 228
  71433. 5
  71434. 5
  71435. 228
  71436. 5
  71437. 5
  71438. 228
  71439. 5
  71440. 5
  71441. 228
  71442. 5
  71443. 5
  71444. 228
  71445. 5
  71446. 4
  71447. 1
  71448. 1
  71449. 254
  71450. 228
  71451. 4
  71452. 1
  71453. -1
  71454. 228
  71455. 5
  71456. 0
  71457. 7908
  71458. 228
  71459. 5
  71460. 4
  71461. 1
  71462. 1
  71463. 255
  71464. 228
  71465. 4
  71466. 5
  71467. 228
  71468. 5
  71469. 5
  71470. 228
  71471. 5
  71472. 0
  71473. 0
  71474. 228
  71475. 4
  71476. 4
  71477. 1
  71478. 2
  71479. Barb Nolley's Cube
  71480. 228
  71481. 5
  71482. 5
  71483. 228
  71484. 5
  71485. 4
  71486. 2
  71487. 0
  71488. 0
  71489. 0
  71490. 0
  71491. 2
  71492. 1
  71493. #254
  71494. south
  71495.  
  71496. 0
  71497. 228
  71498. -1
  71499. -1
  71500. -1
  71501. 7
  71502. -1
  71503. 255
  71504. 0
  71505. 0
  71506. 13
  71507. 5
  71508. 228
  71509. 5
  71510. 1
  71511. 250
  71512. 228
  71513. 5
  71514. 1
  71515. 253
  71516. 228
  71517. 5
  71518. 5
  71519. 228
  71520. 5
  71521. 5
  71522. 228
  71523. 5
  71524. 5
  71525. 228
  71526. 5
  71527. 5
  71528. 228
  71529. 5
  71530. 5
  71531. 228
  71532. 5
  71533. 5
  71534. 228
  71535. 5
  71536. 0
  71537. 0
  71538. 228
  71539. 4
  71540. 4
  71541. 2
  71542. 2
  71543. south
  71544. 2
  71545. s
  71546. 228
  71547. 5
  71548. 5
  71549. 228
  71550. 5
  71551. 4
  71552. 2
  71553. 0
  71554. 0
  71555. 0
  71556. 0
  71557. 2
  71558. 1
  71559. #255
  71560. north
  71561.  
  71562. 0
  71563. 228
  71564. -1
  71565. -1
  71566. -1
  71567. 7
  71568. -1
  71569. 257
  71570. 0
  71571. 0
  71572. 13
  71573. 5
  71574. 228
  71575. 5
  71576. 1
  71577. 253
  71578. 228
  71579. 5
  71580. 1
  71581. 250
  71582. 228
  71583. 5
  71584. 5
  71585. 228
  71586. 5
  71587. 5
  71588. 228
  71589. 5
  71590. 5
  71591. 228
  71592. 5
  71593. 5
  71594. 228
  71595. 5
  71596. 5
  71597. 228
  71598. 5
  71599. 5
  71600. 228
  71601. 5
  71602. 0
  71603. 0
  71604. 228
  71605. 4
  71606. 4
  71607. 2
  71608. 2
  71609. north
  71610. 2
  71611. n
  71612. 228
  71613. 5
  71614. 5
  71615. 228
  71616. 5
  71617. 4
  71618. 2
  71619. 0
  71620. 0
  71621. 0
  71622. 0
  71623. 2
  71624. 1
  71625. #256
  71626. hallway near KanjiCube
  71627.  
  71628. 0
  71629. 228
  71630. -1
  71631. -1
  71632. -1
  71633. 3
  71634. -1
  71635. 259
  71636. 0
  71637. 0
  71638. 17
  71639. 5
  71640. 228
  71641. 5
  71642. 5
  71643. 228
  71644. 5
  71645. 5
  71646. 228
  71647. 5
  71648. 5
  71649. 228
  71650. 5
  71651. 5
  71652. 228
  71653. 5
  71654. 5
  71655. 228
  71656. 5
  71657. 5
  71658. 228
  71659. 5
  71660. 4
  71661. 3
  71662. 1
  71663. 257
  71664. 1
  71665. 261
  71666. 1
  71667. 264
  71668. 228
  71669. 4
  71670. 1
  71671. -1
  71672. 228
  71673. 5
  71674. 0
  71675. 14008
  71676. 228
  71677. 5
  71678. 4
  71679. 3
  71680. 1
  71681. 258
  71682. 1
  71683. 260
  71684. 1
  71685. 263
  71686. 228
  71687. 4
  71688. 5
  71689. 228
  71690. 5
  71691. 5
  71692. 228
  71693. 5
  71694. 0
  71695. 0
  71696. 228
  71697. 4
  71698. 4
  71699. 1
  71700. 2
  71701. hallway near KanjiCube
  71702. 228
  71703. 5
  71704. 2
  71705. You are in an east-west hallway. You suddenly want some tea.
  71706. 228
  71707. 5
  71708. 4
  71709. 2
  71710. 0
  71711. 0
  71712. 0
  71713. 0
  71714. 2
  71715. 1
  71716. #257
  71717. west
  71718.  
  71719. 0
  71720. 228
  71721. -1
  71722. -1
  71723. -1
  71724. 7
  71725. -1
  71726. 258
  71727. 0
  71728. 0
  71729. 13
  71730. 5
  71731. 228
  71732. 5
  71733. 1
  71734. 250
  71735. 228
  71736. 5
  71737. 1
  71738. 256
  71739. 228
  71740. 5
  71741. 5
  71742. 228
  71743. 5
  71744. 5
  71745. 228
  71746. 5
  71747. 5
  71748. 228
  71749. 5
  71750. 5
  71751. 228
  71752. 5
  71753. 5
  71754. 228
  71755. 5
  71756. 5
  71757. 228
  71758. 5
  71759. 0
  71760. 0
  71761. 228
  71762. 4
  71763. 4
  71764. 2
  71765. 2
  71766. west
  71767. 2
  71768. w
  71769. 228
  71770. 5
  71771. 5
  71772. 228
  71773. 5
  71774. 4
  71775. 2
  71776. 0
  71777. 0
  71778. 0
  71779. 0
  71780. 2
  71781. 1
  71782. #258
  71783. east
  71784.  
  71785. 0
  71786. 228
  71787. -1
  71788. -1
  71789. -1
  71790. 7
  71791. -1
  71792. 260
  71793. 0
  71794. 0
  71795. 13
  71796. 5
  71797. 228
  71798. 5
  71799. 1
  71800. 256
  71801. 228
  71802. 5
  71803. 1
  71804. 250
  71805. 228
  71806. 5
  71807. 5
  71808. 228
  71809. 5
  71810. 5
  71811. 228
  71812. 5
  71813. 5
  71814. 228
  71815. 5
  71816. 5
  71817. 228
  71818. 5
  71819. 5
  71820. 228
  71821. 5
  71822. 5
  71823. 228
  71824. 5
  71825. 0
  71826. 0
  71827. 228
  71828. 4
  71829. 4
  71830. 2
  71831. 2
  71832. east
  71833. 2
  71834. e
  71835. 228
  71836. 5
  71837. 5
  71838. 228
  71839. 5
  71840. 4
  71841. 2
  71842. 0
  71843. 0
  71844. 0
  71845. 0
  71846. 2
  71847. 1
  71848. #259
  71849. KanjiCube
  71850.  
  71851. 0
  71852. 228
  71853. -1
  71854. -1
  71855. -1
  71856. 3
  71857. -1
  71858. 262
  71859. 0
  71860. 0
  71861. 17
  71862. 5
  71863. 228
  71864. 5
  71865. 5
  71866. 228
  71867. 5
  71868. 5
  71869. 228
  71870. 5
  71871. 5
  71872. 228
  71873. 5
  71874. 5
  71875. 228
  71876. 5
  71877. 5
  71878. 228
  71879. 5
  71880. 5
  71881. 228
  71882. 5
  71883. 4
  71884. 1
  71885. 1
  71886. 260
  71887. 228
  71888. 4
  71889. 1
  71890. -1
  71891. 228
  71892. 5
  71893. 0
  71894. 5258
  71895. 228
  71896. 5
  71897. 4
  71898. 1
  71899. 1
  71900. 261
  71901. 228
  71902. 4
  71903. 5
  71904. 228
  71905. 5
  71906. 5
  71907. 228
  71908. 5
  71909. 0
  71910. 0
  71911. 228
  71912. 4
  71913. 4
  71914. 1
  71915. 2
  71916. KanjiCube
  71917. 228
  71918. 5
  71919. 5
  71920. 228
  71921. 5
  71922. 4
  71923. 2
  71924. 0
  71925. 0
  71926. 0
  71927. 0
  71928. 2
  71929. 1
  71930. #260
  71931. south
  71932.  
  71933. 0
  71934. 228
  71935. -1
  71936. -1
  71937. -1
  71938. 7
  71939. -1
  71940. 261
  71941. 0
  71942. 0
  71943. 13
  71944. 5
  71945. 228
  71946. 5
  71947. 1
  71948. 256
  71949. 228
  71950. 5
  71951. 1
  71952. 259
  71953. 228
  71954. 5
  71955. 5
  71956. 228
  71957. 5
  71958. 5
  71959. 228
  71960. 5
  71961. 5
  71962. 228
  71963. 5
  71964. 5
  71965. 228
  71966. 5
  71967. 5
  71968. 228
  71969. 5
  71970. 5
  71971. 228
  71972. 5
  71973. 0
  71974. 0
  71975. 228
  71976. 4
  71977. 4
  71978. 2
  71979. 2
  71980. south
  71981. 2
  71982. s
  71983. 228
  71984. 5
  71985. 5
  71986. 228
  71987. 5
  71988. 4
  71989. 2
  71990. 0
  71991. 0
  71992. 0
  71993. 0
  71994. 2
  71995. 1
  71996. #261
  71997. north
  71998.  
  71999. 0
  72000. 228
  72001. -1
  72002. -1
  72003. -1
  72004. 7
  72005. -1
  72006. 263
  72007. 0
  72008. 0
  72009. 13
  72010. 5
  72011. 228
  72012. 5
  72013. 1
  72014. 259
  72015. 228
  72016. 5
  72017. 1
  72018. 256
  72019. 228
  72020. 5
  72021. 5
  72022. 228
  72023. 5
  72024. 5
  72025. 228
  72026. 5
  72027. 5
  72028. 228
  72029. 5
  72030. 5
  72031. 228
  72032. 5
  72033. 5
  72034. 228
  72035. 5
  72036. 5
  72037. 228
  72038. 5
  72039. 0
  72040. 0
  72041. 228
  72042. 4
  72043. 4
  72044. 3
  72045. 2
  72046. north
  72047. 2
  72048. n
  72049. 2
  72050. out
  72051. 228
  72052. 5
  72053. 5
  72054. 228
  72055. 5
  72056. 4
  72057. 2
  72058. 0
  72059. 0
  72060. 0
  72061. 0
  72062. 2
  72063. 1
  72064. #262
  72065. lab hallway east
  72066.  
  72067. 0
  72068. 228
  72069. -1
  72070. -1
  72071. -1
  72072. 3
  72073. -1
  72074. 267
  72075. 0
  72076. 0
  72077. 17
  72078. 5
  72079. 228
  72080. 5
  72081. 5
  72082. 228
  72083. 5
  72084. 5
  72085. 228
  72086. 5
  72087. 5
  72088. 228
  72089. 5
  72090. 5
  72091. 228
  72092. 5
  72093. 5
  72094. 228
  72095. 5
  72096. 5
  72097. 228
  72098. 5
  72099. 4
  72100. 4
  72101. 1
  72102. 263
  72103. 1
  72104. 274
  72105. 1
  72106. 281
  72107. 1
  72108. 297
  72109. 228
  72110. 4
  72111. 1
  72112. -1
  72113. 228
  72114. 5
  72115. 0
  72116. 26310
  72117. 228
  72118. 5
  72119. 4
  72120. 4
  72121. 1
  72122. 264
  72123. 1
  72124. 272
  72125. 1
  72126. 282
  72127. 1
  72128. 296
  72129. 228
  72130. 4
  72131. 5
  72132. 228
  72133. 5
  72134. 5
  72135. 228
  72136. 5
  72137. 0
  72138. 0
  72139. 228
  72140. 4
  72141. 4
  72142. 1
  72143. 2
  72144. lab hallway east
  72145. 228
  72146. 5
  72147. 2
  72148. You are at the point is a north-south. There is another hallway leading east, and a door to the west.
  72149. 228
  72150. 5
  72151. 4
  72152. 2
  72153. 0
  72154. 0
  72155. 0
  72156. 0
  72157. 2
  72158. 1
  72159. #263
  72160. west
  72161.  
  72162. 0
  72163. 228
  72164. -1
  72165. -1
  72166. -1
  72167. 7
  72168. -1
  72169. 264
  72170. 0
  72171. 0
  72172. 13
  72173. 5
  72174. 228
  72175. 5
  72176. 1
  72177. 256
  72178. 228
  72179. 5
  72180. 1
  72181. 262
  72182. 228
  72183. 5
  72184. 5
  72185. 228
  72186. 5
  72187. 5
  72188. 228
  72189. 5
  72190. 5
  72191. 228
  72192. 5
  72193. 5
  72194. 228
  72195. 5
  72196. 5
  72197. 228
  72198. 5
  72199. 5
  72200. 228
  72201. 5
  72202. 0
  72203. 0
  72204. 228
  72205. 4
  72206. 4
  72207. 2
  72208. 2
  72209. west
  72210. 2
  72211. w
  72212. 228
  72213. 5
  72214. 5
  72215. 228
  72216. 5
  72217. 4
  72218. 2
  72219. 0
  72220. 0
  72221. 0
  72222. 0
  72223. 2
  72224. 1
  72225. #264
  72226. east
  72227.  
  72228. 0
  72229. 228
  72230. -1
  72231. -1
  72232. -1
  72233. 7
  72234. -1
  72235. 174
  72236. 0
  72237. 0
  72238. 13
  72239. 5
  72240. 228
  72241. 5
  72242. 1
  72243. 262
  72244. 228
  72245. 5
  72246. 1
  72247. 256
  72248. 228
  72249. 5
  72250. 5
  72251. 228
  72252. 5
  72253. 5
  72254. 228
  72255. 5
  72256. 5
  72257. 228
  72258. 5
  72259. 5
  72260. 228
  72261. 5
  72262. 5
  72263. 228
  72264. 5
  72265. 5
  72266. 228
  72267. 5
  72268. 0
  72269. 0
  72270. 228
  72271. 4
  72272. 4
  72273. 2
  72274. 2
  72275. east
  72276. 2
  72277. e
  72278. 228
  72279. 5
  72280. 5
  72281. 228
  72282. 5
  72283. 4
  72284. 2
  72285. 0
  72286. 0
  72287. 0
  72288. 0
  72289. 2
  72290. 1
  72291. #265
  72292. Bob's Mailbox
  72293.  
  72294. 0
  72295. 228
  72296. 266
  72297. -1
  72298. -1
  72299. 8
  72300. -1
  72301. 299
  72302. 1
  72303. g*et t*ake
  72304. 2
  72305. 41
  72306. -1
  72307. 0
  72308. 31
  72309. 5
  72310. 228
  72311. 5
  72312. 5
  72313. 228
  72314. 5
  72315. 5
  72316. 228
  72317. 5
  72318. 5
  72319. 228
  72320. 5
  72321. 5
  72322. 228
  72323. 5
  72324. 5
  72325. 228
  72326. 5
  72327. 5
  72328. 2
  72329. 1
  72330. 0
  72331. 0
  72332. 2
  72333. 1
  72334. 5
  72335. 228
  72336. 5
  72337. 5
  72338. 228
  72339. 5
  72340. 5
  72341. 228
  72342. 5
  72343. 5
  72344. 228
  72345. 5
  72346. 5
  72347. 228
  72348. 5
  72349. 5
  72350. 228
  72351. 5
  72352. 5
  72353. 228
  72354. 5
  72355. 5
  72356. 228
  72357. 5
  72358. 5
  72359. 228
  72360. 5
  72361. 0
  72362. 1
  72363. 2
  72364. 1
  72365. 5
  72366. 228
  72367. 4
  72368. 5
  72369. 228
  72370. 5
  72371. 5
  72372. 228
  72373. 5
  72374. 5
  72375. 228
  72376. 5
  72377. 5
  72378. 228
  72379. 5
  72380. 5
  72381. 228
  72382. 5
  72383. 5
  72384. 228
  72385. 5
  72386. 5
  72387. 228
  72388. 5
  72389. 5
  72390. 228
  72391. 5
  72392. 0
  72393. 0
  72394. 228
  72395. 4
  72396. 4
  72397. 3
  72398. 2
  72399. Bob's Mailbox
  72400. 2
  72401. mailbox
  72402. 2
  72403. box
  72404. 228
  72405. 5
  72406. 2
  72407. Bob Monsen's Mailbox
  72408. 228
  72409. 5
  72410. 4
  72411. 2
  72412. 0
  72413. 0
  72414. 0
  72415. 0
  72416. 2
  72417. 1
  72418. #266
  72419. hallway near mailboxes
  72420.  
  72421. 0
  72422. 228
  72423. -1
  72424. 265
  72425. -1
  72426. 3
  72427. -1
  72428. 284
  72429. 0
  72430. 0
  72431. 17
  72432. 5
  72433. 228
  72434. 5
  72435. 5
  72436. 228
  72437. 5
  72438. 5
  72439. 228
  72440. 5
  72441. 5
  72442. 228
  72443. 5
  72444. 5
  72445. 228
  72446. 5
  72447. 5
  72448. 228
  72449. 5
  72450. 5
  72451. 228
  72452. 5
  72453. 4
  72454. 2
  72455. 1
  72456. 279
  72457. 1
  72458. 282
  72459. 228
  72460. 4
  72461. 1
  72462. -1
  72463. 228
  72464. 5
  72465. 0
  72466. 4758
  72467. 228
  72468. 5
  72469. 4
  72470. 2
  72471. 1
  72472. 280
  72473. 1
  72474. 281
  72475. 228
  72476. 4
  72477. 5
  72478. 228
  72479. 5
  72480. 5
  72481. 228
  72482. 5
  72483. 0
  72484. 0
  72485. 228
  72486. 4
  72487. 4
  72488. 1
  72489. 2
  72490. hallway near mailboxes
  72491. 228
  72492. 5
  72493. 2
  72494. You are in a north-south hallway.
  72495. 228
  72496. 5
  72497. 4
  72498. 2
  72499. 0
  72500. 0
  72501. 0
  72502. 0
  72503. 2
  72504. 1
  72505. #267
  72506. lab hallway north
  72507.  
  72508. 0
  72509. 228
  72510. -1
  72511. -1
  72512. -1
  72513. 3
  72514. -1
  72515. 270
  72516. 0
  72517. 0
  72518. 17
  72519. 5
  72520. 228
  72521. 5
  72522. 5
  72523. 228
  72524. 5
  72525. 5
  72526. 228
  72527. 5
  72528. 5
  72529. 228
  72530. 5
  72531. 5
  72532. 228
  72533. 5
  72534. 5
  72535. 228
  72536. 5
  72537. 5
  72538. 228
  72539. 5
  72540. 4
  72541. 3
  72542. 1
  72543. 174
  72544. 1
  72545. 173
  72546. 1
  72547. 273
  72548. 228
  72549. 4
  72550. 1
  72551. -1
  72552. 228
  72553. 5
  72554. 0
  72555. 11616
  72556. 228
  72557. 5
  72558. 4
  72559. 3
  72560. 1
  72561. 268
  72562. 1
  72563. 269
  72564. 1
  72565. 271
  72566. 228
  72567. 4
  72568. 5
  72569. 228
  72570. 5
  72571. 5
  72572. 228
  72573. 5
  72574. 0
  72575. 0
  72576. 228
  72577. 4
  72578. 4
  72579. 1
  72580. 2
  72581. lab hallway north
  72582. 228
  72583. 5
  72584. 2
  72585. You are in an east-west hallway. There is an exit to the south. You hear the whirring of machines.
  72586. 228
  72587. 5
  72588. 4
  72589. 2
  72590. 0
  72591. 0
  72592. 0
  72593. 0
  72594. 2
  72595. 1
  72596. #268
  72597. east
  72598.  
  72599. 0
  72600. 228
  72601. -1
  72602. -1
  72603. -1
  72604. 7
  72605. -1
  72606. 173
  72607. 0
  72608. 0
  72609. 13
  72610. 5
  72611. 228
  72612. 5
  72613. 1
  72614. 267
  72615. 228
  72616. 5
  72617. 1
  72618. 158
  72619. 228
  72620. 5
  72621. 5
  72622. 228
  72623. 5
  72624. 5
  72625. 228
  72626. 5
  72627. 5
  72628. 228
  72629. 5
  72630. 5
  72631. 228
  72632. 5
  72633. 5
  72634. 228
  72635. 5
  72636. 5
  72637. 228
  72638. 5
  72639. 0
  72640. 0
  72641. 228
  72642. 4
  72643. 4
  72644. 2
  72645. 2
  72646. east
  72647. 2
  72648. e
  72649. 228
  72650. 5
  72651. 5
  72652. 228
  72653. 5
  72654. 4
  72655. 2
  72656. 0
  72657. 0
  72658. 0
  72659. 0
  72660. 2
  72661. 1
  72662. #269
  72663. west
  72664.  
  72665. 0
  72666. 2
  72667. -1
  72668. -1
  72669. -1
  72670. 7
  72671. -1
  72672. 271
  72673. 0
  72674. 0
  72675. 13
  72676. 5
  72677. 2
  72678. 5
  72679. 1
  72680. 267
  72681. 2
  72682. 5
  72683. 1
  72684. 172
  72685. 2
  72686. 5
  72687. 5
  72688. 2
  72689. 5
  72690. 5
  72691. 2
  72692. 5
  72693. 5
  72694. 2
  72695. 5
  72696. 5
  72697. 2
  72698. 5
  72699. 5
  72700. 2
  72701. 5
  72702. 5
  72703. 2
  72704. 5
  72705. 0
  72706. 0
  72707. 2
  72708. 4
  72709. 4
  72710. 2
  72711. 2
  72712. west
  72713. 2
  72714. w
  72715. 2
  72716. 5
  72717. 5
  72718. 2
  72719. 5
  72720. 4
  72721. 2
  72722. 0
  72723. 0
  72724. 0
  72725. 0
  72726. 2
  72727. 1
  72728. #270
  72729. Lab
  72730.  
  72731. 0
  72732. 228
  72733. -1
  72734. 308
  72735. -1
  72736. 3
  72737. -1
  72738. 275
  72739. 0
  72740. 0
  72741. 17
  72742. 5
  72743. 228
  72744. 5
  72745. 5
  72746. 228
  72747. 5
  72748. 5
  72749. 228
  72750. 5
  72751. 5
  72752. 228
  72753. 5
  72754. 5
  72755. 228
  72756. 5
  72757. 5
  72758. 228
  72759. 5
  72760. 5
  72761. 228
  72762. 5
  72763. 4
  72764. 2
  72765. 1
  72766. 271
  72767. 1
  72768. 272
  72769. 228
  72770. 4
  72771. 1
  72772. -1
  72773. 228
  72774. 5
  72775. 0
  72776. 8706
  72777. 228
  72778. 5
  72779. 4
  72780. 2
  72781. 1
  72782. 273
  72783. 1
  72784. 274
  72785. 228
  72786. 4
  72787. 5
  72788. 228
  72789. 5
  72790. 5
  72791. 228
  72792. 5
  72793. 0
  72794. 0
  72795. 228
  72796. 4
  72797. 4
  72798. 1
  72799. 2
  72800. Lab
  72801. 228
  72802. 5
  72803. 2
  72804. You are in a computer lab. There are old, outdated machines everywhere. The fans are loud and obnoxious.
  72805. 228
  72806. 5
  72807. 4
  72808. 2
  72809. 0
  72810. 0
  72811. 0
  72812. 0
  72813. 2
  72814. 1
  72815. #271
  72816. south
  72817.  
  72818. 0
  72819. 228
  72820. -1
  72821. -1
  72822. -1
  72823. 7
  72824. -1
  72825. 272
  72826. 0
  72827. 0
  72828. 13
  72829. 5
  72830. 228
  72831. 5
  72832. 1
  72833. 267
  72834. 228
  72835. 5
  72836. 1
  72837. 270
  72838. 228
  72839. 5
  72840. 5
  72841. 228
  72842. 5
  72843. 5
  72844. 228
  72845. 5
  72846. 5
  72847. 228
  72848. 5
  72849. 5
  72850. 228
  72851. 5
  72852. 5
  72853. 228
  72854. 5
  72855. 5
  72856. 228
  72857. 5
  72858. 0
  72859. 0
  72860. 228
  72861. 4
  72862. 4
  72863. 2
  72864. 2
  72865. south
  72866. 2
  72867. s
  72868. 228
  72869. 5
  72870. 5
  72871. 228
  72872. 5
  72873. 4
  72874. 2
  72875. 0
  72876. 0
  72877. 0
  72878. 0
  72879. 2
  72880. 1
  72881. #272
  72882. west
  72883.  
  72884. 0
  72885. 228
  72886. -1
  72887. -1
  72888. -1
  72889. 7
  72890. -1
  72891. 273
  72892. 0
  72893. 0
  72894. 13
  72895. 5
  72896. 228
  72897. 5
  72898. 1
  72899. 262
  72900. 228
  72901. 5
  72902. 1
  72903. 270
  72904. 228
  72905. 5
  72906. 5
  72907. 228
  72908. 5
  72909. 5
  72910. 228
  72911. 5
  72912. 5
  72913. 228
  72914. 5
  72915. 5
  72916. 228
  72917. 5
  72918. 5
  72919. 228
  72920. 5
  72921. 5
  72922. 228
  72923. 5
  72924. 0
  72925. 0
  72926. 228
  72927. 4
  72928. 4
  72929. 2
  72930. 2
  72931. west
  72932. 2
  72933. w
  72934. 228
  72935. 5
  72936. 5
  72937. 228
  72938. 5
  72939. 4
  72940. 2
  72941. 0
  72942. 0
  72943. 0
  72944. 0
  72945. 2
  72946. 1
  72947. #273
  72948. north
  72949.  
  72950. 0
  72951. 228
  72952. -1
  72953. -1
  72954. -1
  72955. 7
  72956. -1
  72957. 274
  72958. 0
  72959. 0
  72960. 13
  72961. 5
  72962. 228
  72963. 5
  72964. 1
  72965. 270
  72966. 228
  72967. 5
  72968. 1
  72969. 267
  72970. 228
  72971. 5
  72972. 5
  72973. 228
  72974. 5
  72975. 5
  72976. 228
  72977. 5
  72978. 5
  72979. 228
  72980. 5
  72981. 5
  72982. 228
  72983. 5
  72984. 5
  72985. 228
  72986. 5
  72987. 5
  72988. 228
  72989. 5
  72990. 0
  72991. 0
  72992. 228
  72993. 4
  72994. 4
  72995. 2
  72996. 2
  72997. north
  72998. 2
  72999. n
  73000. 228
  73001. 5
  73002. 5
  73003. 228
  73004. 5
  73005. 4
  73006. 2
  73007. 0
  73008. 0
  73009. 0
  73010. 0
  73011. 2
  73012. 1
  73013. #274
  73014. east
  73015.  
  73016. 0
  73017. 228
  73018. -1
  73019. -1
  73020. -1
  73021. 7
  73022. -1
  73023. 276
  73024. 0
  73025. 0
  73026. 13
  73027. 5
  73028. 228
  73029. 5
  73030. 1
  73031. 270
  73032. 228
  73033. 5
  73034. 1
  73035. 262
  73036. 228
  73037. 5
  73038. 5
  73039. 228
  73040. 5
  73041. 5
  73042. 228
  73043. 5
  73044. 5
  73045. 228
  73046. 5
  73047. 5
  73048. 228
  73049. 5
  73050. 5
  73051. 228
  73052. 5
  73053. 5
  73054. 228
  73055. 5
  73056. 0
  73057. 0
  73058. 228
  73059. 4
  73060. 4
  73061. 2
  73062. 2
  73063. east
  73064. 2
  73065. e
  73066. 228
  73067. 5
  73068. 5
  73069. 228
  73070. 5
  73071. 4
  73072. 2
  73073. 0
  73074. 0
  73075. 0
  73076. 0
  73077. 2
  73078. 1
  73079. #275
  73080. main entrance
  73081.  
  73082. 0
  73083. 228
  73084. -1
  73085. -1
  73086. -1
  73087. 3
  73088. -1
  73089. 266
  73090. 0
  73091. 0
  73092. 17
  73093. 5
  73094. 228
  73095. 5
  73096. 5
  73097. 228
  73098. 5
  73099. 5
  73100. 228
  73101. 5
  73102. 5
  73103. 228
  73104. 5
  73105. 5
  73106. 228
  73107. 5
  73108. 5
  73109. 228
  73110. 5
  73111. 5
  73112. 228
  73113. 5
  73114. 4
  73115. 1
  73116. 1
  73117. 276
  73118. 228
  73119. 4
  73120. 1
  73121. -1
  73122. 228
  73123. 5
  73124. 0
  73125. 22022
  73126. 228
  73127. 5
  73128. 4
  73129. 2
  73130. 1
  73131. 277
  73132. 1
  73133. 278
  73134. 228
  73135. 4
  73136. 5
  73137. 228
  73138. 5
  73139. 5
  73140. 228
  73141. 5
  73142. 0
  73143. 0
  73144. 228
  73145. 4
  73146. 4
  73147. 1
  73148. 2
  73149. main entrance
  73150. 228
  73151. 5
  73152. 2
  73153. You are in the main entryway to orion network systems. There are boxes and old terminals stacked here.
  73154. 228
  73155. 5
  73156. 4
  73157. 2
  73158. 0
  73159. 0
  73160. 0
  73161. 0
  73162. 2
  73163. 1
  73164. #276
  73165. south
  73166.  
  73167. 0
  73168. 228
  73169. -1
  73170. -1
  73171. -1
  73172. 7
  73173. -1
  73174. 277
  73175. 0
  73176. 0
  73177. 13
  73178. 5
  73179. 228
  73180. 5
  73181. 1
  73182. 200
  73183. 228
  73184. 5
  73185. 1
  73186. 275
  73187. 228
  73188. 5
  73189. 5
  73190. 228
  73191. 5
  73192. 5
  73193. 228
  73194. 5
  73195. 5
  73196. 228
  73197. 5
  73198. 5
  73199. 228
  73200. 5
  73201. 5
  73202. 228
  73203. 5
  73204. 5
  73205. 228
  73206. 5
  73207. 0
  73208. 0
  73209. 228
  73210. 4
  73211. 4
  73212. 2
  73213. 2
  73214. south
  73215. 2
  73216. s
  73217. 228
  73218. 5
  73219. 5
  73220. 228
  73221. 5
  73222. 4
  73223. 2
  73224. 0
  73225. 0
  73226. 0
  73227. 0
  73228. 2
  73229. 1
  73230. #277
  73231. north
  73232.  
  73233. 0
  73234. 228
  73235. -1
  73236. -1
  73237. -1
  73238. 7
  73239. -1
  73240. 278
  73241. 0
  73242. 0
  73243. 13
  73244. 5
  73245. 228
  73246. 5
  73247. 1
  73248. 275
  73249. 228
  73250. 5
  73251. 1
  73252. 200
  73253. 228
  73254. 5
  73255. 5
  73256. 228
  73257. 5
  73258. 5
  73259. 228
  73260. 5
  73261. 5
  73262. 228
  73263. 5
  73264. 5
  73265. 228
  73266. 5
  73267. 5
  73268. 228
  73269. 5
  73270. 5
  73271. 228
  73272. 5
  73273. 0
  73274. 0
  73275. 228
  73276. 4
  73277. 4
  73278. 2
  73279. 2
  73280. north
  73281. 2
  73282. n
  73283. 228
  73284. 5
  73285. 5
  73286. 228
  73287. 5
  73288. 4
  73289. 2
  73290. 0
  73291. 0
  73292. 0
  73293. 0
  73294. 2
  73295. 1
  73296. #278
  73297. south
  73298.  
  73299. 0
  73300. 228
  73301. -1
  73302. -1
  73303. -1
  73304. 7
  73305. -1
  73306. 279
  73307. 0
  73308. 0
  73309. 13
  73310. 5
  73311. 228
  73312. 5
  73313. 1
  73314. 275
  73315. 228
  73316. 5
  73317. 1
  73318. 168
  73319. 228
  73320. 5
  73321. 5
  73322. 228
  73323. 5
  73324. 5
  73325. 228
  73326. 5
  73327. 5
  73328. 228
  73329. 5
  73330. 5
  73331. 228
  73332. 5
  73333. 5
  73334. 228
  73335. 5
  73336. 2
  73337. You suddenly realize that its Hell out there...
  73338. 228
  73339. 5
  73340. 0
  73341. 0
  73342. 228
  73343. 4
  73344. 4
  73345. 2
  73346. 2
  73347. south
  73348. 2
  73349. s
  73350. 228
  73351. 5
  73352. 2
  73353. You look at the door. Its unlocked, and waiting for you. You smell sulphur...
  73354. 228
  73355. 5
  73356. 4
  73357. 2
  73358. 0
  73359. 0
  73360. 0
  73361. 0
  73362. 2
  73363. 1
  73364. #279
  73365. south
  73366.  
  73367. 0
  73368. 228
  73369. -1
  73370. -1
  73371. -1
  73372. 7
  73373. -1
  73374. 280
  73375. 0
  73376. 0
  73377. 13
  73378. 5
  73379. 228
  73380. 5
  73381. 1
  73382. 161
  73383. 228
  73384. 5
  73385. 1
  73386. 266
  73387. 228
  73388. 5
  73389. 5
  73390. 228
  73391. 5
  73392. 5
  73393. 228
  73394. 5
  73395. 5
  73396. 228
  73397. 5
  73398. 5
  73399. 228
  73400. 5
  73401. 5
  73402. 228
  73403. 5
  73404. 5
  73405. 228
  73406. 5
  73407. 0
  73408. 0
  73409. 228
  73410. 4
  73411. 4
  73412. 2
  73413. 2
  73414. south
  73415. 2
  73416. s
  73417. 228
  73418. 5
  73419. 5
  73420. 228
  73421. 5
  73422. 4
  73423. 2
  73424. 0
  73425. 0
  73426. 0
  73427. 0
  73428. 2
  73429. 1
  73430. #280
  73431. north
  73432.  
  73433. 0
  73434. 228
  73435. -1
  73436. -1
  73437. -1
  73438. 7
  73439. -1
  73440. 281
  73441. 0
  73442. 0
  73443. 13
  73444. 5
  73445. 228
  73446. 5
  73447. 1
  73448. 266
  73449. 228
  73450. 5
  73451. 1
  73452. 161
  73453. 228
  73454. 5
  73455. 5
  73456. 228
  73457. 5
  73458. 5
  73459. 228
  73460. 5
  73461. 5
  73462. 228
  73463. 5
  73464. 5
  73465. 228
  73466. 5
  73467. 5
  73468. 228
  73469. 5
  73470. 5
  73471. 228
  73472. 5
  73473. 0
  73474. 0
  73475. 228
  73476. 4
  73477. 4
  73478. 2
  73479. 2
  73480. north
  73481. 2
  73482. n
  73483. 228
  73484. 5
  73485. 5
  73486. 228
  73487. 5
  73488. 4
  73489. 2
  73490. 0
  73491. 0
  73492. 0
  73493. 0
  73494. 2
  73495. 1
  73496. #281
  73497. south
  73498.  
  73499. 0
  73500. 228
  73501. -1
  73502. -1
  73503. -1
  73504. 7
  73505. -1
  73506. 282
  73507. 0
  73508. 0
  73509. 13
  73510. 5
  73511. 228
  73512. 5
  73513. 1
  73514. 266
  73515. 228
  73516. 5
  73517. 1
  73518. 262
  73519. 228
  73520. 5
  73521. 5
  73522. 228
  73523. 5
  73524. 5
  73525. 228
  73526. 5
  73527. 5
  73528. 228
  73529. 5
  73530. 5
  73531. 228
  73532. 5
  73533. 5
  73534. 228
  73535. 5
  73536. 5
  73537. 228
  73538. 5
  73539. 0
  73540. 0
  73541. 228
  73542. 4
  73543. 4
  73544. 2
  73545. 2
  73546. south
  73547. 2
  73548. s
  73549. 228
  73550. 5
  73551. 5
  73552. 228
  73553. 5
  73554. 4
  73555. 2
  73556. 0
  73557. 0
  73558. 0
  73559. 0
  73560. 2
  73561. 1
  73562. #282
  73563. north
  73564.  
  73565. 0
  73566. 228
  73567. -1
  73568. -1
  73569. -1
  73570. 7
  73571. -1
  73572. 285
  73573. 0
  73574. 0
  73575. 13
  73576. 5
  73577. 228
  73578. 5
  73579. 1
  73580. 262
  73581. 228
  73582. 5
  73583. 1
  73584. 266
  73585. 228
  73586. 5
  73587. 5
  73588. 228
  73589. 5
  73590. 5
  73591. 228
  73592. 5
  73593. 5
  73594. 228
  73595. 5
  73596. 5
  73597. 228
  73598. 5
  73599. 5
  73600. 228
  73601. 5
  73602. 5
  73603. 228
  73604. 5
  73605. 0
  73606. 0
  73607. 228
  73608. 4
  73609. 4
  73610. 2
  73611. 2
  73612. north
  73613. 2
  73614. n
  73615. 228
  73616. 5
  73617. 5
  73618. 228
  73619. 5
  73620. 4
  73621. 2
  73622. 0
  73623. 0
  73624. 0
  73625. 0
  73626. 2
  73627. 1
  73628. #283
  73629. Pink Slip
  73630.  
  73631. 0
  73632. 228
  73633. 2
  73634. -1
  73635. 333
  73636. 9
  73637. -1
  73638. 305
  73639. 0
  73640. 0
  73641. 15
  73642. 5
  73643. 228
  73644. 5
  73645. 5
  73646. 228
  73647. 4
  73648. 4
  73649. 7
  73650. 2
  73651. Apple Computer regrets that we must terminate your
  73652. 2
  73653. employment, effective immediately. You have 60 days
  73654. 2
  73655. with which to find another job, at which time you will
  73656. 2
  73657. be booted from the premises. Thanks for your 
  73658. 2
  73659. contribution to Apple Computer, and we hope there
  73660. 2
  73661. are no hard feelings.
  73662. 2
  73663. Your friend, Michael Spindler.
  73664. 228
  73665. 4
  73666. 5
  73667. 228
  73668. 5
  73669. 5
  73670. 228
  73671. 5
  73672. 5
  73673. 228
  73674. 5
  73675. 5
  73676. 228
  73677. 5
  73678. 5
  73679. 228
  73680. 5
  73681. 5
  73682. 228
  73683. 5
  73684. 5
  73685. 228
  73686. 5
  73687. 5
  73688. 228
  73689. 5
  73690. 0
  73691. 0
  73692. 228
  73693. 4
  73694. 4
  73695. 3
  73696. 2
  73697. Pink Slip
  73698. 2
  73699. slip
  73700. 2
  73701. note
  73702. 228
  73703. 5
  73704. 5
  73705. 228
  73706. 5
  73707. 4
  73708. 2
  73709. 0
  73710. 0
  73711. 0
  73712. 0
  73713. 2
  73714. 1
  73715. #284
  73716. Videoconference Room
  73717.  
  73718. 0
  73719. 228
  73720. -1
  73721. 289
  73722. -1
  73723. 3
  73724. -1
  73725. 291
  73726. 0
  73727. 0
  73728. 17
  73729. 5
  73730. 228
  73731. 5
  73732. 5
  73733. 228
  73734. 5
  73735. 5
  73736. 228
  73737. 5
  73738. 5
  73739. 228
  73740. 5
  73741. 5
  73742. 228
  73743. 5
  73744. 5
  73745. 228
  73746. 5
  73747. 5
  73748. 228
  73749. 5
  73750. 4
  73751. 2
  73752. 1
  73753. 285
  73754. 1
  73755. 288
  73756. 228
  73757. 4
  73758. 1
  73759. -1
  73760. 228
  73761. 5
  73762. 0
  73763. 24751
  73764. 228
  73765. 5
  73766. 4
  73767. 2
  73768. 1
  73769. 286
  73770. 1
  73771. 287
  73772. 228
  73773. 4
  73774. 5
  73775. 228
  73776. 5
  73777. 5
  73778. 228
  73779. 5
  73780. 0
  73781. 0
  73782. 228
  73783. 4
  73784. 4
  73785. 1
  73786. 2
  73787. Videoconference Room
  73788. 228
  73789. 5
  73790. 2
  73791. You are in the Orion videoconference room. There are exits to the east and west.
  73792. 228
  73793. 5
  73794. 4
  73795. 2
  73796. 0
  73797. 0
  73798. 0
  73799. 0
  73800. 2
  73801. 1
  73802. #285
  73803. east
  73804.  
  73805. 0
  73806. 228
  73807. -1
  73808. -1
  73809. -1
  73810. 7
  73811. -1
  73812. 286
  73813. 0
  73814. 0
  73815. 13
  73816. 5
  73817. 228
  73818. 5
  73819. 1
  73820. 161
  73821. 228
  73822. 5
  73823. 1
  73824. 284
  73825. 228
  73826. 5
  73827. 5
  73828. 228
  73829. 5
  73830. 5
  73831. 228
  73832. 5
  73833. 5
  73834. 228
  73835. 5
  73836. 5
  73837. 228
  73838. 5
  73839. 5
  73840. 228
  73841. 5
  73842. 5
  73843. 228
  73844. 5
  73845. 0
  73846. 0
  73847. 228
  73848. 4
  73849. 4
  73850. 2
  73851. 2
  73852. east
  73853. 2
  73854. e
  73855. 228
  73856. 5
  73857. 5
  73858. 228
  73859. 5
  73860. 4
  73861. 2
  73862. 0
  73863. 0
  73864. 0
  73865. 0
  73866. 2
  73867. 1
  73868. #286
  73869. west
  73870.  
  73871. 0
  73872. 228
  73873. -1
  73874. -1
  73875. -1
  73876. 7
  73877. -1
  73878. 287
  73879. 0
  73880. 0
  73881. 13
  73882. 5
  73883. 228
  73884. 5
  73885. 1
  73886. 284
  73887. 228
  73888. 5
  73889. 1
  73890. 161
  73891. 228
  73892. 5
  73893. 5
  73894. 228
  73895. 5
  73896. 5
  73897. 228
  73898. 5
  73899. 5
  73900. 228
  73901. 5
  73902. 5
  73903. 228
  73904. 5
  73905. 5
  73906. 228
  73907. 5
  73908. 5
  73909. 228
  73910. 5
  73911. 0
  73912. 0
  73913. 228
  73914. 4
  73915. 4
  73916. 2
  73917. 2
  73918. west
  73919. 2
  73920. w
  73921. 228
  73922. 5
  73923. 5
  73924. 228
  73925. 5
  73926. 4
  73927. 2
  73928. 0
  73929. 0
  73930. 0
  73931. 0
  73932. 2
  73933. 1
  73934. #287
  73935. east
  73936.  
  73937. 0
  73938. 228
  73939. -1
  73940. -1
  73941. -1
  73942. 7
  73943. -1
  73944. 288
  73945. 0
  73946. 0
  73947. 13
  73948. 5
  73949. 228
  73950. 5
  73951. 1
  73952. 284
  73953. 228
  73954. 5
  73955. 1
  73956. 229
  73957. 228
  73958. 5
  73959. 5
  73960. 228
  73961. 5
  73962. 5
  73963. 228
  73964. 5
  73965. 5
  73966. 228
  73967. 5
  73968. 5
  73969. 228
  73970. 5
  73971. 5
  73972. 228
  73973. 5
  73974. 5
  73975. 228
  73976. 5
  73977. 0
  73978. 0
  73979. 228
  73980. 4
  73981. 4
  73982. 2
  73983. 2
  73984. east
  73985. 2
  73986. e
  73987. 228
  73988. 5
  73989. 5
  73990. 228
  73991. 5
  73992. 4
  73993. 2
  73994. 0
  73995. 0
  73996. 0
  73997. 0
  73998. 2
  73999. 1
  74000. #288
  74001. west
  74002.  
  74003. 0
  74004. 228
  74005. -1
  74006. -1
  74007. -1
  74008. 7
  74009. -1
  74010. 292
  74011. 0
  74012. 0
  74013. 13
  74014. 5
  74015. 228
  74016. 5
  74017. 1
  74018. 229
  74019. 228
  74020. 5
  74021. 1
  74022. 284
  74023. 228
  74024. 5
  74025. 5
  74026. 228
  74027. 5
  74028. 5
  74029. 228
  74030. 5
  74031. 5
  74032. 228
  74033. 5
  74034. 5
  74035. 228
  74036. 5
  74037. 5
  74038. 228
  74039. 5
  74040. 5
  74041. 228
  74042. 5
  74043. 0
  74044. 0
  74045. 228
  74046. 4
  74047. 4
  74048. 2
  74049. 2
  74050. west
  74051. 2
  74052. w
  74053. 228
  74054. 5
  74055. 5
  74056. 228
  74057. 5
  74058. 4
  74059. 2
  74060. 0
  74061. 0
  74062. 0
  74063. 0
  74064. 2
  74065. 1
  74066. #289
  74067. the desk
  74068.  
  74069. 0
  74070. 228
  74071. 284
  74072. -1
  74073. 290
  74074. 5
  74075. -1
  74076. 290
  74077. 1
  74078. sit
  74079. 228
  74080. 137
  74081. 1
  74082. 1
  74083. seated
  74084. 13
  74085. 4
  74086. 0
  74087. 228
  74088. 5
  74089. 5
  74090. 228
  74091. 5
  74092. 5
  74093. 228
  74094. 5
  74095. 5
  74096. 228
  74097. 5
  74098. 5
  74099. 228
  74100. 5
  74101. 5
  74102. 228
  74103. 5
  74104. 5
  74105. 228
  74106. 5
  74107. 5
  74108. 228
  74109. 5
  74110. 5
  74111. 228
  74112. 5
  74113. 0
  74114. 0
  74115. 228
  74116. 4
  74117. 4
  74118. 3
  74119. 2
  74120. the desk
  74121. 2
  74122. a desk
  74123. 2
  74124. desk
  74125. 228
  74126. 5
  74127. 2
  74128. The desk is wooden, with a blond color. It is massive, seating perhaps 20 people.
  74129. 228
  74130. 5
  74131. 4
  74132. 2
  74133. 0
  74134. 0
  74135. 0
  74136. 0
  74137. 2
  74138. 1
  74139. #290
  74140. a console
  74141.  
  74142. 0
  74143. 228
  74144. 284
  74145. -1
  74146. -1
  74147. 5
  74148. -1
  74149. 294
  74150. 0
  74151. 0
  74152. 12
  74153. 5
  74154. 228
  74155. 5
  74156. 5
  74157. 228
  74158. 5
  74159. 5
  74160. 228
  74161. 5
  74162. 5
  74163. 228
  74164. 5
  74165. 5
  74166. 228
  74167. 5
  74168. 5
  74169. 228
  74170. 5
  74171. 5
  74172. 228
  74173. 5
  74174. 5
  74175. 228
  74176. 5
  74177. 0
  74178. 0
  74179. 228
  74180. 4
  74181. 4
  74182. 3
  74183. 2
  74184. a console
  74185. 2
  74186. console
  74187. 2
  74188. the console
  74189. 228
  74190. 5
  74191. 2
  74192. You are looking at the videoconference room's control console. You are baffled by the buttons and switches.
  74193. 228
  74194. 5
  74195. 4
  74196. 2
  74197. 0
  74198. 0
  74199. 0
  74200. 0
  74201. 2
  74202. 1
  74203. #291
  74204. a Quadra 950
  74205.  
  74206. 0
  74207. 2
  74208. -1
  74209. 306
  74210. -1
  74211. 3
  74212. -1
  74213. 295
  74214. 0
  74215. 0
  74216. 17
  74217. 5
  74218. 2
  74219. 5
  74220. 5
  74221. 2
  74222. 5
  74223. 5
  74224. 2
  74225. 5
  74226. 5
  74227. 2
  74228. 5
  74229. 5
  74230. 2
  74231. 5
  74232. 5
  74233. 2
  74234. 5
  74235. 5
  74236. 2
  74237. 5
  74238. 4
  74239. 1
  74240. 1
  74241. 292
  74242. 2
  74243. 4
  74244. 1
  74245. -1
  74246. 2
  74247. 5
  74248. 0
  74249. 7790
  74250. 2
  74251. 5
  74252. 4
  74253. 1
  74254. 1
  74255. 293
  74256. 2
  74257. 4
  74258. 5
  74259. 2
  74260. 5
  74261. 5
  74262. 2
  74263. 5
  74264. 0
  74265. 0
  74266. 2
  74267. 4
  74268. 4
  74269. 1
  74270. 2
  74271. a Quadra 950
  74272. 2
  74273. 5
  74274. 2
  74275. You are in Bob's computer. There is a loud whirring here.
  74276. 2
  74277. 5
  74278. 4
  74279. 2
  74280. 0
  74281. 0
  74282. 0
  74283. 0
  74284. 2
  74285. 1
  74286. #292
  74287. enter
  74288.  
  74289. 0
  74290. 2
  74291. -1
  74292. -1
  74293. -1
  74294. 7
  74295. -1
  74296. 293
  74297. 0
  74298. 0
  74299. 13
  74300. 5
  74301. 2
  74302. 5
  74303. 1
  74304. 82
  74305. 2
  74306. 5
  74307. 1
  74308. 291
  74309. 2
  74310. 5
  74311. 5
  74312. 2
  74313. 5
  74314. 5
  74315. 2
  74316. 5
  74317. 5
  74318. 2
  74319. 5
  74320. 5
  74321. 2
  74322. 5
  74323. 5
  74324. 2
  74325. 5
  74326. 5
  74327. 2
  74328. 5
  74329. 0
  74330. 0
  74331. 2
  74332. 4
  74333. 4
  74334. 2
  74335. 2
  74336. enter
  74337. 2
  74338. in
  74339. 2
  74340. 5
  74341. 5
  74342. 2
  74343. 5
  74344. 4
  74345. 2
  74346. 0
  74347. 0
  74348. 0
  74349. 0
  74350. 2
  74351. 1
  74352. #293
  74353. out
  74354.  
  74355. 0
  74356. 2
  74357. -1
  74358. -1
  74359. -1
  74360. 7
  74361. -1
  74362. 296
  74363. 0
  74364. 0
  74365. 13
  74366. 5
  74367. 2
  74368. 5
  74369. 1
  74370. 291
  74371. 2
  74372. 5
  74373. 1
  74374. 82
  74375. 2
  74376. 5
  74377. 5
  74378. 2
  74379. 5
  74380. 5
  74381. 2
  74382. 5
  74383. 5
  74384. 2
  74385. 5
  74386. 5
  74387. 2
  74388. 5
  74389. 5
  74390. 2
  74391. 5
  74392. 5
  74393. 2
  74394. 5
  74395. 0
  74396. 0
  74397. 2
  74398. 4
  74399. 4
  74400. 2
  74401. 2
  74402. out
  74403. 2
  74404. exit
  74405. 2
  74406. 5
  74407. 5
  74408. 2
  74409. 5
  74410. 4
  74411. 2
  74412. 0
  74413. 0
  74414. 0
  74415. 0
  74416. 2
  74417. 1
  74418. #294
  74419. a Quadra 950
  74420.  
  74421. 0
  74422. 2
  74423. 82
  74424. -1
  74425. 426
  74426. 5
  74427. -1
  74428. 300
  74429. 2
  74430. g*et t*ake
  74431. 2
  74432. 41
  74433. -1
  74434. in enter
  74435. 2
  74436. 41
  74437. -1
  74438. 0
  74439. 12
  74440. 5
  74441. 2
  74442. 5
  74443. 5
  74444. 2
  74445. 5
  74446. 5
  74447. 2
  74448. 5
  74449. 5
  74450. 2
  74451. 5
  74452. 5
  74453. 2
  74454. 5
  74455. 5
  74456. 2
  74457. 5
  74458. 5
  74459. 2
  74460. 5
  74461. 5
  74462. 2
  74463. 5
  74464. 0
  74465. 0
  74466. 2
  74467. 4
  74468. 4
  74469. 4
  74470. 2
  74471. a Quadra 950
  74472. 2
  74473. Quadra
  74474. 2
  74475. Mac*intosh
  74476. 2
  74477. Computer
  74478. 2
  74479. 5
  74480. 5
  74481. 2
  74482. 5
  74483. 4
  74484. 2
  74485. 0
  74486. 0
  74487. 0
  74488. 0
  74489. 2
  74490. 1
  74491. #295
  74492. back entrance hallway
  74493.  
  74494. 0
  74495. 2
  74496. -1
  74497. -1
  74498. -1
  74499. 3
  74500. -1
  74501. 302
  74502. 0
  74503. 0
  74504. 17
  74505. 5
  74506. 2
  74507. 5
  74508. 5
  74509. 2
  74510. 5
  74511. 5
  74512. 2
  74513. 5
  74514. 5
  74515. 2
  74516. 5
  74517. 5
  74518. 2
  74519. 5
  74520. 5
  74521. 2
  74522. 5
  74523. 5
  74524. 2
  74525. 5
  74526. 4
  74527. 2
  74528. 1
  74529. 296
  74530. 1
  74531. 304
  74532. 2
  74533. 4
  74534. 1
  74535. -1
  74536. 2
  74537. 5
  74538. 0
  74539. 2754
  74540. 2
  74541. 5
  74542. 4
  74543. 3
  74544. 1
  74545. 297
  74546. 1
  74547. 298
  74548. 1
  74549. 303
  74550. 2
  74551. 4
  74552. 5
  74553. 2
  74554. 5
  74555. 5
  74556. 2
  74557. 5
  74558. 0
  74559. 0
  74560. 2
  74561. 4
  74562. 4
  74563. 1
  74564. 2
  74565. back entrance hallway
  74566. 2
  74567. 5
  74568. 2
  74569. You are in a north-south hallway. There is a door leading west.
  74570. 2
  74571. 5
  74572. 4
  74573. 2
  74574. 0
  74575. 0
  74576. 0
  74577. 0
  74578. 2
  74579. 1
  74580. #296
  74581. south
  74582.  
  74583. 0
  74584. 2
  74585. -1
  74586. -1
  74587. -1
  74588. 7
  74589. -1
  74590. 297
  74591. 0
  74592. 0
  74593. 13
  74594. 5
  74595. 2
  74596. 5
  74597. 1
  74598. 262
  74599. 2
  74600. 5
  74601. 1
  74602. 295
  74603. 2
  74604. 5
  74605. 5
  74606. 2
  74607. 5
  74608. 5
  74609. 2
  74610. 5
  74611. 5
  74612. 2
  74613. 5
  74614. 5
  74615. 2
  74616. 5
  74617. 5
  74618. 2
  74619. 5
  74620. 5
  74621. 2
  74622. 5
  74623. 0
  74624. 0
  74625. 2
  74626. 4
  74627. 4
  74628. 2
  74629. 2
  74630. south
  74631. 2
  74632. s
  74633. 2
  74634. 5
  74635. 5
  74636. 2
  74637. 5
  74638. 4
  74639. 2
  74640. 0
  74641. 0
  74642. 0
  74643. 0
  74644. 2
  74645. 1
  74646. #297
  74647. north
  74648.  
  74649. 0
  74650. 2
  74651. -1
  74652. -1
  74653. -1
  74654. 7
  74655. -1
  74656. 298
  74657. 0
  74658. 0
  74659. 13
  74660. 5
  74661. 2
  74662. 5
  74663. 1
  74664. 295
  74665. 2
  74666. 5
  74667. 1
  74668. 262
  74669. 2
  74670. 5
  74671. 5
  74672. 2
  74673. 5
  74674. 5
  74675. 2
  74676. 5
  74677. 5
  74678. 2
  74679. 5
  74680. 5
  74681. 2
  74682. 5
  74683. 5
  74684. 2
  74685. 5
  74686. 5
  74687. 2
  74688. 5
  74689. 0
  74690. 0
  74691. 2
  74692. 4
  74693. 4
  74694. 2
  74695. 2
  74696. north
  74697. 2
  74698. n
  74699. 2
  74700. 5
  74701. 5
  74702. 2
  74703. 5
  74704. 4
  74705. 2
  74706. 0
  74707. 0
  74708. 0
  74709. 0
  74710. 2
  74711. 1
  74712. #298
  74713. west
  74714.  
  74715. 0
  74716. 2
  74717. -1
  74718. -1
  74719. -1
  74720. 7
  74721. -1
  74722. 301
  74723. 0
  74724. 0
  74725. 13
  74726. 5
  74727. 2
  74728. 5
  74729. 1
  74730. 295
  74731. 2
  74732. 5
  74733. 1
  74734. 168
  74735. 2
  74736. 5
  74737. 5
  74738. 2
  74739. 5
  74740. 5
  74741. 2
  74742. 5
  74743. 5
  74744. 2
  74745. 5
  74746. 5
  74747. 2
  74748. 5
  74749. 5
  74750. 2
  74751. 5
  74752. 2
  74753. You suddenly realize that its Hell out there...
  74754. 2
  74755. 5
  74756. 0
  74757. 0
  74758. 2
  74759. 4
  74760. 4
  74761. 2
  74762. 2
  74763. west
  74764. 2
  74765. w
  74766. 2
  74767. 5
  74768. 5
  74769. 2
  74770. 5
  74771. 4
  74772. 2
  74773. 0
  74774. 0
  74775. 0
  74776. 0
  74777. 2
  74778. 1
  74779. #299
  74780. a Candy Dish
  74781.  
  74782. 0
  74783. 228
  74784. -1
  74785. 300
  74786. -1
  74787. 8
  74788. -1
  74789. 308
  74790. 0
  74791. 0
  74792. 31
  74793. 5
  74794. 228
  74795. 5
  74796. 5
  74797. 228
  74798. 5
  74799. 5
  74800. 228
  74801. 5
  74802. 5
  74803. 228
  74804. 5
  74805. 5
  74806. 228
  74807. 5
  74808. 5
  74809. 228
  74810. 5
  74811. 5
  74812. 2
  74813. 1
  74814. 0
  74815. 1
  74816. 2
  74817. 1
  74818. 5
  74819. 228
  74820. 5
  74821. 5
  74822. 228
  74823. 5
  74824. 5
  74825. 228
  74826. 5
  74827. 5
  74828. 228
  74829. 5
  74830. 5
  74831. 228
  74832. 5
  74833. 5
  74834. 228
  74835. 5
  74836. 5
  74837. 228
  74838. 5
  74839. 5
  74840. 228
  74841. 5
  74842. 5
  74843. 228
  74844. 5
  74845. 0
  74846. 0
  74847. 2
  74848. 1
  74849. 5
  74850. 228
  74851. 4
  74852. 5
  74853. 228
  74854. 5
  74855. 5
  74856. 228
  74857. 5
  74858. 5
  74859. 228
  74860. 5
  74861. 5
  74862. 228
  74863. 5
  74864. 5
  74865. 228
  74866. 5
  74867. 5
  74868. 228
  74869. 5
  74870. 5
  74871. 228
  74872. 5
  74873. 5
  74874. 228
  74875. 5
  74876. 0
  74877. 0
  74878. 228
  74879. 4
  74880. 4
  74881. 4
  74882. 2
  74883. a Candy Dish
  74884. 2
  74885. candy bowl
  74886. 2
  74887. bowl
  74888. 2
  74889. dish
  74890. 228
  74891. 5
  74892. 5
  74893. 228
  74894. 5
  74895. 4
  74896. 2
  74897. 0
  74898. 0
  74899. 0
  74900. 0
  74901. 2
  74902. 1
  74903. #300
  74904. candy
  74905.  
  74906. 0
  74907. 228
  74908. 299
  74909. -1
  74910. -1
  74911. 5
  74912. -1
  74913. 306
  74914. 1
  74915. eat
  74916. 228
  74917. 41
  74918. -1
  74919. 0
  74920. 12
  74921. 5
  74922. 228
  74923. 5
  74924. 5
  74925. 228
  74926. 5
  74927. 5
  74928. 228
  74929. 5
  74930. 5
  74931. 228
  74932. 5
  74933. 5
  74934. 228
  74935. 5
  74936. 5
  74937. 228
  74938. 5
  74939. 5
  74940. 228
  74941. 5
  74942. 5
  74943. 228
  74944. 5
  74945. 0
  74946. 0
  74947. 228
  74948. 4
  74949. 4
  74950. 1
  74951. 2
  74952. candy
  74953. 228
  74954. 5
  74955. 5
  74956. 228
  74957. 5
  74958. 4
  74959. 2
  74960. 0
  74961. 0
  74962. 0
  74963. 0
  74964. 2
  74965. 1
  74966. #301
  74967. out
  74968.  
  74969. 0
  74970. 2
  74971. -1
  74972. -1
  74973. -1
  74974. 7
  74975. -1
  74976. 303
  74977. 0
  74978. 0
  74979. 13
  74980. 5
  74981. 2
  74982. 5
  74983. 1
  74984. 168
  74985. 2
  74986. 5
  74987. 1
  74988. 82
  74989. 2
  74990. 5
  74991. 5
  74992. 2
  74993. 5
  74994. 5
  74995. 2
  74996. 5
  74997. 5
  74998. 2
  74999. 5
  75000. 5
  75001. 2
  75002. 5
  75003. 5
  75004. 2
  75005. 5
  75006. 5
  75007. 2
  75008. 5
  75009. 0
  75010. 0
  75011. 2
  75012. 4
  75013. 4
  75014. 1
  75015. 2
  75016. out
  75017. 2
  75018. 5
  75019. 5
  75020. 2
  75021. 5
  75022. 4
  75023. 2
  75024. 0
  75025. 0
  75026. 0
  75027. 0
  75028. 2
  75029. 1
  75030. #302
  75031. southern tee hallway
  75032.  
  75033. 0
  75034. 2
  75035. -1
  75036. -1
  75037. -1
  75038. 3
  75039. -1
  75040. 312
  75041. 0
  75042. 0
  75043. 17
  75044. 5
  75045. 2
  75046. 5
  75047. 5
  75048. 2
  75049. 5
  75050. 5
  75051. 2
  75052. 5
  75053. 5
  75054. 2
  75055. 5
  75056. 5
  75057. 2
  75058. 5
  75059. 5
  75060. 2
  75061. 5
  75062. 5
  75063. 2
  75064. 5
  75065. 4
  75066. 3
  75067. 1
  75068. 303
  75069. 1
  75070. 338
  75071. 1
  75072. 356
  75073. 2
  75074. 4
  75075. 1
  75076. -1
  75077. 2
  75078. 5
  75079. 0
  75080. 24225
  75081. 2
  75082. 5
  75083. 4
  75084. 3
  75085. 1
  75086. 304
  75087. 1
  75088. 339
  75089. 1
  75090. 355
  75091. 2
  75092. 4
  75093. 5
  75094. 2
  75095. 5
  75096. 5
  75097. 2
  75098. 5
  75099. 0
  75100. 0
  75101. 2
  75102. 4
  75103. 4
  75104. 1
  75105. 2
  75106. southern tee hallway
  75107. 2
  75108. 5
  75109. 2
  75110. You are in a north-south hallway. There is a passage leading east.
  75111. 2
  75112. 5
  75113. 4
  75114. 2
  75115. 0
  75116. 0
  75117. 0
  75118. 0
  75119. 2
  75120. 1
  75121. #303
  75122. south
  75123.  
  75124. 0
  75125. 2
  75126. -1
  75127. -1
  75128. -1
  75129. 7
  75130. -1
  75131. 304
  75132. 0
  75133. 0
  75134. 13
  75135. 5
  75136. 2
  75137. 5
  75138. 1
  75139. 295
  75140. 2
  75141. 5
  75142. 1
  75143. 302
  75144. 2
  75145. 5
  75146. 5
  75147. 2
  75148. 5
  75149. 5
  75150. 2
  75151. 5
  75152. 5
  75153. 2
  75154. 5
  75155. 5
  75156. 2
  75157. 5
  75158. 5
  75159. 2
  75160. 5
  75161. 5
  75162. 2
  75163. 5
  75164. 0
  75165. 0
  75166. 2
  75167. 4
  75168. 4
  75169. 2
  75170. 2
  75171. south
  75172. 2
  75173. s
  75174. 2
  75175. 5
  75176. 5
  75177. 2
  75178. 5
  75179. 4
  75180. 2
  75181. 0
  75182. 0
  75183. 0
  75184. 0
  75185. 2
  75186. 1
  75187. #304
  75188. north
  75189.  
  75190. 0
  75191. 2
  75192. -1
  75193. -1
  75194. -1
  75195. 7
  75196. -1
  75197. 313
  75198. 0
  75199. 0
  75200. 13
  75201. 5
  75202. 2
  75203. 5
  75204. 1
  75205. 302
  75206. 2
  75207. 5
  75208. 1
  75209. 295
  75210. 2
  75211. 5
  75212. 5
  75213. 2
  75214. 5
  75215. 5
  75216. 2
  75217. 5
  75218. 5
  75219. 2
  75220. 5
  75221. 5
  75222. 2
  75223. 5
  75224. 5
  75225. 2
  75226. 5
  75227. 5
  75228. 2
  75229. 5
  75230. 0
  75231. 0
  75232. 2
  75233. 4
  75234. 4
  75235. 2
  75236. 2
  75237. north
  75238. 2
  75239. n
  75240. 2
  75241. 5
  75242. 5
  75243. 2
  75244. 5
  75245. 4
  75246. 2
  75247. 0
  75248. 0
  75249. 0
  75250. 0
  75251. 2
  75252. 1
  75253. #305
  75254. the first discount price list
  75255.  
  75256. 0
  75257. 2
  75258. 354
  75259. -1
  75260. -1
  75261. 9
  75262. -1
  75263. -1
  75264. 0
  75265. 0
  75266. 15
  75267. 5
  75268. 2
  75269. 5
  75270. 5
  75271. 2
  75272. 4
  75273. 4
  75274. 2
  75275. 2
  75276. First Discount Price List
  75277. 2
  75278. ...
  75279. 2
  75280. 4
  75281. 5
  75282. 2
  75283. 5
  75284. 5
  75285. 2
  75286. 5
  75287. 5
  75288. 2
  75289. 5
  75290. 5
  75291. 2
  75292. 5
  75293. 5
  75294. 2
  75295. 5
  75296. 5
  75297. 2
  75298. 5
  75299. 5
  75300. 2
  75301. 5
  75302. 5
  75303. 2
  75304. 5
  75305. 0
  75306. 0
  75307. 2
  75308. 4
  75309. 4
  75310. 4
  75311. 2
  75312. the first discount price list
  75313. 2
  75314. price list
  75315. 2
  75316. list
  75317. 2
  75318. prices
  75319. 2
  75320. 5
  75321. 5
  75322. 2
  75323. 5
  75324. 4
  75325. 2
  75326. 0
  75327. 0
  75328. 0
  75329. 0
  75330. 2
  75331. 1
  75332. #306
  75333. a Disk Drive
  75334.  
  75335. 0
  75336. 2
  75337. 291
  75338. -1
  75339. 315
  75340. 5
  75341. -1
  75342. 307
  75343. 3
  75344. g*et t*ake
  75345. 2
  75346. 41
  75347. -1
  75348. unplug
  75349. 2
  75350. 41
  75351. -1
  75352. plug*in
  75353. 2
  75354. 41
  75355. -1
  75356. 0
  75357. 12
  75358. 5
  75359. 2
  75360. 5
  75361. 5
  75362. 2
  75363. 5
  75364. 5
  75365. 2
  75366. 5
  75367. 5
  75368. 2
  75369. 5
  75370. 5
  75371. 2
  75372. 5
  75373. 5
  75374. 2
  75375. 5
  75376. 5
  75377. 2
  75378. 5
  75379. 5
  75380. 2
  75381. 5
  75382. 0
  75383. 0
  75384. 2
  75385. 4
  75386. 4
  75387. 4
  75388. 2
  75389. a Disk Drive
  75390. 2
  75391. disk
  75392. 2
  75393. drive
  75394. 2
  75395. hard disk
  75396. 2
  75397. 5
  75398. 2
  75399. The drive is plugged in.
  75400. 2
  75401. 5
  75402. 4
  75403. 2
  75404. 0
  75405. 0
  75406. 0
  75407. 0
  75408. 2
  75409. 1
  75410. #307
  75411. Leash
  75412.  
  75413. 0
  75414. 147
  75415. 147
  75416. -1
  75417. 345
  75418. 5
  75419. -1
  75420. 309
  75421. 1
  75422. put leash on any
  75423. 147
  75424. 9
  75425. -1
  75426. 0
  75427. 12
  75428. 5
  75429. 147
  75430. 5
  75431. 5
  75432. 147
  75433. 5
  75434. 5
  75435. 147
  75436. 5
  75437. 5
  75438. 147
  75439. 5
  75440. 5
  75441. 147
  75442. 5
  75443. 5
  75444. 147
  75445. 5
  75446. 5
  75447. 147
  75448. 5
  75449. 5
  75450. 147
  75451. 5
  75452. 0
  75453. 0
  75454. 147
  75455. 4
  75456. 4
  75457. 1
  75458. 2
  75459. Leash
  75460. 147
  75461. 5
  75462. 2
  75463. A blue leash, triple stiched
  75464. 147
  75465. 5
  75466. 4
  75467. 2
  75468. 0
  75469. 0
  75470. 0
  75471. 0
  75472. 2
  75473. 1
  75474. #308
  75475. a Mac Plus
  75476.  
  75477. 0
  75478. 2
  75479. 270
  75480. -1
  75481. 309
  75482. 8
  75483. -1
  75484. 311
  75485. 1
  75486. switch
  75487. 2
  75488. 105
  75489. -2
  75490. 1
  75491. active
  75492. 32
  75493. 0
  75494. 1
  75495. 2
  75496. 5
  75497. 5
  75498. 2
  75499. 5
  75500. 5
  75501. 2
  75502. 5
  75503. 5
  75504. 2
  75505. 5
  75506. 5
  75507. 2
  75508. 5
  75509. 5
  75510. 2
  75511. 5
  75512. 5
  75513. 2
  75514. 5
  75515. 5
  75516. 2
  75517. 1
  75518. 0
  75519. 0
  75520. 2
  75521. 1
  75522. 5
  75523. 2
  75524. 5
  75525. 5
  75526. 2
  75527. 5
  75528. 5
  75529. 2
  75530. 5
  75531. 5
  75532. 2
  75533. 5
  75534. 5
  75535. 2
  75536. 5
  75537. 5
  75538. 2
  75539. 5
  75540. 5
  75541. 2
  75542. 5
  75543. 5
  75544. 2
  75545. 5
  75546. 5
  75547. 2
  75548. 5
  75549. 0
  75550. 1
  75551. 2
  75552. 1
  75553. 5
  75554. 2
  75555. 4
  75556. 5
  75557. 2
  75558. 5
  75559. 5
  75560. 2
  75561. 5
  75562. 5
  75563. 2
  75564. 5
  75565. 5
  75566. 2
  75567. 5
  75568. 5
  75569. 2
  75570. 5
  75571. 5
  75572. 2
  75573. 5
  75574. 5
  75575. 2
  75576. 5
  75577. 5
  75578. 2
  75579. 5
  75580. 0
  75581. 0
  75582. 2
  75583. 4
  75584. 4
  75585. 4
  75586. 2
  75587. a Mac Plus
  75588. 2
  75589. mac*intosh
  75590. 2
  75591. computer
  75592. 2
  75593. toaster
  75594. 2
  75595. 5
  75596. 2
  75597. You are looking at a Mac Plus. Its displaying the finder.
  75598. 2
  75599. 5
  75600. 4
  75601. 2
  75602. 0
  75603. 0
  75604. 0
  75605. 0
  75606. 2
  75607. 1
  75608. #309
  75609. a System 4.2 Diskette
  75610.  
  75611. 0
  75612. 2
  75613. 270
  75614. -1
  75615. -1
  75616. 5
  75617. -1
  75618. 310
  75619. 0
  75620. 0
  75621. 12
  75622. 5
  75623. 2
  75624. 5
  75625. 5
  75626. 2
  75627. 5
  75628. 5
  75629. 2
  75630. 5
  75631. 5
  75632. 2
  75633. 5
  75634. 5
  75635. 2
  75636. 5
  75637. 5
  75638. 2
  75639. 5
  75640. 5
  75641. 2
  75642. 5
  75643. 5
  75644. 2
  75645. 5
  75646. 0
  75647. 0
  75648. 2
  75649. 4
  75650. 4
  75651. 3
  75652. 2
  75653. a System 4.2 Diskette
  75654. 2
  75655. disk*ette
  75656. 2
  75657. floppy
  75658. 2
  75659. 5
  75660. 5
  75661. 2
  75662. 5
  75663. 4
  75664. 2
  75665. 0
  75666. 0
  75667. 0
  75668. 0
  75669. 2
  75670. 1
  75671. #310
  75672. a capacitor
  75673.  
  75674. 0
  75675. 2
  75676. 115
  75677. -1
  75678. -1
  75679. 5
  75680. -1
  75681. 315
  75682. 0
  75683. 0
  75684. 12
  75685. 5
  75686. 2
  75687. 5
  75688. 5
  75689. 2
  75690. 5
  75691. 5
  75692. 2
  75693. 5
  75694. 5
  75695. 2
  75696. 5
  75697. 5
  75698. 2
  75699. 5
  75700. 5
  75701. 2
  75702. 5
  75703. 5
  75704. 2
  75705. 5
  75706. 5
  75707. 2
  75708. 5
  75709. 0
  75710. 0
  75711. 2
  75712. 4
  75713. 4
  75714. 2
  75715. 2
  75716. a capacitor
  75717. 2
  75718. capacitor
  75719. 2
  75720. 5
  75721. 2
  75722. Its an old, burned up capacitor. Who knows what it might be useful for...
  75723. 2
  75724. 5
  75725. 4
  75726. 2
  75727. 0
  75728. 0
  75729. 0
  75730. 0
  75731. 2
  75732. 1
  75733. #311
  75734. the Bookshelf
  75735.  
  75736. 0
  75737. 2
  75738. 211
  75739. 88
  75740. -1
  75741. 8
  75742. -1
  75743. 316
  75744. 1
  75745. t*ake g*et
  75746. 2
  75747. 41
  75748. -1
  75749. 0
  75750. 31
  75751. 5
  75752. 2
  75753. 5
  75754. 5
  75755. 2
  75756. 5
  75757. 5
  75758. 2
  75759. 5
  75760. 5
  75761. 2
  75762. 5
  75763. 5
  75764. 2
  75765. 5
  75766. 5
  75767. 2
  75768. 5
  75769. 5
  75770. 2
  75771. 1
  75772. 5
  75773. 2
  75774. 1
  75775. 5
  75776. 2
  75777. 5
  75778. 5
  75779. 2
  75780. 5
  75781. 5
  75782. 2
  75783. 5
  75784. 5
  75785. 2
  75786. 5
  75787. 5
  75788. 2
  75789. 5
  75790. 5
  75791. 2
  75792. 5
  75793. 5
  75794. 2
  75795. 5
  75796. 5
  75797. 2
  75798. 5
  75799. 5
  75800. 2
  75801. 5
  75802. 5
  75803. 2
  75804. 1
  75805. 5
  75806. 2
  75807. 4
  75808. 5
  75809. 2
  75810. 5
  75811. 5
  75812. 2
  75813. 5
  75814. 5
  75815. 2
  75816. 5
  75817. 5
  75818. 2
  75819. 5
  75820. 5
  75821. 2
  75822. 5
  75823. 5
  75824. 2
  75825. 5
  75826. 5
  75827. 2
  75828. 5
  75829. 5
  75830. 2
  75831. 5
  75832. 0
  75833. 0
  75834. 2
  75835. 4
  75836. 4
  75837. 3
  75838. 2
  75839. the Bookshelf
  75840. 2
  75841. shelf
  75842. 2
  75843. bookcase
  75844. 2
  75845. 5
  75846. 2
  75847. the shelf is nondescript. There is lots of dust on it.
  75848. 2
  75849. 5
  75850. 4
  75851. 2
  75852. 0
  75853. 0
  75854. 0
  75855. 0
  75856. 2
  75857. 1
  75858. #312
  75859. Barra
  75860.  
  75861. 0
  75862. 2
  75863. -1
  75864. -1
  75865. -1
  75866. 3
  75867. -1
  75868. 124
  75869. 0
  75870. 0
  75871. 17
  75872. 5
  75873. 2
  75874. 5
  75875. 5
  75876. 2
  75877. 5
  75878. 5
  75879. 2
  75880. 5
  75881. 5
  75882. 2
  75883. 5
  75884. 5
  75885. 2
  75886. 5
  75887. 5
  75888. 2
  75889. 5
  75890. 5
  75891. 2
  75892. 5
  75893. 4
  75894. 1
  75895. 1
  75896. 313
  75897. 2
  75898. 4
  75899. 1
  75900. -1
  75901. 2
  75902. 5
  75903. 0
  75904. 17355
  75905. 2
  75906. 5
  75907. 4
  75908. 1
  75909. 1
  75910. 314
  75911. 2
  75912. 4
  75913. 5
  75914. 2
  75915. 5
  75916. 5
  75917. 2
  75918. 5
  75919. 0
  75920. 0
  75921. 2
  75922. 4
  75923. 4
  75924. 1
  75925. 2
  75926. Barra
  75927. 2
  75928. 5
  75929. 2
  75930. Barra. There are computers everywhere. Nobody is around, though...
  75931. 2
  75932. 5
  75933. 4
  75934. 2
  75935. 0
  75936. 0
  75937. 0
  75938. 0
  75939. 2
  75940. 1
  75941. #313
  75942. up
  75943.  
  75944. 0
  75945. 2
  75946. -1
  75947. -1
  75948. -1
  75949. 7
  75950. -1
  75951. 314
  75952. 0
  75953. 0
  75954. 13
  75955. 5
  75956. 2
  75957. 5
  75958. 1
  75959. 11
  75960. 2
  75961. 5
  75962. 1
  75963. 312
  75964. 2
  75965. 5
  75966. 5
  75967. 2
  75968. 5
  75969. 5
  75970. 2
  75971. 5
  75972. 5
  75973. 2
  75974. 5
  75975. 5
  75976. 2
  75977. 5
  75978. 5
  75979. 2
  75980. 5
  75981. 5
  75982. 2
  75983. 5
  75984. 0
  75985. 0
  75986. 2
  75987. 4
  75988. 4
  75989. 2
  75990. 2
  75991. up
  75992. 2
  75993. u
  75994. 2
  75995. 5
  75996. 5
  75997. 2
  75998. 5
  75999. 4
  76000. 2
  76001. 0
  76002. 0
  76003. 0
  76004. 0
  76005. 2
  76006. 1
  76007. #314
  76008. down
  76009.  
  76010. 0
  76011. 2
  76012. -1
  76013. -1
  76014. -1
  76015. 7
  76016. -1
  76017. 336
  76018. 0
  76019. 0
  76020. 13
  76021. 5
  76022. 2
  76023. 5
  76024. 1
  76025. 312
  76026. 2
  76027. 5
  76028. 1
  76029. 11
  76030. 2
  76031. 5
  76032. 5
  76033. 2
  76034. 5
  76035. 5
  76036. 2
  76037. 5
  76038. 5
  76039. 2
  76040. 5
  76041. 5
  76042. 2
  76043. 5
  76044. 5
  76045. 2
  76046. 5
  76047. 5
  76048. 2
  76049. 5
  76050. 0
  76051. 0
  76052. 2
  76053. 4
  76054. 4
  76055. 2
  76056. 2
  76057. down
  76058. 2
  76059. d
  76060. 2
  76061. 5
  76062. 5
  76063. 2
  76064. 5
  76065. 4
  76066. 2
  76067. 0
  76068. 0
  76069. 0
  76070. 0
  76071. 2
  76072. 1
  76073. #315
  76074. a computer chip
  76075.  
  76076. 0
  76077. 2
  76078. 291
  76079. -1
  76080. -1
  76081. 5
  76082. -1
  76083. 317
  76084. 0
  76085. 0
  76086. 12
  76087. 5
  76088. 2
  76089. 5
  76090. 5
  76091. 2
  76092. 5
  76093. 5
  76094. 2
  76095. 5
  76096. 5
  76097. 2
  76098. 5
  76099. 5
  76100. 2
  76101. 5
  76102. 5
  76103. 2
  76104. 5
  76105. 5
  76106. 2
  76107. 5
  76108. 5
  76109. 2
  76110. 5
  76111. 0
  76112. 0
  76113. 2
  76114. 4
  76115. 4
  76116. 3
  76117. 2
  76118. a computer chip
  76119. 2
  76120. chip
  76121. 2
  76122. the chip
  76123. 2
  76124. 5
  76125. 2
  76126. A computer chip. It has lots of little metal legs.
  76127. 2
  76128. 5
  76129. 4
  76130. 2
  76131. 0
  76132. 0
  76133. 0
  76134. 0
  76135. 2
  76136. 1
  76137. #316
  76138. the Refrigerator
  76139.  
  76140. 0
  76141. 2
  76142. 194
  76143. 317
  76144. 324
  76145. 8
  76146. -1
  76147. 318
  76148. 1
  76149. t*ake g*et
  76150. 2
  76151. 41
  76152. -1
  76153. 0
  76154. 31
  76155. 5
  76156. 2
  76157. 5
  76158. 5
  76159. 2
  76160. 5
  76161. 5
  76162. 2
  76163. 5
  76164. 5
  76165. 2
  76166. 5
  76167. 5
  76168. 2
  76169. 5
  76170. 5
  76171. 2
  76172. 5
  76173. 0
  76174. 1
  76175. 2
  76176. 1
  76177. 0
  76178. 0
  76179. 2
  76180. 1
  76181. 5
  76182. 2
  76183. 5
  76184. 5
  76185. 2
  76186. 5
  76187. 5
  76188. 2
  76189. 5
  76190. 5
  76191. 2
  76192. 5
  76193. 5
  76194. 2
  76195. 5
  76196. 5
  76197. 2
  76198. 5
  76199. 5
  76200. 2
  76201. 5
  76202. 5
  76203. 2
  76204. 5
  76205. 5
  76206. 2
  76207. 5
  76208. 0
  76209. 1
  76210. 2
  76211. 1
  76212. 5
  76213. 2
  76214. 4
  76215. 5
  76216. 2
  76217. 5
  76218. 5
  76219. 2
  76220. 5
  76221. 5
  76222. 2
  76223. 5
  76224. 5
  76225. 2
  76226. 5
  76227. 5
  76228. 2
  76229. 5
  76230. 5
  76231. 2
  76232. 5
  76233. 5
  76234. 2
  76235. 5
  76236. 5
  76237. 2
  76238. 5
  76239. 0
  76240. 0
  76241. 2
  76242. 4
  76243. 4
  76244. 2
  76245. 2
  76246. the Refrigerator
  76247. 2
  76248. fridge
  76249. 2
  76250. 5
  76251. 5
  76252. 2
  76253. 5
  76254. 4
  76255. 2
  76256. 0
  76257. 0
  76258. 0
  76259. 0
  76260. 2
  76261. 1
  76262. #317
  76263. a moldy chinese food container
  76264.  
  76265. 0
  76266. 2
  76267. 316
  76268. -1
  76269. -1
  76270. 5
  76271. -1
  76272. 319
  76273. 0
  76274. 0
  76275. 12
  76276. 5
  76277. 2
  76278. 5
  76279. 5
  76280. 2
  76281. 5
  76282. 5
  76283. 2
  76284. 5
  76285. 5
  76286. 2
  76287. 5
  76288. 5
  76289. 2
  76290. 5
  76291. 5
  76292. 2
  76293. 5
  76294. 5
  76295. 2
  76296. 5
  76297. 5
  76298. 2
  76299. 5
  76300. 0
  76301. 0
  76302. 2
  76303. 4
  76304. 4
  76305. 4
  76306. 2
  76307. a moldy chinese food container
  76308. 2
  76309. chinese food
  76310. 2
  76311. container
  76312. 2
  76313. box
  76314. 2
  76315. 5
  76316. 5
  76317. 2
  76318. 5
  76319. 4
  76320. 2
  76321. 0
  76322. 0
  76323. 0
  76324. 0
  76325. 2
  76326. 1
  76327. #318
  76328. a box of doughnuts
  76329.  
  76330. 0
  76331. 2
  76332. 197
  76333. 429
  76334. -1
  76335. 8
  76336. -1
  76337. 324
  76338. 0
  76339. 0
  76340. 31
  76341. 5
  76342. 2
  76343. 5
  76344. 5
  76345. 2
  76346. 5
  76347. 5
  76348. 2
  76349. 5
  76350. 5
  76351. 2
  76352. 5
  76353. 5
  76354. 2
  76355. 5
  76356. 5
  76357. 2
  76358. 5
  76359. 5
  76360. 2
  76361. 1
  76362. 0
  76363. 0
  76364. 2
  76365. 1
  76366. 5
  76367. 2
  76368. 5
  76369. 5
  76370. 2
  76371. 5
  76372. 5
  76373. 2
  76374. 5
  76375. 5
  76376. 2
  76377. 5
  76378. 5
  76379. 2
  76380. 5
  76381. 5
  76382. 2
  76383. 5
  76384. 5
  76385. 2
  76386. 5
  76387. 5
  76388. 2
  76389. 5
  76390. 5
  76391. 2
  76392. 5
  76393. 0
  76394. 1
  76395. 2
  76396. 1
  76397. 5
  76398. 2
  76399. 4
  76400. 5
  76401. 2
  76402. 5
  76403. 5
  76404. 2
  76405. 5
  76406. 5
  76407. 2
  76408. 5
  76409. 5
  76410. 2
  76411. 5
  76412. 5
  76413. 2
  76414. 5
  76415. 5
  76416. 2
  76417. 5
  76418. 5
  76419. 2
  76420. 5
  76421. 5
  76422. 2
  76423. 5
  76424. 0
  76425. 0
  76426. 2
  76427. 4
  76428. 4
  76429. 6
  76430. 2
  76431. a box of doughnuts
  76432. 2
  76433. doughnuts
  76434. 2
  76435. the box
  76436. 2
  76437. a box
  76438. 2
  76439. some doughnuts
  76440. 2
  76441. box
  76442. 2
  76443. 5
  76444. 2
  76445. its your standard doughnut box. there may be goodies inside.
  76446. 2
  76447. 5
  76448. 4
  76449. 2
  76450. 0
  76451. 0
  76452. 0
  76453. 0
  76454. 2
  76455. 1
  76456. #319
  76457. Generic Doughnut
  76458.  
  76459. 0
  76460. 2
  76461. 324
  76462. -1
  76463. -1
  76464. 5
  76465. 429
  76466. 326
  76467. 1
  76468. eat
  76469. 2
  76470. 41
  76471. -1
  76472. 0
  76473. 12
  76474. 5
  76475. 2
  76476. 5
  76477. 5
  76478. 2
  76479. 5
  76480. 5
  76481. 2
  76482. 5
  76483. 5
  76484. 2
  76485. 5
  76486. 5
  76487. 2
  76488. 5
  76489. 5
  76490. 2
  76491. 5
  76492. 5
  76493. 2
  76494. 5
  76495. 5
  76496. 2
  76497. 5
  76498. 0
  76499. 0
  76500. 2
  76501. 4
  76502. 4
  76503. 1
  76504. 2
  76505. Generic Doughnut
  76506. 2
  76507. 5
  76508. 5
  76509. 2
  76510. 5
  76511. 4
  76512. 2
  76513. 0
  76514. 0
  76515. 0
  76516. 0
  76517. 2
  76518. 1
  76519. #320 recycled
  76520. #321 recycled
  76521. #322 recycled
  76522. #323 recycled
  76523. #324
  76524. cabinet
  76525.  
  76526. 0
  76527. 2
  76528. 194
  76529. 319
  76530. -1
  76531. 8
  76532. -1
  76533. 352
  76534. 1
  76535. t*ake g*et
  76536. 2
  76537. 41
  76538. -1
  76539. 0
  76540. 31
  76541. 5
  76542. 2
  76543. 5
  76544. 5
  76545. 2
  76546. 5
  76547. 5
  76548. 2
  76549. 5
  76550. 5
  76551. 2
  76552. 5
  76553. 5
  76554. 2
  76555. 5
  76556. 5
  76557. 2
  76558. 5
  76559. 0
  76560. 0
  76561. 2
  76562. 1
  76563. 0
  76564. 0
  76565. 2
  76566. 1
  76567. 5
  76568. 2
  76569. 5
  76570. 5
  76571. 2
  76572. 5
  76573. 5
  76574. 2
  76575. 5
  76576. 5
  76577. 2
  76578. 5
  76579. 5
  76580. 2
  76581. 5
  76582. 5
  76583. 2
  76584. 5
  76585. 5
  76586. 2
  76587. 5
  76588. 5
  76589. 2
  76590. 5
  76591. 5
  76592. 2
  76593. 5
  76594. 0
  76595. 0
  76596. 2
  76597. 1
  76598. 1
  76599. 2
  76600. 2
  76601. 4
  76602. 5
  76603. 2
  76604. 5
  76605. 5
  76606. 2
  76607. 5
  76608. 5
  76609. 2
  76610. 5
  76611. 5
  76612. 2
  76613. 5
  76614. 5
  76615. 2
  76616. 5
  76617. 5
  76618. 2
  76619. 5
  76620. 5
  76621. 2
  76622. 5
  76623. 5
  76624. 2
  76625. 5
  76626. 0
  76627. 0
  76628. 2
  76629. 4
  76630. 4
  76631. 1
  76632. 2
  76633. cabinet
  76634. 2
  76635. 5
  76636. 2
  76637. This is a locked glass cabinet. You see an ideal doughnut inside.
  76638. 2
  76639. 5
  76640. 4
  76641. 2
  76642. 0
  76643. 0
  76644. 0
  76645. 0
  76646. 2
  76647. 1
  76648. #325 recycled
  76649. #326
  76650. a dead plant
  76651.  
  76652. 0
  76653. 2
  76654. 151
  76655. -1
  76656. 329
  76657. 5
  76658. -1
  76659. 327
  76660. 1
  76661. water
  76662. 2
  76663. 41
  76664. -1
  76665. 0
  76666. 12
  76667. 5
  76668. 2
  76669. 5
  76670. 5
  76671. 2
  76672. 5
  76673. 5
  76674. 2
  76675. 5
  76676. 5
  76677. 2
  76678. 5
  76679. 5
  76680. 2
  76681. 5
  76682. 5
  76683. 2
  76684. 5
  76685. 5
  76686. 2
  76687. 5
  76688. 5
  76689. 2
  76690. 5
  76691. 0
  76692. 0
  76693. 2
  76694. 4
  76695. 4
  76696. 3
  76697. 2
  76698. a dead plant
  76699. 2
  76700. dead plant
  76701. 2
  76702. plant
  76703. 2
  76704. 5
  76705. 2
  76706. Someone has tried to spruce up the dead plant by painting some of the leaves with a bright green paint.  How pathetic.
  76707. 2
  76708. 5
  76709. 4
  76710. 2
  76711. 0
  76712. 0
  76713. 0
  76714. 0
  76715. 2
  76716. 1
  76717. #327
  76718. a Detachable Penis
  76719.  
  76720. 0
  76721. 77
  76722. 101
  76723. -1
  76724. -1
  76725. 5
  76726. -1
  76727. 329
  76728. 3
  76729. flaccid
  76730. 77
  76731. 41
  76732. -1
  76733. shrivel
  76734. 77
  76735. 41
  76736. -1
  76737. erect
  76738. 77
  76739. 41
  76740. -1
  76741. 0
  76742. 12
  76743. 5
  76744. 77
  76745. 5
  76746. 5
  76747. 77
  76748. 5
  76749. 5
  76750. 77
  76751. 5
  76752. 5
  76753. 77
  76754. 5
  76755. 5
  76756. 77
  76757. 5
  76758. 5
  76759. 77
  76760. 5
  76761. 5
  76762. 77
  76763. 5
  76764. 5
  76765. 77
  76766. 5
  76767. 0
  76768. 0
  76769. 77
  76770. 4
  76771. 4
  76772. 7
  76773. 2
  76774. a Detachable Penis
  76775. 2
  76776. the penis
  76777. 2
  76778. the dick
  76779. 2
  76780. a penis
  76781. 2
  76782. the detachable penis
  76783. 2
  76784. detachable penis
  76785. 2
  76786. penis
  76787. 77
  76788. 5
  76789. 2
  76790. All shrivelled up.  The glans penis is white and cold.
  76791. 77
  76792. 5
  76793. 4
  76794. 2
  76795. 0
  76796. 0
  76797. 0
  76798. 0
  76799. 2
  76800. 1
  76801. #328
  76802. Amy's Newton
  76803.  
  76804. 0
  76805. 2
  76806. 124
  76807. -1
  76808. 330
  76809. 5
  76810. 427
  76811. 422
  76812. 1
  76813. wr*ite
  76814. 2
  76815. 153
  76816. 4
  76817. 0
  76818. 12
  76819. 5
  76820. 2
  76821. 5
  76822. 5
  76823. 2
  76824. 5
  76825. 5
  76826. 2
  76827. 5
  76828. 5
  76829. 2
  76830. 5
  76831. 5
  76832. 2
  76833. 5
  76834. 5
  76835. 2
  76836. 5
  76837. 5
  76838. 2
  76839. 5
  76840. 5
  76841. 2
  76842. 5
  76843. 0
  76844. 0
  76845. 2
  76846. 4
  76847. 4
  76848. 2
  76849. 2
  76850. Amy's Newton
  76851. 2
  76852. newton
  76853. 2
  76854. 5
  76855. 5
  76856. 2
  76857. 5
  76858. 4
  76859. 2
  76860. 0
  76861. 0
  76862. 0
  76863. 0
  76864. 2
  76865. 1
  76866. #329
  76867. a live plant
  76868.  
  76869. 0
  76870. 77
  76871. 151
  76872. -1
  76873. -1
  76874. 5
  76875. -1
  76876. 330
  76877. 1
  76878. water
  76879. 77
  76880. 41
  76881. -1
  76882. 0
  76883. 12
  76884. 5
  76885. 77
  76886. 5
  76887. 5
  76888. 77
  76889. 5
  76890. 5
  76891. 77
  76892. 5
  76893. 5
  76894. 77
  76895. 5
  76896. 5
  76897. 77
  76898. 5
  76899. 5
  76900. 77
  76901. 5
  76902. 5
  76903. 77
  76904. 5
  76905. 5
  76906. 77
  76907. 5
  76908. 1
  76909. 77
  76910. 77
  76911. 4
  76912. 4
  76913. 3
  76914. 2
  76915. a live plant
  76916. 2
  76917. live
  76918. 2
  76919. live plant
  76920. 77
  76921. 5
  76922. 2
  76923. This thriving plant is green and lush.  You better get it out of Steve's office quick!
  76924. 77
  76925. 5
  76926. 4
  76927. 2
  76928. 0
  76929. 0
  76930. 0
  76931. 0
  76932. 2
  76933. 1
  76934. #330
  76935. Large Ugly Black Ants
  76936.  
  76937. 0
  76938. 147
  76939. 124
  76940. -1
  76941. 147
  76942. 5
  76943. -1
  76944. 331
  76945. 0
  76946. 0
  76947. 12
  76948. 5
  76949. 147
  76950. 5
  76951. 5
  76952. 147
  76953. 5
  76954. 5
  76955. 147
  76956. 5
  76957. 5
  76958. 147
  76959. 5
  76960. 5
  76961. 147
  76962. 5
  76963. 5
  76964. 147
  76965. 5
  76966. 5
  76967. 147
  76968. 5
  76969. 5
  76970. 147
  76971. 5
  76972. 0
  76973. 0
  76974. 147
  76975. 4
  76976. 4
  76977. 3
  76978. 2
  76979. Large Ugly Black Ants
  76980. 2
  76981. ants
  76982. 2
  76983. the ants
  76984. 147
  76985. 5
  76986. 2
  76987. You see very large, ugly black ants. They seem to be mining an applecore that the owner of this cube left under the desk. (What he was doing under the desk remains to be determined)
  76988. 147
  76989. 5
  76990. 4
  76991. 2
  76992. 0
  76993. 0
  76994. 0
  76995. 0
  76996. 2
  76997. 1
  76998. #331
  76999. stinking dog turd
  77000.  
  77001. 0
  77002. 147
  77003. 77
  77004. -1
  77005. 157
  77006. 5
  77007. 332
  77008. 333
  77009. 2
  77010. squish
  77011. 77
  77012. 41
  77013. -1
  77014. smell
  77015. 147
  77016. 41
  77017. -1
  77018. 0
  77019. 12
  77020. 5
  77021. 147
  77022. 5
  77023. 5
  77024. 147
  77025. 5
  77026. 5
  77027. 147
  77028. 5
  77029. 5
  77030. 147
  77031. 5
  77032. 5
  77033. 147
  77034. 5
  77035. 5
  77036. 147
  77037. 5
  77038. 5
  77039. 147
  77040. 5
  77041. 5
  77042. 147
  77043. 5
  77044. 1
  77045. 77
  77046. 147
  77047. 4
  77048. 4
  77049. 2
  77050. 2
  77051. stinking dog turd
  77052. 2
  77053. turd
  77054. 147
  77055. 5
  77056. 2
  77057. A smelly bit of fecal matter.  Someone should take a poop scoop to this place!
  77058. 147
  77059. 5
  77060. 4
  77061. 2
  77062. 0
  77063. 0
  77064. 0
  77065. 0
  77066. 2
  77067. 1
  77068. #332
  77069. turd
  77070.  
  77071. 0
  77072. 147
  77073. 124
  77074. -1
  77075. 343
  77076. 331
  77077. -1
  77078. -1
  77079. 1
  77080. eat
  77081. 2
  77082. 41
  77083. -1
  77084. 0
  77085. 12
  77086. 5
  77087. 147
  77088. 5
  77089. 5
  77090. 147
  77091. 5
  77092. 5
  77093. 147
  77094. 5
  77095. 5
  77096. 147
  77097. 5
  77098. 5
  77099. 147
  77100. 5
  77101. 5
  77102. 147
  77103. 5
  77104. 5
  77105. 147
  77106. 5
  77107. 5
  77108. 147
  77109. 5
  77110. 0
  77111. 0
  77112. 147
  77113. 4
  77114. 4
  77115. 1
  77116. 2
  77117. turd
  77118. 147
  77119. 5
  77120. 5
  77121. 147
  77122. 5
  77123. 4
  77124. 2
  77125. 0
  77126. 0
  77127. 0
  77128. 0
  77129. 2
  77130. 1
  77131. #333
  77132. it
  77133.  
  77134. 0
  77135. 2
  77136. 2
  77137. -1
  77138. -1
  77139. 5
  77140. 345
  77141. 334
  77142. 9
  77143. dump_player_db
  77144. 2
  77145. 29
  77146. -1
  77147. call_puppy
  77148. 2
  77149. 29
  77150. -1
  77151. locate_puppy
  77152. 2
  77153. 13
  77154. -1
  77155. join_puppy
  77156. 2
  77157. 13
  77158. -1
  77159. trace_puppy
  77160. 2
  77161. 13
  77162. -1
  77163. untrace_puppy
  77164. 2
  77165. 13
  77166. -1
  77167. eavesdrop_on_puppy
  77168. 2
  77169. 13
  77170. -1
  77171. shutup
  77172. 2
  77173. 13
  77174. -1
  77175. dump_verbs
  77176. 2
  77177. 93
  77178. -2
  77179. 2
  77180. puppy
  77181. feature_ok
  77182. 14
  77183. 1
  77184. 348
  77185. 2
  77186. 5
  77187. 0
  77188. 1
  77189. 2
  77190. 5
  77191. 5
  77192. 2
  77193. 5
  77194. 5
  77195. 2
  77196. 5
  77197. 5
  77198. 2
  77199. 5
  77200. 5
  77201. 2
  77202. 5
  77203. 5
  77204. 2
  77205. 5
  77206. 5
  77207. 2
  77208. 5
  77209. 5
  77210. 2
  77211. 5
  77212. 5
  77213. 2
  77214. 5
  77215. 0
  77216. 0
  77217. 2
  77218. 4
  77219. 4
  77220. 1
  77221. 2
  77222. it
  77223. 2
  77224. 5
  77225. 5
  77226. 2
  77227. 5
  77228. 4
  77229. 2
  77230. 0
  77231. 0
  77232. 0
  77233. 0
  77234. 2
  77235. 1
  77236. #334
  77237. a Coffee Cup
  77238.  
  77239. 0
  77240. 77
  77241. 109
  77242. -1
  77243. 77
  77244. 5
  77245. -1
  77246. 340
  77247. 1
  77248. drink
  77249. 77
  77250. 41
  77251. -1
  77252. 0
  77253. 12
  77254. 5
  77255. 77
  77256. 5
  77257. 5
  77258. 77
  77259. 5
  77260. 5
  77261. 77
  77262. 5
  77263. 5
  77264. 77
  77265. 5
  77266. 5
  77267. 77
  77268. 5
  77269. 5
  77270. 77
  77271. 5
  77272. 5
  77273. 77
  77274. 5
  77275. 5
  77276. 77
  77277. 5
  77278. 0
  77279. 0
  77280. 77
  77281. 4
  77282. 4
  77283. 5
  77284. 2
  77285. a Coffee Cup
  77286. 2
  77287. cup
  77288. 2
  77289. the cup
  77290. 2
  77291. the coffee cup
  77292. 2
  77293. coffee
  77294. 77
  77295. 5
  77296. 2
  77297. Isn't it amazing how ugly a few days of mold can get?
  77298. 77
  77299. 5
  77300. 4
  77301. 2
  77302. 0
  77303. 0
  77304. 0
  77305. 0
  77306. 2
  77307. 1
  77308. #335
  77309. couch hallway
  77310.  
  77311. 0
  77312. 77
  77313. -1
  77314. 341
  77315. -1
  77316. 3
  77317. -1
  77318. 354
  77319. 0
  77320. 0
  77321. 17
  77322. 5
  77323. 77
  77324. 5
  77325. 5
  77326. 77
  77327. 5
  77328. 5
  77329. 77
  77330. 5
  77331. 5
  77332. 77
  77333. 5
  77334. 5
  77335. 77
  77336. 5
  77337. 5
  77338. 77
  77339. 5
  77340. 5
  77341. 77
  77342. 5
  77343. 4
  77344. 2
  77345. 1
  77346. 339
  77347. 1
  77348. 420
  77349. 77
  77350. 4
  77351. 1
  77352. -1
  77353. 77
  77354. 5
  77355. 0
  77356. 12251
  77357. 77
  77358. 5
  77359. 4
  77360. 2
  77361. 1
  77362. 338
  77363. 1
  77364. 421
  77365. 77
  77366. 4
  77367. 5
  77368. 77
  77369. 5
  77370. 5
  77371. 77
  77372. 5
  77373. 0
  77374. 0
  77375. 77
  77376. 4
  77377. 4
  77378. 1
  77379. 2
  77380. couch hallway
  77381. 77
  77382. 5
  77383. 2
  77384. There is a comfy grey couch here, covered with small, strange stains.
  77385. 77
  77386. 5
  77387. 4
  77388. 2
  77389. 0
  77390. 0
  77391. 0
  77392. 0
  77393. 2
  77394. 1
  77395. #336
  77396. s
  77397.  
  77398. 0
  77399. 147
  77400. -1
  77401. -1
  77402. -1
  77403. 7
  77404. -1
  77405. 339
  77406. 0
  77407. 0
  77408. 13
  77409. 5
  77410. 147
  77411. 5
  77412. 1
  77413. 124
  77414. 147
  77415. 5
  77416. 1
  77417. 121
  77418. 147
  77419. 5
  77420. 5
  77421. 147
  77422. 5
  77423. 5
  77424. 147
  77425. 5
  77426. 5
  77427. 147
  77428. 5
  77429. 5
  77430. 147
  77431. 5
  77432. 5
  77433. 147
  77434. 5
  77435. 5
  77436. 147
  77437. 5
  77438. 0
  77439. 0
  77440. 147
  77441. 4
  77442. 4
  77443. 1
  77444. 2
  77445. s
  77446. 147
  77447. 5
  77448. 5
  77449. 147
  77450. 5
  77451. 4
  77452. 2
  77453. 0
  77454. 0
  77455. 0
  77456. 0
  77457. 2
  77458. 1
  77459. #337
  77460. Trygve
  77461.  
  77462. 3
  77463. 337
  77464. 17
  77465. -1
  77466. 228
  77467. 59
  77468. -1
  77469. 346
  77470. 0
  77471. 0
  77472. 61
  77473. 5
  77474. 38
  77475. 1
  77476. 5
  77477. 337
  77478. 5
  77479. 5
  77480. 337
  77481. 5
  77482. 5
  77483. 337
  77484. 5
  77485. 5
  77486. 337
  77487. 5
  77488. 5
  77489. 38
  77490. 1
  77491. 4
  77492. 2
  77493. 0
  77494. -1464179181
  77495. 2
  77496. XTC”.Orion
  77497. 2
  77498. 0
  77499. 5
  77500. 337
  77501. 5
  77502. 2
  77503. none
  77504. 2
  77505. 0
  77506. 0
  77507. -1464178595
  77508. 2
  77509. 1
  77510. 0
  77511. 0
  77512. 337
  77513. 5
  77514. 5
  77515. 337
  77516. 5
  77517. 5
  77518. 38
  77519. 1
  77520. 5
  77521. 38
  77522. 1
  77523. 5
  77524. 38
  77525. 0
  77526. 5
  77527. 38
  77528. 1
  77529. 5
  77530. 337
  77531. 5
  77532. 4
  77533. 1
  77534. 1
  77535. 337
  77536. 2
  77537. 1
  77538. 5
  77539. 38
  77540. 1
  77541. 1
  77542. 337
  77543. 337
  77544. 4
  77545. 4
  77546. 2
  77547. 2
  77548. XTC”.Orion
  77549. 2
  77550. Bob_Monsen@Sartre.Orion
  77551. 2
  77552. 0
  77553. 2
  77554. Trygve_Isaacson@“XTC”.Orion
  77555. 2
  77556. 0
  77557. 5
  77558. 337
  77559. 5
  77560. 4
  77561. 0
  77562. 337
  77563. 4
  77564. 5
  77565. 337
  77566. 5
  77567. 5
  77568. 337
  77569. 4
  77570. 5
  77571. 337
  77572. 4
  77573. 5
  77574. 337
  77575. 5
  77576. 5
  77577. 337
  77578. 5
  77579. 5
  77580. 337
  77581. 5
  77582. 5
  77583. 337
  77584. 5
  77585. 5
  77586. 337
  77587. 5
  77588. 5
  77589. 337
  77590. 5
  77591. 5
  77592. 337
  77593. 5
  77594. 5
  77595. 337
  77596. 5
  77597. 5
  77598. 337
  77599. 5
  77600. 4
  77601. 2
  77602. 0
  77603. 0
  77604. 0
  77605. 0
  77606. 337
  77607. 4
  77608. 4
  77609. 1
  77610. 4
  77611. 2
  77612. 0
  77613. 1
  77614. 4
  77615. 6
  77616. 0
  77617. -1464179478
  77618. 2
  77619. The_Demolished_Man (#77)
  77620. 2
  77621. *New-Prog-Log (#31) and Trygve (#337)
  77622. 2
  77623. @programmer Trygve (#337)
  77624. 2
  77625.  
  77626. 2
  77627. I just gave Trygve a programmer bit.
  77628. 337
  77629. 4
  77630. 0
  77631. 750802956
  77632. 2
  77633. 1
  77634. 0
  77635. 27
  77636. 2
  77637. 0
  77638. 5
  77639. 337
  77640. 5
  77641. 5
  77642. 337
  77643. 5
  77644. 5
  77645. 337
  77646. 5
  77647. 5
  77648. 337
  77649. 5
  77650. 5
  77651. 337
  77652. 5
  77653. 5
  77654. 337
  77655. 5
  77656. 5
  77657. 337
  77658. 5
  77659. 5
  77660. 337
  77661. 5
  77662. 5
  77663. 337
  77664. 5
  77665. 5
  77666. 337
  77667. 5
  77668. 0
  77669. 0
  77670. 2
  77671. 0
  77672. 5
  77673. 337
  77674. 5
  77675. 5
  77676. 337
  77677. 5
  77678. 5
  77679. 337
  77680. 5
  77681. 5
  77682. 337
  77683. 5
  77684. 5
  77685. 337
  77686. 5
  77687. 0
  77688. -1464183081
  77689. 2
  77690. 1
  77691. 0
  77692. 0
  77693. 337
  77694. 4
  77695. 4
  77696. 2
  77697. 2
  77698. Trygve
  77699. 2
  77700. Trygve_Isaacson
  77701. 2
  77702. 1
  77703. 5
  77704. 337
  77705. 5
  77706. 4
  77707. 2
  77708. 0
  77709. 0
  77710. 0
  77711. 0
  77712. 2
  77713. 1
  77714. #338
  77715. n
  77716.  
  77717. 0
  77718. 77
  77719. -1
  77720. -1
  77721. -1
  77722. 7
  77723. -1
  77724. 355
  77725. 0
  77726. 0
  77727. 13
  77728. 5
  77729. 77
  77730. 5
  77731. 1
  77732. 335
  77733. 77
  77734. 5
  77735. 1
  77736. 302
  77737. 77
  77738. 5
  77739. 5
  77740. 77
  77741. 5
  77742. 5
  77743. 77
  77744. 5
  77745. 5
  77746. 77
  77747. 5
  77748. 5
  77749. 77
  77750. 5
  77751. 5
  77752. 77
  77753. 5
  77754. 5
  77755. 77
  77756. 5
  77757. 0
  77758. 0
  77759. 77
  77760. 4
  77761. 4
  77762. 1
  77763. 2
  77764. n
  77765. 77
  77766. 5
  77767. 5
  77768. 77
  77769. 5
  77770. 4
  77771. 2
  77772. 0
  77773. 0
  77774. 0
  77775. 0
  77776. 2
  77777. 1
  77778. #339
  77779. s
  77780.  
  77781. 0
  77782. 77
  77783. -1
  77784. -1
  77785. -1
  77786. 7
  77787. -1
  77788. 338
  77789. 0
  77790. 0
  77791. 13
  77792. 5
  77793. 77
  77794. 5
  77795. 1
  77796. 302
  77797. 77
  77798. 5
  77799. 1
  77800. 335
  77801. 77
  77802. 5
  77803. 5
  77804. 77
  77805. 5
  77806. 5
  77807. 77
  77808. 5
  77809. 5
  77810. 77
  77811. 5
  77812. 5
  77813. 77
  77814. 5
  77815. 5
  77816. 77
  77817. 5
  77818. 5
  77819. 77
  77820. 5
  77821. 0
  77822. 0
  77823. 77
  77824. 4
  77825. 4
  77826. 1
  77827. 2
  77828. s
  77829. 77
  77830. 5
  77831. 5
  77832. 77
  77833. 5
  77834. 4
  77835. 2
  77836. 0
  77837. 0
  77838. 0
  77839. 0
  77840. 2
  77841. 1
  77842. #340
  77843. couch
  77844.  
  77845. 0
  77846. 77
  77847. 335
  77848. -1
  77849. -1
  77850. 5
  77851. -1
  77852. 342
  77853. 0
  77854. 0
  77855. 12
  77856. 5
  77857. 77
  77858. 5
  77859. 5
  77860. 77
  77861. 5
  77862. 5
  77863. 77
  77864. 5
  77865. 5
  77866. 77
  77867. 5
  77868. 5
  77869. 77
  77870. 5
  77871. 5
  77872. 77
  77873. 5
  77874. 5
  77875. 77
  77876. 5
  77877. 5
  77878. 77
  77879. 5
  77880. 0
  77881. 0
  77882. 77
  77883. 4
  77884. 4
  77885. 1
  77886. 2
  77887. couch
  77888. 77
  77889. 5
  77890. 5
  77891. 77
  77892. 5
  77893. 4
  77894. 2
  77895. 0
  77896. 0
  77897. 0
  77898. 0
  77899. 2
  77900. 1
  77901. #341
  77902. OK Choral Laserwriter
  77903.  
  77904. 0
  77905. 77
  77906. 335
  77907. -1
  77908. 340
  77909. 164
  77910. -1
  77911. -1
  77912. 0
  77913. 0
  77914. 31
  77915. 5
  77916. 77
  77917. 5
  77918. 5
  77919. 77
  77920. 5
  77921. 5
  77922. 77
  77923. 5
  77924. 5
  77925. 77
  77926. 5
  77927. 5
  77928. 77
  77929. 5
  77930. 5
  77931. 77
  77932. 5
  77933. 5
  77934. 2
  77935. 1
  77936. 5
  77937. 2
  77938. 1
  77939. 5
  77940. 77
  77941. 5
  77942. 5
  77943. 77
  77944. 5
  77945. 5
  77946. 77
  77947. 5
  77948. 5
  77949. 77
  77950. 5
  77951. 5
  77952. 77
  77953. 5
  77954. 5
  77955. 77
  77956. 5
  77957. 5
  77958. 77
  77959. 5
  77960. 5
  77961. 77
  77962. 5
  77963. 5
  77964. 77
  77965. 5
  77966. 5
  77967. 2
  77968. 1
  77969. 5
  77970. 77
  77971. 4
  77972. 5
  77973. 77
  77974. 5
  77975. 5
  77976. 77
  77977. 5
  77978. 5
  77979. 77
  77980. 5
  77981. 5
  77982. 77
  77983. 5
  77984. 5
  77985. 77
  77986. 5
  77987. 5
  77988. 77
  77989. 5
  77990. 5
  77991. 77
  77992. 5
  77993. 5
  77994. 77
  77995. 5
  77996. 0
  77997. 0
  77998. 77
  77999. 4
  78000. 4
  78001. 1
  78002. 2
  78003. OK Choral Laserwriter
  78004. 77
  78005. 5
  78006. 2
  78007. a laserwriter. a red light is blinking on the front.
  78008. 77
  78009. 5
  78010. 4
  78011. 2
  78012. 0
  78013. 0
  78014. 0
  78015. 0
  78016. 2
  78017. 1
  78018. #342
  78019. petty cash
  78020.  
  78021. 0
  78022. 2
  78023. 247
  78024. -1
  78025. -1
  78026. 5
  78027. -1
  78028. 343
  78029. 2
  78030. burn
  78031. 2
  78032. 41
  78033. -1
  78034. Spend
  78035. 147
  78036. 9
  78037. -1
  78038. 0
  78039. 12
  78040. 5
  78041. 2
  78042. 5
  78043. 5
  78044. 2
  78045. 5
  78046. 5
  78047. 2
  78048. 5
  78049. 5
  78050. 2
  78051. 5
  78052. 5
  78053. 2
  78054. 5
  78055. 5
  78056. 2
  78057. 5
  78058. 5
  78059. 2
  78060. 5
  78061. 5
  78062. 2
  78063. 5
  78064. 0
  78065. 0
  78066. 2
  78067. 4
  78068. 4
  78069. 3
  78070. 2
  78071. petty cash
  78072. 2
  78073. money
  78074. 2
  78075. cash
  78076. 2
  78077. 5
  78078. 5
  78079. 2
  78080. 5
  78081. 4
  78082. 2
  78083. 0
  78084. 0
  78085. 0
  78086. 0
  78087. 2
  78088. 1
  78089. #343
  78090. a Window
  78091.  
  78092. 0
  78093. 2
  78094. 124
  78095. -1
  78096. 346
  78097. 5
  78098. -1
  78099. 328
  78100. 2
  78101. g*et t*ake
  78102. 2
  78103. 41
  78104. -1
  78105. look_self
  78106. 2
  78107. 172
  78108. -1
  78109. 0
  78110. 12
  78111. 5
  78112. 2
  78113. 5
  78114. 5
  78115. 2
  78116. 5
  78117. 5
  78118. 2
  78119. 5
  78120. 5
  78121. 2
  78122. 5
  78123. 5
  78124. 2
  78125. 5
  78126. 5
  78127. 2
  78128. 5
  78129. 5
  78130. 2
  78131. 5
  78132. 5
  78133. 2
  78134. 5
  78135. 0
  78136. 0
  78137. 2
  78138. 4
  78139. 4
  78140. 5
  78141. 2
  78142. a Window
  78143. 2
  78144. the window
  78145. 2
  78146. through window
  78147. 2
  78148. out window
  78149. 2
  78150. window
  78151. 2
  78152. 5
  78153. 5
  78154. 2
  78155. 5
  78156. 4
  78157. 2
  78158. 0
  78159. 0
  78160. 0
  78161. 0
  78162. 2
  78163. 1
  78164. #344 recycled
  78165. #345
  78166. players
  78167.  
  78168. 0
  78169. 147
  78170. 147
  78171. -1
  78172. -1
  78173. 333
  78174. -1
  78175. -1
  78176. 0
  78177. 0
  78178. 14
  78179. 5
  78180. 147
  78181. 5
  78182. 5
  78183. 147
  78184. 5
  78185. 5
  78186. 147
  78187. 5
  78188. 5
  78189. 147
  78190. 5
  78191. 5
  78192. 147
  78193. 5
  78194. 5
  78195. 147
  78196. 5
  78197. 5
  78198. 147
  78199. 5
  78200. 5
  78201. 147
  78202. 5
  78203. 5
  78204. 147
  78205. 5
  78206. 5
  78207. 147
  78208. 5
  78209. 0
  78210. 0
  78211. 147
  78212. 4
  78213. 4
  78214. 1
  78215. 2
  78216. players
  78217. 147
  78218. 5
  78219. 5
  78220. 147
  78221. 5
  78222. 4
  78223. 2
  78224. 0
  78225. 0
  78226. 0
  78227. 0
  78228. 2
  78229. 1
  78230. #346
  78231. shelby
  78232.  
  78233. 3
  78234. 346
  78235. 124
  78236. -1
  78237. 328
  78238. 59
  78239. -1
  78240. 79
  78241. 0
  78242. 0
  78243. 61
  78244. 5
  78245. 38
  78246. 1
  78247. 5
  78248. 346
  78249. 5
  78250. 5
  78251. 346
  78252. 5
  78253. 5
  78254. 346
  78255. 5
  78256. 5
  78257. 346
  78258. 5
  78259. 5
  78260. 38
  78261. 1
  78262. 4
  78263. 2
  78264. 0
  78265. 750697406
  78266. 2
  78267. shelby@Spot.Orion
  78268. 2
  78269. 0
  78270. 5
  78271. 346
  78272. 5
  78273. 2
  78274. orion
  78275. 2
  78276. 0
  78277. 0
  78278. 750702789
  78279. 2
  78280. 1
  78281. 0
  78282. 0
  78283. 346
  78284. 5
  78285. 5
  78286. 346
  78287. 5
  78288. 5
  78289. 38
  78290. 1
  78291. 5
  78292. 38
  78293. 1
  78294. 5
  78295. 38
  78296. 0
  78297. 5
  78298. 38
  78299. 1
  78300. 5
  78301. 346
  78302. 5
  78303. 4
  78304. 1
  78305. 1
  78306. 346
  78307. 2
  78308. 1
  78309. 5
  78310. 38
  78311. 1
  78312. 1
  78313. 346
  78314. 346
  78315. 4
  78316. 4
  78317. 3
  78318. 2
  78319. shelby@Spot.Orion
  78320. 2
  78321. uest@LiverSpot.E.T._Phone_Home
  78322. 2
  78323. Bob_Monsen@Sartre.Orion
  78324. 2
  78325. 0
  78326. 2
  78327. shelby@Spot.Orion
  78328. 2
  78329. 0
  78330. 5
  78331. 346
  78332. 5
  78333. 4
  78334. 0
  78335. 346
  78336. 4
  78337. 5
  78338. 346
  78339. 5
  78340. 5
  78341. 346
  78342. 4
  78343. 5
  78344. 346
  78345. 4
  78346. 5
  78347. 346
  78348. 5
  78349. 5
  78350. 346
  78351. 5
  78352. 5
  78353. 346
  78354. 5
  78355. 5
  78356. 346
  78357. 5
  78358. 5
  78359. 346
  78360. 5
  78361. 5
  78362. 346
  78363. 5
  78364. 5
  78365. 346
  78366. 5
  78367. 5
  78368. 346
  78369. 5
  78370. 5
  78371. 346
  78372. 5
  78373. 4
  78374. 2
  78375. 0
  78376. 0
  78377. 0
  78378. 0
  78379. 346
  78380. 4
  78381. 4
  78382. 0
  78383. 346
  78384. 4
  78385. 0
  78386. 750802956
  78387. 2
  78388. 1
  78389. 0
  78390. 27
  78391. 2
  78392. 0
  78393. 5
  78394. 346
  78395. 5
  78396. 5
  78397. 346
  78398. 5
  78399. 5
  78400. 346
  78401. 5
  78402. 5
  78403. 346
  78404. 5
  78405. 5
  78406. 346
  78407. 5
  78408. 5
  78409. 346
  78410. 5
  78411. 5
  78412. 346
  78413. 5
  78414. 5
  78415. 346
  78416. 5
  78417. 5
  78418. 346
  78419. 5
  78420. 1
  78421. 124
  78422. 346
  78423. 5
  78424. 0
  78425. 0
  78426. 2
  78427. 0
  78428. 5
  78429. 346
  78430. 5
  78431. 5
  78432. 346
  78433. 5
  78434. 5
  78435. 346
  78436. 5
  78437. 5
  78438. 346
  78439. 5
  78440. 5
  78441. 346
  78442. 5
  78443. 0
  78444. -1464094544
  78445. 2
  78446. 1
  78447. 0
  78448. 0
  78449. 346
  78450. 4
  78451. 4
  78452. 1
  78453. 2
  78454. shelby
  78455. 2
  78456. 1
  78457. 2
  78458. A black spot dalmation, with glowing brown eyes.  Never far from LiverSpot...
  78459. 346
  78460. 5
  78461. 4
  78462. 2
  78463. 0
  78464. 0
  78465. 0
  78466. 0
  78467. 2
  78468. 1
  78469. #347 recycled
  78470. #348 recycled
  78471. #349 recycled
  78472. #350 recycled
  78473. #351 recycled
  78474. #352
  78475. The Generic Robot
  78476.  
  78477. 0
  78478. 2
  78479. -1
  78480. -1
  78481. -1
  78482. 8
  78483. 353
  78484. 426
  78485. 16
  78486. init_for_core
  78487. 2
  78488. 45
  78489. -1
  78490. start
  78491. 2
  78492. 45
  78493. -1
  78494. stop
  78495. 2
  78496. 45
  78497. -1
  78498. move_now
  78499. 2
  78500. 41
  78501. -1
  78502. is_started
  78503. 2
  78504. 173
  78505. -1
  78506. entering_room
  78507. 2
  78508. 173
  78509. -1
  78510. leaving_room
  78511. 2
  78512. 173
  78513. -1
  78514. trace
  78515. 2
  78516. 41
  78517. -1
  78518. untrace
  78519. 2
  78520. 41
  78521. -1
  78522. announce_to_tracers
  78523. 2
  78524. 173
  78525. -1
  78526. eavesdrop_on
  78527. 2
  78528. 41
  78529. -1
  78530. stop_eavesdropping_on
  78531. 2
  78532. 41
  78533. -1
  78534. tell
  78535. 2
  78536. 173
  78537. -1
  78538. dawdle
  78539. 2
  78540. 173
  78541. -1
  78542. do_i_like_it_here
  78543. 2
  78544. 173
  78545. -1
  78546. do_something_here
  78547. 2
  78548. 173
  78549. -1
  78550. 8
  78551. movetask
  78552. leaving_room_msg
  78553. entering_room_msg
  78554. prior_location
  78555. tracers
  78556. eavesdroppers
  78557. lazyness
  78558. feature_ok
  78559. 39
  78560. 0
  78561. 0
  78562. 2
  78563. 5
  78564. 2
  78565. %N leaves the room.
  78566. 2
  78567. 5
  78568. 2
  78569. %N enters the room.
  78570. 2
  78571. 5
  78572. 1
  78573. -1
  78574. 2
  78575. 5
  78576. 4
  78577. 0
  78578. 2
  78579. 5
  78580. 4
  78581. 0
  78582. 2
  78583. 5
  78584. 0
  78585. 10
  78586. 2
  78587. 5
  78588. 0
  78589. 1
  78590. 2
  78591. 5
  78592. 5
  78593. 2
  78594. 5
  78595. 5
  78596. 2
  78597. 5
  78598. 5
  78599. 2
  78600. 5
  78601. 5
  78602. 2
  78603. 5
  78604. 5
  78605. 2
  78606. 5
  78607. 5
  78608. 2
  78609. 5
  78610. 5
  78611. 2
  78612. 1
  78613. 5
  78614. 2
  78615. 1
  78616. 5
  78617. 2
  78618. 5
  78619. 5
  78620. 2
  78621. 5
  78622. 5
  78623. 2
  78624. 5
  78625. 5
  78626. 2
  78627. 5
  78628. 5
  78629. 2
  78630. 5
  78631. 5
  78632. 2
  78633. 5
  78634. 5
  78635. 2
  78636. 5
  78637. 5
  78638. 2
  78639. 5
  78640. 5
  78641. 2
  78642. 5
  78643. 5
  78644. 2
  78645. 1
  78646. 5
  78647. 2
  78648. 4
  78649. 5
  78650. 2
  78651. 5
  78652. 5
  78653. 2
  78654. 5
  78655. 5
  78656. 2
  78657. 5
  78658. 5
  78659. 2
  78660. 5
  78661. 5
  78662. 2
  78663. 5
  78664. 5
  78665. 2
  78666. 5
  78667. 5
  78668. 2
  78669. 5
  78670. 5
  78671. 2
  78672. 5
  78673. 0
  78674. 0
  78675. 2
  78676. 4
  78677. 4
  78678. 4
  78679. 2
  78680. The Generic Robot
  78681. 2
  78682. the robot
  78683. 2
  78684. a robot
  78685. 2
  78686. robot
  78687. 2
  78688. 5
  78689. 2
  78690. Generic Robot. Use this to create your own robots
  78691. 2
  78692. 5
  78693. 4
  78694. 2
  78695. 0
  78696. 0
  78697. 0
  78698. 0
  78699. 2
  78700. 1
  78701. #353
  78702. Erik
  78703.  
  78704. 0
  78705. 2
  78706. 426
  78707. -1
  78708. -1
  78709. 352
  78710. -1
  78711. 423
  78712. 2
  78713. do_i_like_it_here
  78714. 2
  78715. 173
  78716. -1
  78717. do_something_here
  78718. 2
  78719. 173
  78720. -1
  78721. 1
  78722. ticks
  78723. 40
  78724. 0
  78725. 5
  78726. 2
  78727. 5
  78728. 0
  78729. 0
  78730. 2
  78731. 5
  78732. 5
  78733. 2
  78734. 5
  78735. 5
  78736. 2
  78737. 5
  78738. 1
  78739. 161
  78740. 2
  78741. 5
  78742. 4
  78743. 0
  78744. 2
  78745. 5
  78746. 5
  78747. 2
  78748. 5
  78749. 0
  78750. 10
  78751. 2
  78752. 5
  78753. 5
  78754. 2
  78755. 5
  78756. 5
  78757. 2
  78758. 5
  78759. 5
  78760. 2
  78761. 5
  78762. 5
  78763. 2
  78764. 5
  78765. 5
  78766. 2
  78767. 5
  78768. 5
  78769. 2
  78770. 5
  78771. 5
  78772. 2
  78773. 5
  78774. 0
  78775. 2
  78776. 2
  78777. 1
  78778. 0
  78779. 1
  78780. 2
  78781. 1
  78782. 5
  78783. 2
  78784. 5
  78785. 5
  78786. 2
  78787. 5
  78788. 5
  78789. 2
  78790. 5
  78791. 5
  78792. 2
  78793. 5
  78794. 5
  78795. 2
  78796. 5
  78797. 5
  78798. 2
  78799. 5
  78800. 5
  78801. 2
  78802. 5
  78803. 5
  78804. 2
  78805. 5
  78806. 5
  78807. 2
  78808. 5
  78809. 5
  78810. 2
  78811. 1
  78812. 5
  78813. 2
  78814. 4
  78815. 5
  78816. 2
  78817. 5
  78818. 5
  78819. 2
  78820. 5
  78821. 5
  78822. 2
  78823. 5
  78824. 5
  78825. 2
  78826. 5
  78827. 5
  78828. 2
  78829. 5
  78830. 5
  78831. 2
  78832. 5
  78833. 5
  78834. 2
  78835. 5
  78836. 5
  78837. 2
  78838. 5
  78839. 0
  78840. 0
  78841. 2
  78842. 4
  78843. 4
  78844. 1
  78845. 2
  78846. Erik
  78847. 2
  78848. 5
  78849. 5
  78850. 2
  78851. 5
  78852. 4
  78853. 2
  78854. 0
  78855. 0
  78856. 0
  78857. 0
  78858. 2
  78859. 1
  78860. #354
  78861. hallway near server cube
  78862.  
  78863. 0
  78864. 228
  78865. -1
  78866. 305
  78867. -1
  78868. 3
  78869. -1
  78870. 357
  78871. 0
  78872. 0
  78873. 17
  78874. 5
  78875. 228
  78876. 5
  78877. 5
  78878. 228
  78879. 5
  78880. 5
  78881. 228
  78882. 5
  78883. 5
  78884. 228
  78885. 5
  78886. 5
  78887. 228
  78888. 5
  78889. 5
  78890. 228
  78891. 5
  78892. 5
  78893. 228
  78894. 5
  78895. 4
  78896. 4
  78897. 1
  78898. 355
  78899. 1
  78900. 359
  78901. 1
  78902. 362
  78903. 1
  78904. 365
  78905. 228
  78906. 4
  78907. 1
  78908. -1
  78909. 228
  78910. 5
  78911. 0
  78912. 32257
  78913. 228
  78914. 5
  78915. 4
  78916. 4
  78917. 1
  78918. 356
  78919. 1
  78920. 358
  78921. 1
  78922. 361
  78923. 1
  78924. 364
  78925. 228
  78926. 4
  78927. 5
  78928. 228
  78929. 5
  78930. 5
  78931. 228
  78932. 5
  78933. 0
  78934. 0
  78935. 228
  78936. 4
  78937. 4
  78938. 1
  78939. 2
  78940. hallway near server cube
  78941. 228
  78942. 5
  78943. 2
  78944. You are in an east-west hallway. There are openings to the north and south.
  78945. 228
  78946. 5
  78947. 4
  78948. 2
  78949. 0
  78950. 0
  78951. 0
  78952. 0
  78953. 2
  78954. 1
  78955. #355
  78956. east
  78957.  
  78958. 0
  78959. 228
  78960. -1
  78961. -1
  78962. -1
  78963. 7
  78964. -1
  78965. 356
  78966. 0
  78967. 0
  78968. 13
  78969. 5
  78970. 228
  78971. 5
  78972. 1
  78973. 302
  78974. 228
  78975. 5
  78976. 1
  78977. 354
  78978. 228
  78979. 5
  78980. 5
  78981. 228
  78982. 5
  78983. 5
  78984. 228
  78985. 5
  78986. 5
  78987. 228
  78988. 5
  78989. 5
  78990. 228
  78991. 5
  78992. 5
  78993. 228
  78994. 5
  78995. 5
  78996. 228
  78997. 5
  78998. 0
  78999. 0
  79000. 228
  79001. 4
  79002. 4
  79003. 2
  79004. 2
  79005. east
  79006. 2
  79007. e
  79008. 228
  79009. 5
  79010. 5
  79011. 228
  79012. 5
  79013. 4
  79014. 2
  79015. 0
  79016. 0
  79017. 0
  79018. 0
  79019. 2
  79020. 1
  79021. #356
  79022. west
  79023.  
  79024. 0
  79025. 228
  79026. -1
  79027. -1
  79028. -1
  79029. 7
  79030. -1
  79031. 358
  79032. 0
  79033. 0
  79034. 13
  79035. 5
  79036. 228
  79037. 5
  79038. 1
  79039. 354
  79040. 228
  79041. 5
  79042. 1
  79043. 302
  79044. 228
  79045. 5
  79046. 5
  79047. 228
  79048. 5
  79049. 5
  79050. 228
  79051. 5
  79052. 5
  79053. 228
  79054. 5
  79055. 5
  79056. 228
  79057. 5
  79058. 5
  79059. 228
  79060. 5
  79061. 5
  79062. 228
  79063. 5
  79064. 0
  79065. 0
  79066. 228
  79067. 4
  79068. 4
  79069. 2
  79070. 2
  79071. west
  79072. 2
  79073. w
  79074. 228
  79075. 5
  79076. 5
  79077. 228
  79078. 5
  79079. 4
  79080. 2
  79081. 0
  79082. 0
  79083. 0
  79084. 0
  79085. 2
  79086. 1
  79087. #357
  79088. Server Cube
  79089.  
  79090. 0
  79091. 228
  79092. -1
  79093. -1
  79094. -1
  79095. 3
  79096. -1
  79097. 360
  79098. 0
  79099. 0
  79100. 17
  79101. 5
  79102. 228
  79103. 5
  79104. 5
  79105. 228
  79106. 5
  79107. 5
  79108. 228
  79109. 5
  79110. 5
  79111. 228
  79112. 5
  79113. 5
  79114. 228
  79115. 5
  79116. 5
  79117. 228
  79118. 5
  79119. 5
  79120. 228
  79121. 5
  79122. 4
  79123. 1
  79124. 1
  79125. 358
  79126. 228
  79127. 4
  79128. 1
  79129. -1
  79130. 228
  79131. 5
  79132. 0
  79133. 21430
  79134. 228
  79135. 5
  79136. 4
  79137. 1
  79138. 1
  79139. 359
  79140. 228
  79141. 4
  79142. 5
  79143. 228
  79144. 5
  79145. 5
  79146. 228
  79147. 5
  79148. 0
  79149. 0
  79150. 228
  79151. 4
  79152. 4
  79153. 1
  79154. 2
  79155. Server Cube
  79156. 228
  79157. 5
  79158. 5
  79159. 228
  79160. 5
  79161. 4
  79162. 2
  79163. 0
  79164. 0
  79165. 0
  79166. 0
  79167. 2
  79168. 1
  79169. #358
  79170. north
  79171.  
  79172. 0
  79173. 228
  79174. -1
  79175. -1
  79176. -1
  79177. 7
  79178. -1
  79179. 359
  79180. 0
  79181. 0
  79182. 13
  79183. 5
  79184. 228
  79185. 5
  79186. 1
  79187. 354
  79188. 228
  79189. 5
  79190. 1
  79191. 357
  79192. 228
  79193. 5
  79194. 5
  79195. 228
  79196. 5
  79197. 5
  79198. 228
  79199. 5
  79200. 5
  79201. 228
  79202. 5
  79203. 5
  79204. 228
  79205. 5
  79206. 5
  79207. 228
  79208. 5
  79209. 5
  79210. 228
  79211. 5
  79212. 0
  79213. 0
  79214. 228
  79215. 4
  79216. 4
  79217. 2
  79218. 2
  79219. north
  79220. 2
  79221. n
  79222. 228
  79223. 5
  79224. 5
  79225. 228
  79226. 5
  79227. 4
  79228. 2
  79229. 0
  79230. 0
  79231. 0
  79232. 0
  79233. 2
  79234. 1
  79235. #359
  79236. south
  79237.  
  79238. 0
  79239. 228
  79240. -1
  79241. -1
  79242. -1
  79243. 7
  79244. -1
  79245. 361
  79246. 0
  79247. 0
  79248. 13
  79249. 5
  79250. 228
  79251. 5
  79252. 1
  79253. 357
  79254. 228
  79255. 5
  79256. 1
  79257. 354
  79258. 228
  79259. 5
  79260. 5
  79261. 228
  79262. 5
  79263. 5
  79264. 228
  79265. 5
  79266. 5
  79267. 228
  79268. 5
  79269. 5
  79270. 228
  79271. 5
  79272. 5
  79273. 228
  79274. 5
  79275. 5
  79276. 228
  79277. 5
  79278. 0
  79279. 0
  79280. 228
  79281. 4
  79282. 4
  79283. 3
  79284. 2
  79285. south
  79286. 2
  79287. s
  79288. 2
  79289. out
  79290. 228
  79291. 5
  79292. 5
  79293. 228
  79294. 5
  79295. 4
  79296. 2
  79297. 0
  79298. 0
  79299. 0
  79300. 0
  79301. 2
  79302. 1
  79303. #360
  79304. A Spare Cube
  79305.  
  79306. 0
  79307. 228
  79308. -1
  79309. -1
  79310. -1
  79311. 3
  79312. -1
  79313. 363
  79314. 0
  79315. 0
  79316. 17
  79317. 5
  79318. 228
  79319. 5
  79320. 5
  79321. 228
  79322. 5
  79323. 5
  79324. 228
  79325. 5
  79326. 5
  79327. 228
  79328. 5
  79329. 5
  79330. 228
  79331. 5
  79332. 5
  79333. 228
  79334. 5
  79335. 5
  79336. 228
  79337. 5
  79338. 4
  79339. 1
  79340. 1
  79341. 361
  79342. 228
  79343. 4
  79344. 1
  79345. -1
  79346. 228
  79347. 5
  79348. 0
  79349. 31745
  79350. 228
  79351. 5
  79352. 4
  79353. 1
  79354. 1
  79355. 362
  79356. 228
  79357. 4
  79358. 5
  79359. 228
  79360. 5
  79361. 5
  79362. 228
  79363. 5
  79364. 0
  79365. 0
  79366. 228
  79367. 4
  79368. 4
  79369. 1
  79370. 2
  79371. A Spare Cube
  79372. 228
  79373. 5
  79374. 5
  79375. 228
  79376. 5
  79377. 4
  79378. 2
  79379. 0
  79380. 0
  79381. 0
  79382. 0
  79383. 2
  79384. 1
  79385. #361
  79386. south
  79387.  
  79388. 0
  79389. 228
  79390. -1
  79391. -1
  79392. -1
  79393. 7
  79394. -1
  79395. 362
  79396. 0
  79397. 0
  79398. 13
  79399. 5
  79400. 228
  79401. 5
  79402. 1
  79403. 354
  79404. 228
  79405. 5
  79406. 1
  79407. 360
  79408. 228
  79409. 5
  79410. 5
  79411. 228
  79412. 5
  79413. 5
  79414. 228
  79415. 5
  79416. 5
  79417. 228
  79418. 5
  79419. 5
  79420. 228
  79421. 5
  79422. 5
  79423. 228
  79424. 5
  79425. 5
  79426. 228
  79427. 5
  79428. 0
  79429. 0
  79430. 228
  79431. 4
  79432. 4
  79433. 2
  79434. 2
  79435. south
  79436. 2
  79437. s
  79438. 228
  79439. 5
  79440. 5
  79441. 228
  79442. 5
  79443. 4
  79444. 2
  79445. 0
  79446. 0
  79447. 0
  79448. 0
  79449. 2
  79450. 1
  79451. #362
  79452. north
  79453.  
  79454. 0
  79455. 228
  79456. -1
  79457. -1
  79458. -1
  79459. 7
  79460. -1
  79461. 364
  79462. 0
  79463. 0
  79464. 13
  79465. 5
  79466. 228
  79467. 5
  79468. 1
  79469. 360
  79470. 228
  79471. 5
  79472. 1
  79473. 354
  79474. 228
  79475. 5
  79476. 5
  79477. 228
  79478. 5
  79479. 5
  79480. 228
  79481. 5
  79482. 5
  79483. 228
  79484. 5
  79485. 5
  79486. 228
  79487. 5
  79488. 5
  79489. 228
  79490. 5
  79491. 5
  79492. 228
  79493. 5
  79494. 0
  79495. 0
  79496. 228
  79497. 4
  79498. 4
  79499. 3
  79500. 2
  79501. north
  79502. 2
  79503. n
  79504. 2
  79505. out
  79506. 228
  79507. 5
  79508. 5
  79509. 228
  79510. 5
  79511. 4
  79512. 2
  79513. 0
  79514. 0
  79515. 0
  79516. 0
  79517. 2
  79518. 1
  79519. #363
  79520. hallway near Betsy's old cube
  79521.  
  79522. 0
  79523. 228
  79524. -1
  79525. -1
  79526. -1
  79527. 3
  79528. -1
  79529. 366
  79530. 0
  79531. 0
  79532. 17
  79533. 5
  79534. 228
  79535. 5
  79536. 5
  79537. 228
  79538. 5
  79539. 5
  79540. 228
  79541. 5
  79542. 5
  79543. 228
  79544. 5
  79545. 5
  79546. 228
  79547. 5
  79548. 5
  79549. 228
  79550. 5
  79551. 5
  79552. 228
  79553. 5
  79554. 4
  79555. 4
  79556. 1
  79557. 364
  79558. 1
  79559. 368
  79560. 1
  79561. 371
  79562. 1
  79563. 374
  79564. 228
  79565. 4
  79566. 1
  79567. -1
  79568. 228
  79569. 5
  79570. 0
  79571. 10814
  79572. 228
  79573. 5
  79574. 4
  79575. 4
  79576. 1
  79577. 365
  79578. 1
  79579. 367
  79580. 1
  79581. 370
  79582. 1
  79583. 373
  79584. 228
  79585. 4
  79586. 5
  79587. 228
  79588. 5
  79589. 5
  79590. 228
  79591. 5
  79592. 0
  79593. 0
  79594. 228
  79595. 4
  79596. 4
  79597. 1
  79598. 2
  79599. hallway near Betsy's old cube
  79600. 228
  79601. 5
  79602. 2
  79603. You are in an east-west hallway. there are exits north and south.
  79604. 228
  79605. 5
  79606. 4
  79607. 2
  79608. 0
  79609. 0
  79610. 0
  79611. 0
  79612. 2
  79613. 1
  79614. #364
  79615. east
  79616.  
  79617. 0
  79618. 228
  79619. -1
  79620. -1
  79621. -1
  79622. 7
  79623. -1
  79624. 365
  79625. 0
  79626. 0
  79627. 13
  79628. 5
  79629. 228
  79630. 5
  79631. 1
  79632. 354
  79633. 228
  79634. 5
  79635. 1
  79636. 363
  79637. 228
  79638. 5
  79639. 5
  79640. 228
  79641. 5
  79642. 5
  79643. 228
  79644. 5
  79645. 5
  79646. 228
  79647. 5
  79648. 5
  79649. 228
  79650. 5
  79651. 5
  79652. 228
  79653. 5
  79654. 5
  79655. 228
  79656. 5
  79657. 0
  79658. 0
  79659. 228
  79660. 4
  79661. 4
  79662. 2
  79663. 2
  79664. east
  79665. 2
  79666. e
  79667. 228
  79668. 5
  79669. 5
  79670. 228
  79671. 5
  79672. 4
  79673. 2
  79674. 0
  79675. 0
  79676. 0
  79677. 0
  79678. 2
  79679. 1
  79680. #365
  79681. west
  79682.  
  79683. 0
  79684. 228
  79685. -1
  79686. -1
  79687. -1
  79688. 7
  79689. -1
  79690. 367
  79691. 0
  79692. 0
  79693. 13
  79694. 5
  79695. 228
  79696. 5
  79697. 1
  79698. 363
  79699. 228
  79700. 5
  79701. 1
  79702. 354
  79703. 228
  79704. 5
  79705. 5
  79706. 228
  79707. 5
  79708. 5
  79709. 228
  79710. 5
  79711. 5
  79712. 228
  79713. 5
  79714. 5
  79715. 228
  79716. 5
  79717. 5
  79718. 228
  79719. 5
  79720. 5
  79721. 228
  79722. 5
  79723. 0
  79724. 0
  79725. 228
  79726. 4
  79727. 4
  79728. 2
  79729. 2
  79730. west
  79731. 2
  79732. w
  79733. 228
  79734. 5
  79735. 5
  79736. 228
  79737. 5
  79738. 4
  79739. 2
  79740. 0
  79741. 0
  79742. 0
  79743. 0
  79744. 2
  79745. 1
  79746. #366
  79747. Betsy's old cube
  79748.  
  79749. 0
  79750. 228
  79751. -1
  79752. -1
  79753. -1
  79754. 3
  79755. -1
  79756. 369
  79757. 0
  79758. 0
  79759. 17
  79760. 5
  79761. 228
  79762. 5
  79763. 5
  79764. 228
  79765. 5
  79766. 5
  79767. 228
  79768. 5
  79769. 5
  79770. 228
  79771. 5
  79772. 5
  79773. 228
  79774. 5
  79775. 5
  79776. 228
  79777. 5
  79778. 5
  79779. 228
  79780. 5
  79781. 4
  79782. 1
  79783. 1
  79784. 367
  79785. 228
  79786. 4
  79787. 1
  79788. -1
  79789. 228
  79790. 5
  79791. 0
  79792. 26597
  79793. 228
  79794. 5
  79795. 4
  79796. 1
  79797. 1
  79798. 368
  79799. 228
  79800. 4
  79801. 5
  79802. 228
  79803. 5
  79804. 5
  79805. 228
  79806. 5
  79807. 0
  79808. 0
  79809. 228
  79810. 4
  79811. 4
  79812. 1
  79813. 2
  79814. Betsy's old cube
  79815. 228
  79816. 5
  79817. 5
  79818. 228
  79819. 5
  79820. 4
  79821. 2
  79822. 0
  79823. 0
  79824. 0
  79825. 0
  79826. 2
  79827. 1
  79828. #367
  79829. north
  79830.  
  79831. 0
  79832. 228
  79833. -1
  79834. -1
  79835. -1
  79836. 7
  79837. -1
  79838. 368
  79839. 0
  79840. 0
  79841. 13
  79842. 5
  79843. 228
  79844. 5
  79845. 1
  79846. 363
  79847. 228
  79848. 5
  79849. 1
  79850. 366
  79851. 228
  79852. 5
  79853. 5
  79854. 228
  79855. 5
  79856. 5
  79857. 228
  79858. 5
  79859. 5
  79860. 228
  79861. 5
  79862. 5
  79863. 228
  79864. 5
  79865. 5
  79866. 228
  79867. 5
  79868. 5
  79869. 228
  79870. 5
  79871. 0
  79872. 0
  79873. 228
  79874. 4
  79875. 4
  79876. 2
  79877. 2
  79878. north
  79879. 2
  79880. n
  79881. 228
  79882. 5
  79883. 5
  79884. 228
  79885. 5
  79886. 4
  79887. 2
  79888. 0
  79889. 0
  79890. 0
  79891. 0
  79892. 2
  79893. 1
  79894. #368
  79895. south
  79896.  
  79897. 0
  79898. 228
  79899. -1
  79900. -1
  79901. -1
  79902. 7
  79903. -1
  79904. 370
  79905. 0
  79906. 0
  79907. 13
  79908. 5
  79909. 228
  79910. 5
  79911. 1
  79912. 366
  79913. 228
  79914. 5
  79915. 1
  79916. 363
  79917. 228
  79918. 5
  79919. 5
  79920. 228
  79921. 5
  79922. 5
  79923. 228
  79924. 5
  79925. 5
  79926. 228
  79927. 5
  79928. 5
  79929. 228
  79930. 5
  79931. 5
  79932. 228
  79933. 5
  79934. 5
  79935. 228
  79936. 5
  79937. 0
  79938. 0
  79939. 228
  79940. 4
  79941. 4
  79942. 3
  79943. 2
  79944. south
  79945. 2
  79946. s
  79947. 2
  79948. out
  79949. 228
  79950. 5
  79951. 5
  79952. 228
  79953. 5
  79954. 4
  79955. 2
  79956. 0
  79957. 0
  79958. 0
  79959. 0
  79960. 2
  79961. 1
  79962. #369
  79963. The binder cube
  79964.  
  79965. 0
  79966. 228
  79967. -1
  79968. 422
  79969. -1
  79970. 3
  79971. -1
  79972. 372
  79973. 0
  79974. 0
  79975. 17
  79976. 5
  79977. 228
  79978. 5
  79979. 5
  79980. 228
  79981. 5
  79982. 5
  79983. 228
  79984. 5
  79985. 5
  79986. 228
  79987. 5
  79988. 5
  79989. 228
  79990. 5
  79991. 5
  79992. 228
  79993. 5
  79994. 5
  79995. 228
  79996. 5
  79997. 4
  79998. 1
  79999. 1
  80000. 370
  80001. 228
  80002. 4
  80003. 1
  80004. -1
  80005. 228
  80006. 5
  80007. 0
  80008. 25851
  80009. 228
  80010. 5
  80011. 4
  80012. 1
  80013. 1
  80014. 371
  80015. 228
  80016. 4
  80017. 5
  80018. 228
  80019. 5
  80020. 5
  80021. 228
  80022. 5
  80023. 0
  80024. 0
  80025. 228
  80026. 4
  80027. 4
  80028. 1
  80029. 2
  80030. The binder cube
  80031. 228
  80032. 5
  80033. 2
  80034. You are in a cube filled with useless junk.
  80035. 228
  80036. 5
  80037. 4
  80038. 2
  80039. 0
  80040. 0
  80041. 0
  80042. 0
  80043. 2
  80044. 1
  80045. #370
  80046. south
  80047.  
  80048. 0
  80049. 228
  80050. -1
  80051. -1
  80052. -1
  80053. 7
  80054. -1
  80055. 371
  80056. 0
  80057. 0
  80058. 13
  80059. 5
  80060. 228
  80061. 5
  80062. 1
  80063. 363
  80064. 228
  80065. 5
  80066. 1
  80067. 369
  80068. 228
  80069. 5
  80070. 5
  80071. 228
  80072. 5
  80073. 5
  80074. 228
  80075. 5
  80076. 5
  80077. 228
  80078. 5
  80079. 5
  80080. 228
  80081. 5
  80082. 5
  80083. 228
  80084. 5
  80085. 5
  80086. 228
  80087. 5
  80088. 0
  80089. 0
  80090. 228
  80091. 4
  80092. 4
  80093. 2
  80094. 2
  80095. south
  80096. 2
  80097. s
  80098. 228
  80099. 5
  80100. 5
  80101. 228
  80102. 5
  80103. 4
  80104. 2
  80105. 0
  80106. 0
  80107. 0
  80108. 0
  80109. 2
  80110. 1
  80111. #371
  80112. north
  80113.  
  80114. 0
  80115. 228
  80116. -1
  80117. -1
  80118. -1
  80119. 7
  80120. -1
  80121. 373
  80122. 0
  80123. 0
  80124. 13
  80125. 5
  80126. 228
  80127. 5
  80128. 1
  80129. 369
  80130. 228
  80131. 5
  80132. 1
  80133. 363
  80134. 228
  80135. 5
  80136. 5
  80137. 228
  80138. 5
  80139. 5
  80140. 228
  80141. 5
  80142. 5
  80143. 228
  80144. 5
  80145. 5
  80146. 228
  80147. 5
  80148. 5
  80149. 228
  80150. 5
  80151. 5
  80152. 228
  80153. 5
  80154. 0
  80155. 0
  80156. 228
  80157. 4
  80158. 4
  80159. 3
  80160. 2
  80161. north
  80162. 2
  80163. n
  80164. 2
  80165. out
  80166. 228
  80167. 5
  80168. 5
  80169. 228
  80170. 5
  80171. 4
  80172. 2
  80173. 0
  80174. 0
  80175. 0
  80176. 0
  80177. 2
  80178. 1
  80179. #372
  80180. hallway turn
  80181.  
  80182. 0
  80183. 228
  80184. -1
  80185. -1
  80186. -1
  80187. 3
  80188. -1
  80189. 375
  80190. 0
  80191. 0
  80192. 17
  80193. 5
  80194. 228
  80195. 5
  80196. 5
  80197. 228
  80198. 5
  80199. 5
  80200. 228
  80201. 5
  80202. 5
  80203. 228
  80204. 5
  80205. 5
  80206. 228
  80207. 5
  80208. 5
  80209. 228
  80210. 5
  80211. 5
  80212. 228
  80213. 5
  80214. 4
  80215. 4
  80216. 1
  80217. 373
  80218. 1
  80219. 377
  80220. 1
  80221. 380
  80222. 1
  80223. 383
  80224. 228
  80225. 4
  80226. 1
  80227. -1
  80228. 228
  80229. 5
  80230. 0
  80231. 27498
  80232. 228
  80233. 5
  80234. 4
  80235. 4
  80236. 1
  80237. 374
  80238. 1
  80239. 376
  80240. 1
  80241. 379
  80242. 1
  80243. 382
  80244. 228
  80245. 4
  80246. 5
  80247. 228
  80248. 5
  80249. 5
  80250. 228
  80251. 5
  80252. 0
  80253. 0
  80254. 228
  80255. 4
  80256. 4
  80257. 1
  80258. 2
  80259. hallway turn
  80260. 228
  80261. 5
  80262. 2
  80263. You are at the eastern end of a hallway. There is another hallway leading south, and office doors to the north and east.
  80264. 228
  80265. 5
  80266. 4
  80267. 2
  80268. 0
  80269. 0
  80270. 0
  80271. 0
  80272. 2
  80273. 1
  80274. #373
  80275. east
  80276.  
  80277. 0
  80278. 228
  80279. -1
  80280. -1
  80281. -1
  80282. 7
  80283. -1
  80284. 374
  80285. 0
  80286. 0
  80287. 13
  80288. 5
  80289. 228
  80290. 5
  80291. 1
  80292. 363
  80293. 228
  80294. 5
  80295. 1
  80296. 372
  80297. 228
  80298. 5
  80299. 5
  80300. 228
  80301. 5
  80302. 5
  80303. 228
  80304. 5
  80305. 5
  80306. 228
  80307. 5
  80308. 5
  80309. 228
  80310. 5
  80311. 5
  80312. 228
  80313. 5
  80314. 5
  80315. 228
  80316. 5
  80317. 0
  80318. 0
  80319. 228
  80320. 4
  80321. 4
  80322. 2
  80323. 2
  80324. east
  80325. 2
  80326. e
  80327. 228
  80328. 5
  80329. 5
  80330. 228
  80331. 5
  80332. 4
  80333. 2
  80334. 0
  80335. 0
  80336. 0
  80337. 0
  80338. 2
  80339. 1
  80340. #374
  80341. west
  80342.  
  80343. 0
  80344. 228
  80345. -1
  80346. -1
  80347. -1
  80348. 7
  80349. -1
  80350. 376
  80351. 0
  80352. 0
  80353. 13
  80354. 5
  80355. 228
  80356. 5
  80357. 1
  80358. 372
  80359. 228
  80360. 5
  80361. 1
  80362. 363
  80363. 228
  80364. 5
  80365. 5
  80366. 228
  80367. 5
  80368. 5
  80369. 228
  80370. 5
  80371. 5
  80372. 228
  80373. 5
  80374. 5
  80375. 228
  80376. 5
  80377. 5
  80378. 228
  80379. 5
  80380. 5
  80381. 228
  80382. 5
  80383. 0
  80384. 0
  80385. 228
  80386. 4
  80387. 4
  80388. 2
  80389. 2
  80390. west
  80391. 2
  80392. w
  80393. 228
  80394. 5
  80395. 5
  80396. 228
  80397. 5
  80398. 4
  80399. 2
  80400. 0
  80401. 0
  80402. 0
  80403. 0
  80404. 2
  80405. 1
  80406. #375
  80407. Mark Green's Office
  80408.  
  80409. 0
  80410. 228
  80411. -1
  80412. -1
  80413. -1
  80414. 3
  80415. -1
  80416. 378
  80417. 0
  80418. 0
  80419. 17
  80420. 5
  80421. 228
  80422. 5
  80423. 5
  80424. 228
  80425. 5
  80426. 5
  80427. 228
  80428. 5
  80429. 5
  80430. 228
  80431. 5
  80432. 5
  80433. 228
  80434. 5
  80435. 5
  80436. 228
  80437. 5
  80438. 5
  80439. 228
  80440. 5
  80441. 4
  80442. 1
  80443. 1
  80444. 376
  80445. 228
  80446. 4
  80447. 1
  80448. -1
  80449. 228
  80450. 5
  80451. 0
  80452. 23976
  80453. 228
  80454. 5
  80455. 4
  80456. 1
  80457. 1
  80458. 377
  80459. 228
  80460. 4
  80461. 5
  80462. 228
  80463. 5
  80464. 5
  80465. 228
  80466. 5
  80467. 0
  80468. 0
  80469. 228
  80470. 4
  80471. 4
  80472. 1
  80473. 2
  80474. Mark Green's Office
  80475. 228
  80476. 5
  80477. 5
  80478. 228
  80479. 5
  80480. 4
  80481. 2
  80482. 0
  80483. 0
  80484. 0
  80485. 0
  80486. 2
  80487. 1
  80488. #376
  80489. north
  80490.  
  80491. 0
  80492. 228
  80493. -1
  80494. -1
  80495. -1
  80496. 7
  80497. -1
  80498. 377
  80499. 0
  80500. 0
  80501. 13
  80502. 5
  80503. 228
  80504. 5
  80505. 1
  80506. 372
  80507. 228
  80508. 5
  80509. 1
  80510. 375
  80511. 228
  80512. 5
  80513. 5
  80514. 228
  80515. 5
  80516. 5
  80517. 228
  80518. 5
  80519. 5
  80520. 228
  80521. 5
  80522. 5
  80523. 228
  80524. 5
  80525. 5
  80526. 228
  80527. 5
  80528. 5
  80529. 228
  80530. 5
  80531. 0
  80532. 0
  80533. 228
  80534. 4
  80535. 4
  80536. 2
  80537. 2
  80538. north
  80539. 2
  80540. n
  80541. 228
  80542. 5
  80543. 5
  80544. 228
  80545. 5
  80546. 4
  80547. 2
  80548. 0
  80549. 0
  80550. 0
  80551. 0
  80552. 2
  80553. 1
  80554. #377
  80555. south
  80556.  
  80557. 0
  80558. 228
  80559. -1
  80560. -1
  80561. -1
  80562. 7
  80563. -1
  80564. 379
  80565. 0
  80566. 0
  80567. 13
  80568. 5
  80569. 228
  80570. 5
  80571. 1
  80572. 375
  80573. 228
  80574. 5
  80575. 1
  80576. 372
  80577. 228
  80578. 5
  80579. 5
  80580. 228
  80581. 5
  80582. 5
  80583. 228
  80584. 5
  80585. 5
  80586. 228
  80587. 5
  80588. 5
  80589. 228
  80590. 5
  80591. 5
  80592. 228
  80593. 5
  80594. 5
  80595. 228
  80596. 5
  80597. 0
  80598. 0
  80599. 228
  80600. 4
  80601. 4
  80602. 3
  80603. 2
  80604. south
  80605. 2
  80606. s
  80607. 2
  80608. out
  80609. 228
  80610. 5
  80611. 5
  80612. 228
  80613. 5
  80614. 4
  80615. 2
  80616. 0
  80617. 0
  80618. 0
  80619. 0
  80620. 2
  80621. 1
  80622. #378
  80623. Erik's Office
  80624.  
  80625. 0
  80626. 228
  80627. -1
  80628. -1
  80629. -1
  80630. 3
  80631. -1
  80632. 381
  80633. 0
  80634. 0
  80635. 17
  80636. 5
  80637. 228
  80638. 5
  80639. 5
  80640. 228
  80641. 5
  80642. 5
  80643. 228
  80644. 5
  80645. 5
  80646. 228
  80647. 5
  80648. 5
  80649. 228
  80650. 5
  80651. 5
  80652. 228
  80653. 5
  80654. 5
  80655. 228
  80656. 5
  80657. 4
  80658. 1
  80659. 1
  80660. 379
  80661. 228
  80662. 4
  80663. 1
  80664. -1
  80665. 228
  80666. 5
  80667. 0
  80668. 26065
  80669. 228
  80670. 5
  80671. 4
  80672. 1
  80673. 1
  80674. 380
  80675. 228
  80676. 4
  80677. 5
  80678. 228
  80679. 5
  80680. 5
  80681. 228
  80682. 5
  80683. 0
  80684. 0
  80685. 228
  80686. 4
  80687. 4
  80688. 1
  80689. 2
  80690. Erik's Office
  80691. 228
  80692. 5
  80693. 5
  80694. 228
  80695. 5
  80696. 4
  80697. 2
  80698. 0
  80699. 0
  80700. 0
  80701. 0
  80702. 2
  80703. 1
  80704. #379
  80705. east
  80706.  
  80707. 0
  80708. 228
  80709. -1
  80710. -1
  80711. -1
  80712. 7
  80713. -1
  80714. 380
  80715. 0
  80716. 0
  80717. 13
  80718. 5
  80719. 228
  80720. 5
  80721. 1
  80722. 372
  80723. 228
  80724. 5
  80725. 1
  80726. 378
  80727. 228
  80728. 5
  80729. 5
  80730. 228
  80731. 5
  80732. 5
  80733. 228
  80734. 5
  80735. 5
  80736. 228
  80737. 5
  80738. 5
  80739. 228
  80740. 5
  80741. 5
  80742. 228
  80743. 5
  80744. 5
  80745. 228
  80746. 5
  80747. 0
  80748. 0
  80749. 228
  80750. 4
  80751. 4
  80752. 2
  80753. 2
  80754. east
  80755. 2
  80756. e
  80757. 228
  80758. 5
  80759. 5
  80760. 228
  80761. 5
  80762. 4
  80763. 2
  80764. 0
  80765. 0
  80766. 0
  80767. 0
  80768. 2
  80769. 1
  80770. #380
  80771. west
  80772.  
  80773. 0
  80774. 228
  80775. -1
  80776. -1
  80777. -1
  80778. 7
  80779. -1
  80780. 382
  80781. 0
  80782. 0
  80783. 13
  80784. 5
  80785. 228
  80786. 5
  80787. 1
  80788. 378
  80789. 228
  80790. 5
  80791. 1
  80792. 372
  80793. 228
  80794. 5
  80795. 5
  80796. 228
  80797. 5
  80798. 5
  80799. 228
  80800. 5
  80801. 5
  80802. 228
  80803. 5
  80804. 5
  80805. 228
  80806. 5
  80807. 5
  80808. 228
  80809. 5
  80810. 5
  80811. 228
  80812. 5
  80813. 0
  80814. 0
  80815. 228
  80816. 4
  80817. 4
  80818. 3
  80819. 2
  80820. west
  80821. 2
  80822. w
  80823. 2
  80824. out
  80825. 228
  80826. 5
  80827. 5
  80828. 228
  80829. 5
  80830. 4
  80831. 2
  80832. 0
  80833. 0
  80834. 0
  80835. 0
  80836. 2
  80837. 1
  80838. #381
  80839. hallway near Erik's office
  80840.  
  80841. 0
  80842. 228
  80843. -1
  80844. -1
  80845. -1
  80846. 3
  80847. -1
  80848. 384
  80849. 0
  80850. 0
  80851. 17
  80852. 5
  80853. 228
  80854. 5
  80855. 5
  80856. 228
  80857. 5
  80858. 5
  80859. 228
  80860. 5
  80861. 5
  80862. 228
  80863. 5
  80864. 5
  80865. 228
  80866. 5
  80867. 5
  80868. 228
  80869. 5
  80870. 5
  80871. 228
  80872. 5
  80873. 4
  80874. 2
  80875. 1
  80876. 382
  80877. 1
  80878. 386
  80879. 228
  80880. 4
  80881. 1
  80882. -1
  80883. 228
  80884. 5
  80885. 0
  80886. 5801
  80887. 228
  80888. 5
  80889. 4
  80890. 2
  80891. 1
  80892. 383
  80893. 1
  80894. 385
  80895. 228
  80896. 4
  80897. 5
  80898. 228
  80899. 5
  80900. 5
  80901. 228
  80902. 5
  80903. 0
  80904. 0
  80905. 228
  80906. 4
  80907. 4
  80908. 1
  80909. 2
  80910. hallway near Erik's office
  80911. 228
  80912. 5
  80913. 2
  80914. You are in a north-south hallway. There is a window looking in on Erik's office
  80915. 228
  80916. 5
  80917. 4
  80918. 2
  80919. 0
  80920. 0
  80921. 0
  80922. 0
  80923. 2
  80924. 1
  80925. #382
  80926. south
  80927.  
  80928. 0
  80929. 228
  80930. -1
  80931. -1
  80932. -1
  80933. 7
  80934. -1
  80935. 383
  80936. 0
  80937. 0
  80938. 13
  80939. 5
  80940. 228
  80941. 5
  80942. 1
  80943. 372
  80944. 228
  80945. 5
  80946. 1
  80947. 381
  80948. 228
  80949. 5
  80950. 5
  80951. 228
  80952. 5
  80953. 5
  80954. 228
  80955. 5
  80956. 5
  80957. 228
  80958. 5
  80959. 5
  80960. 228
  80961. 5
  80962. 5
  80963. 228
  80964. 5
  80965. 5
  80966. 228
  80967. 5
  80968. 0
  80969. 0
  80970. 228
  80971. 4
  80972. 4
  80973. 2
  80974. 2
  80975. south
  80976. 2
  80977. s
  80978. 228
  80979. 5
  80980. 5
  80981. 228
  80982. 5
  80983. 4
  80984. 2
  80985. 0
  80986. 0
  80987. 0
  80988. 0
  80989. 2
  80990. 1
  80991. #383
  80992. north
  80993.  
  80994. 0
  80995. 228
  80996. -1
  80997. -1
  80998. -1
  80999. 7
  81000. -1
  81001. 385
  81002. 0
  81003. 0
  81004. 13
  81005. 5
  81006. 228
  81007. 5
  81008. 1
  81009. 381
  81010. 228
  81011. 5
  81012. 1
  81013. 372
  81014. 228
  81015. 5
  81016. 5
  81017. 228
  81018. 5
  81019. 5
  81020. 228
  81021. 5
  81022. 5
  81023. 228
  81024. 5
  81025. 5
  81026. 228
  81027. 5
  81028. 5
  81029. 228
  81030. 5
  81031. 5
  81032. 228
  81033. 5
  81034. 0
  81035. 0
  81036. 228
  81037. 4
  81038. 4
  81039. 2
  81040. 2
  81041. north
  81042. 2
  81043. n
  81044. 228
  81045. 5
  81046. 5
  81047. 228
  81048. 5
  81049. 4
  81050. 2
  81051. 0
  81052. 0
  81053. 0
  81054. 0
  81055. 2
  81056. 1
  81057. #384
  81058. hallway near MF's office
  81059.  
  81060. 0
  81061. 228
  81062. -1
  81063. -1
  81064. -1
  81065. 3
  81066. -1
  81067. 387
  81068. 0
  81069. 0
  81070. 17
  81071. 5
  81072. 228
  81073. 5
  81074. 5
  81075. 228
  81076. 5
  81077. 5
  81078. 228
  81079. 5
  81080. 5
  81081. 228
  81082. 5
  81083. 5
  81084. 228
  81085. 5
  81086. 5
  81087. 228
  81088. 5
  81089. 5
  81090. 228
  81091. 5
  81092. 4
  81093. 2
  81094. 1
  81095. 385
  81096. 1
  81097. 389
  81098. 228
  81099. 4
  81100. 1
  81101. -1
  81102. 228
  81103. 5
  81104. 0
  81105. 19070
  81106. 228
  81107. 5
  81108. 4
  81109. 2
  81110. 1
  81111. 386
  81112. 1
  81113. 388
  81114. 228
  81115. 4
  81116. 5
  81117. 228
  81118. 5
  81119. 5
  81120. 228
  81121. 5
  81122. 0
  81123. 0
  81124. 228
  81125. 4
  81126. 4
  81127. 1
  81128. 2
  81129. hallway near MF's office
  81130. 228
  81131. 5
  81132. 2
  81133. You are in a north-south hallway. There is a window here looking in on MF's office
  81134. 228
  81135. 5
  81136. 4
  81137. 2
  81138. 0
  81139. 0
  81140. 0
  81141. 0
  81142. 2
  81143. 1
  81144. #385
  81145. south
  81146.  
  81147. 0
  81148. 228
  81149. -1
  81150. -1
  81151. -1
  81152. 7
  81153. -1
  81154. 386
  81155. 0
  81156. 0
  81157. 13
  81158. 5
  81159. 228
  81160. 5
  81161. 1
  81162. 381
  81163. 228
  81164. 5
  81165. 1
  81166. 384
  81167. 228
  81168. 5
  81169. 5
  81170. 228
  81171. 5
  81172. 5
  81173. 228
  81174. 5
  81175. 5
  81176. 228
  81177. 5
  81178. 5
  81179. 228
  81180. 5
  81181. 5
  81182. 228
  81183. 5
  81184. 5
  81185. 228
  81186. 5
  81187. 0
  81188. 0
  81189. 228
  81190. 4
  81191. 4
  81192. 2
  81193. 2
  81194. south
  81195. 2
  81196. s
  81197. 228
  81198. 5
  81199. 5
  81200. 228
  81201. 5
  81202. 4
  81203. 2
  81204. 0
  81205. 0
  81206. 0
  81207. 0
  81208. 2
  81209. 1
  81210. #386
  81211. north
  81212.  
  81213. 0
  81214. 228
  81215. -1
  81216. -1
  81217. -1
  81218. 7
  81219. -1
  81220. 388
  81221. 0
  81222. 0
  81223. 13
  81224. 5
  81225. 228
  81226. 5
  81227. 1
  81228. 384
  81229. 228
  81230. 5
  81231. 1
  81232. 381
  81233. 228
  81234. 5
  81235. 5
  81236. 228
  81237. 5
  81238. 5
  81239. 228
  81240. 5
  81241. 5
  81242. 228
  81243. 5
  81244. 5
  81245. 228
  81246. 5
  81247. 5
  81248. 228
  81249. 5
  81250. 5
  81251. 228
  81252. 5
  81253. 0
  81254. 0
  81255. 228
  81256. 4
  81257. 4
  81258. 2
  81259. 2
  81260. north
  81261. 2
  81262. n
  81263. 228
  81264. 5
  81265. 5
  81266. 228
  81267. 5
  81268. 4
  81269. 2
  81270. 0
  81271. 0
  81272. 0
  81273. 0
  81274. 2
  81275. 1
  81276. #387
  81277. hallway turn
  81278.  
  81279. 0
  81280. 228
  81281. -1
  81282. -1
  81283. -1
  81284. 3
  81285. -1
  81286. 390
  81287. 0
  81288. 0
  81289. 17
  81290. 5
  81291. 228
  81292. 5
  81293. 5
  81294. 228
  81295. 5
  81296. 5
  81297. 228
  81298. 5
  81299. 5
  81300. 228
  81301. 5
  81302. 5
  81303. 228
  81304. 5
  81305. 5
  81306. 228
  81307. 5
  81308. 5
  81309. 228
  81310. 5
  81311. 4
  81312. 5
  81313. 1
  81314. 388
  81315. 1
  81316. 392
  81317. 1
  81318. 395
  81319. 1
  81320. 398
  81321. 1
  81322. 401
  81323. 228
  81324. 4
  81325. 1
  81326. -1
  81327. 228
  81328. 5
  81329. 0
  81330. 2168
  81331. 228
  81332. 5
  81333. 4
  81334. 5
  81335. 1
  81336. 389
  81337. 1
  81338. 391
  81339. 1
  81340. 394
  81341. 1
  81342. 397
  81343. 1
  81344. 400
  81345. 228
  81346. 4
  81347. 5
  81348. 228
  81349. 5
  81350. 5
  81351. 228
  81352. 5
  81353. 0
  81354. 0
  81355. 228
  81356. 4
  81357. 4
  81358. 1
  81359. 2
  81360. hallway turn
  81361. 228
  81362. 5
  81363. 2
  81364. You are at the southern end of a hallway, which turns here to lead west. There is an office door to the east, and openings to the southwest and southeast.
  81365. 228
  81366. 5
  81367. 4
  81368. 2
  81369. 0
  81370. 0
  81371. 0
  81372. 0
  81373. 2
  81374. 1
  81375. #388
  81376. south
  81377.  
  81378. 0
  81379. 228
  81380. -1
  81381. -1
  81382. -1
  81383. 7
  81384. -1
  81385. 389
  81386. 0
  81387. 0
  81388. 13
  81389. 5
  81390. 228
  81391. 5
  81392. 1
  81393. 384
  81394. 228
  81395. 5
  81396. 1
  81397. 387
  81398. 228
  81399. 5
  81400. 5
  81401. 228
  81402. 5
  81403. 5
  81404. 228
  81405. 5
  81406. 5
  81407. 228
  81408. 5
  81409. 5
  81410. 228
  81411. 5
  81412. 5
  81413. 228
  81414. 5
  81415. 5
  81416. 228
  81417. 5
  81418. 0
  81419. 0
  81420. 228
  81421. 4
  81422. 4
  81423. 2
  81424. 2
  81425. south
  81426. 2
  81427. s
  81428. 228
  81429. 5
  81430. 5
  81431. 228
  81432. 5
  81433. 4
  81434. 2
  81435. 0
  81436. 0
  81437. 0
  81438. 0
  81439. 2
  81440. 1
  81441. #389
  81442. north
  81443.  
  81444. 0
  81445. 228
  81446. -1
  81447. -1
  81448. -1
  81449. 7
  81450. -1
  81451. 391
  81452. 0
  81453. 0
  81454. 13
  81455. 5
  81456. 228
  81457. 5
  81458. 1
  81459. 387
  81460. 228
  81461. 5
  81462. 1
  81463. 384
  81464. 228
  81465. 5
  81466. 5
  81467. 228
  81468. 5
  81469. 5
  81470. 228
  81471. 5
  81472. 5
  81473. 228
  81474. 5
  81475. 5
  81476. 228
  81477. 5
  81478. 5
  81479. 228
  81480. 5
  81481. 5
  81482. 228
  81483. 5
  81484. 0
  81485. 0
  81486. 228
  81487. 4
  81488. 4
  81489. 2
  81490. 2
  81491. north
  81492. 2
  81493. n
  81494. 228
  81495. 5
  81496. 5
  81497. 228
  81498. 5
  81499. 4
  81500. 2
  81501. 0
  81502. 0
  81503. 0
  81504. 0
  81505. 2
  81506. 1
  81507. #390
  81508. MF's Office
  81509.  
  81510. 0
  81511. 228
  81512. -1
  81513. -1
  81514. -1
  81515. 3
  81516. -1
  81517. 393
  81518. 0
  81519. 0
  81520. 17
  81521. 5
  81522. 228
  81523. 5
  81524. 5
  81525. 228
  81526. 5
  81527. 5
  81528. 228
  81529. 5
  81530. 5
  81531. 228
  81532. 5
  81533. 5
  81534. 228
  81535. 5
  81536. 5
  81537. 228
  81538. 5
  81539. 5
  81540. 228
  81541. 5
  81542. 4
  81543. 1
  81544. 1
  81545. 391
  81546. 228
  81547. 4
  81548. 1
  81549. -1
  81550. 228
  81551. 5
  81552. 0
  81553. 27082
  81554. 228
  81555. 5
  81556. 4
  81557. 1
  81558. 1
  81559. 392
  81560. 228
  81561. 4
  81562. 5
  81563. 228
  81564. 5
  81565. 5
  81566. 228
  81567. 5
  81568. 0
  81569. 0
  81570. 228
  81571. 4
  81572. 4
  81573. 1
  81574. 2
  81575. MF's Office
  81576. 228
  81577. 5
  81578. 5
  81579. 228
  81580. 5
  81581. 4
  81582. 2
  81583. 0
  81584. 0
  81585. 0
  81586. 0
  81587. 2
  81588. 1
  81589. #391
  81590. east
  81591.  
  81592. 0
  81593. 228
  81594. -1
  81595. -1
  81596. -1
  81597. 7
  81598. -1
  81599. 392
  81600. 0
  81601. 0
  81602. 13
  81603. 5
  81604. 228
  81605. 5
  81606. 1
  81607. 387
  81608. 228
  81609. 5
  81610. 1
  81611. 390
  81612. 228
  81613. 5
  81614. 5
  81615. 228
  81616. 5
  81617. 5
  81618. 228
  81619. 5
  81620. 5
  81621. 228
  81622. 5
  81623. 5
  81624. 228
  81625. 5
  81626. 5
  81627. 228
  81628. 5
  81629. 5
  81630. 228
  81631. 5
  81632. 0
  81633. 0
  81634. 228
  81635. 4
  81636. 4
  81637. 2
  81638. 2
  81639. east
  81640. 2
  81641. e
  81642. 228
  81643. 5
  81644. 5
  81645. 228
  81646. 5
  81647. 4
  81648. 2
  81649. 0
  81650. 0
  81651. 0
  81652. 0
  81653. 2
  81654. 1
  81655. #392
  81656. west
  81657.  
  81658. 0
  81659. 228
  81660. -1
  81661. -1
  81662. -1
  81663. 7
  81664. -1
  81665. 394
  81666. 0
  81667. 0
  81668. 13
  81669. 5
  81670. 228
  81671. 5
  81672. 1
  81673. 390
  81674. 228
  81675. 5
  81676. 1
  81677. 387
  81678. 228
  81679. 5
  81680. 5
  81681. 228
  81682. 5
  81683. 5
  81684. 228
  81685. 5
  81686. 5
  81687. 228
  81688. 5
  81689. 5
  81690. 228
  81691. 5
  81692. 5
  81693. 228
  81694. 5
  81695. 5
  81696. 228
  81697. 5
  81698. 0
  81699. 0
  81700. 228
  81701. 4
  81702. 4
  81703. 3
  81704. 2
  81705. west
  81706. 2
  81707. w
  81708. 2
  81709. out
  81710. 228
  81711. 5
  81712. 5
  81713. 228
  81714. 5
  81715. 4
  81716. 2
  81717. 0
  81718. 0
  81719. 0
  81720. 0
  81721. 2
  81722. 1
  81723. #393
  81724. Trygve's Cube
  81725.  
  81726. 0
  81727. 228
  81728. -1
  81729. 427
  81730. -1
  81731. 3
  81732. -1
  81733. 396
  81734. 0
  81735. 0
  81736. 17
  81737. 5
  81738. 228
  81739. 5
  81740. 5
  81741. 228
  81742. 5
  81743. 5
  81744. 228
  81745. 5
  81746. 5
  81747. 228
  81748. 5
  81749. 5
  81750. 228
  81751. 5
  81752. 5
  81753. 228
  81754. 5
  81755. 5
  81756. 228
  81757. 5
  81758. 4
  81759. 1
  81760. 1
  81761. 394
  81762. 228
  81763. 4
  81764. 1
  81765. -1
  81766. 228
  81767. 5
  81768. 0
  81769. 21153
  81770. 228
  81771. 5
  81772. 4
  81773. 1
  81774. 1
  81775. 395
  81776. 228
  81777. 4
  81778. 5
  81779. 228
  81780. 5
  81781. 5
  81782. 228
  81783. 5
  81784. 0
  81785. 0
  81786. 228
  81787. 4
  81788. 4
  81789. 1
  81790. 2
  81791. Trygve's Cube
  81792. 228
  81793. 5
  81794. 2
  81795. You are in Trygve's cube. There is an exit to the northwest.
  81796. 228
  81797. 5
  81798. 4
  81799. 2
  81800. 0
  81801. 0
  81802. 0
  81803. 0
  81804. 2
  81805. 1
  81806. #394
  81807. southeast
  81808.  
  81809. 0
  81810. 228
  81811. -1
  81812. -1
  81813. -1
  81814. 7
  81815. -1
  81816. 395
  81817. 0
  81818. 0
  81819. 13
  81820. 5
  81821. 228
  81822. 5
  81823. 1
  81824. 387
  81825. 228
  81826. 5
  81827. 1
  81828. 393
  81829. 228
  81830. 5
  81831. 5
  81832. 228
  81833. 5
  81834. 5
  81835. 228
  81836. 5
  81837. 5
  81838. 228
  81839. 5
  81840. 5
  81841. 228
  81842. 5
  81843. 5
  81844. 228
  81845. 5
  81846. 5
  81847. 228
  81848. 5
  81849. 0
  81850. 0
  81851. 228
  81852. 4
  81853. 4
  81854. 2
  81855. 2
  81856. southeast
  81857. 2
  81858. se
  81859. 228
  81860. 5
  81861. 5
  81862. 228
  81863. 5
  81864. 4
  81865. 2
  81866. 0
  81867. 0
  81868. 0
  81869. 0
  81870. 2
  81871. 1
  81872. #395
  81873. northwest
  81874.  
  81875. 0
  81876. 228
  81877. -1
  81878. -1
  81879. -1
  81880. 7
  81881. -1
  81882. 397
  81883. 0
  81884. 0
  81885. 13
  81886. 5
  81887. 228
  81888. 5
  81889. 1
  81890. 393
  81891. 228
  81892. 5
  81893. 1
  81894. 387
  81895. 228
  81896. 5
  81897. 5
  81898. 228
  81899. 5
  81900. 5
  81901. 228
  81902. 5
  81903. 5
  81904. 228
  81905. 5
  81906. 5
  81907. 228
  81908. 5
  81909. 5
  81910. 228
  81911. 5
  81912. 5
  81913. 228
  81914. 5
  81915. 0
  81916. 0
  81917. 228
  81918. 4
  81919. 4
  81920. 3
  81921. 2
  81922. northwest
  81923. 2
  81924. nw
  81925. 2
  81926. out
  81927. 228
  81928. 5
  81929. 5
  81930. 228
  81931. 5
  81932. 4
  81933. 2
  81934. 0
  81935. 0
  81936. 0
  81937. 0
  81938. 2
  81939. 1
  81940. #396
  81941. Bob's old cube
  81942.  
  81943. 0
  81944. 228
  81945. -1
  81946. -1
  81947. -1
  81948. 3
  81949. -1
  81950. 399
  81951. 0
  81952. 0
  81953. 17
  81954. 5
  81955. 228
  81956. 5
  81957. 5
  81958. 228
  81959. 5
  81960. 5
  81961. 228
  81962. 5
  81963. 5
  81964. 228
  81965. 5
  81966. 5
  81967. 228
  81968. 5
  81969. 5
  81970. 228
  81971. 5
  81972. 5
  81973. 228
  81974. 5
  81975. 4
  81976. 1
  81977. 1
  81978. 397
  81979. 228
  81980. 4
  81981. 5
  81982. 228
  81983. 5
  81984. 5
  81985. 228
  81986. 5
  81987. 4
  81988. 1
  81989. 1
  81990. 398
  81991. 228
  81992. 4
  81993. 5
  81994. 228
  81995. 5
  81996. 5
  81997. 228
  81998. 5
  81999. 0
  82000. 0
  82001. 228
  82002. 4
  82003. 4
  82004. 1
  82005. 2
  82006. Bob's old cube
  82007. 228
  82008. 5
  82009. 5
  82010. 228
  82011. 5
  82012. 4
  82013. 2
  82014. 0
  82015. 0
  82016. 0
  82017. 0
  82018. 2
  82019. 1
  82020. #397
  82021. southwest
  82022.  
  82023. 0
  82024. 228
  82025. -1
  82026. -1
  82027. -1
  82028. 7
  82029. -1
  82030. 398
  82031. 0
  82032. 0
  82033. 13
  82034. 5
  82035. 228
  82036. 5
  82037. 1
  82038. 387
  82039. 228
  82040. 5
  82041. 1
  82042. 396
  82043. 228
  82044. 5
  82045. 5
  82046. 228
  82047. 5
  82048. 5
  82049. 228
  82050. 5
  82051. 5
  82052. 228
  82053. 5
  82054. 5
  82055. 228
  82056. 5
  82057. 5
  82058. 228
  82059. 5
  82060. 5
  82061. 228
  82062. 5
  82063. 0
  82064. 0
  82065. 228
  82066. 4
  82067. 4
  82068. 2
  82069. 2
  82070. southwest
  82071. 2
  82072. sw
  82073. 228
  82074. 5
  82075. 5
  82076. 228
  82077. 5
  82078. 4
  82079. 2
  82080. 0
  82081. 0
  82082. 0
  82083. 0
  82084. 2
  82085. 1
  82086. #398
  82087. northeast
  82088.  
  82089. 0
  82090. 228
  82091. -1
  82092. -1
  82093. -1
  82094. 7
  82095. -1
  82096. 400
  82097. 0
  82098. 0
  82099. 13
  82100. 5
  82101. 228
  82102. 5
  82103. 1
  82104. 396
  82105. 228
  82106. 5
  82107. 1
  82108. 387
  82109. 228
  82110. 5
  82111. 5
  82112. 228
  82113. 5
  82114. 5
  82115. 228
  82116. 5
  82117. 5
  82118. 228
  82119. 5
  82120. 5
  82121. 228
  82122. 5
  82123. 5
  82124. 228
  82125. 5
  82126. 5
  82127. 228
  82128. 5
  82129. 0
  82130. 0
  82131. 228
  82132. 4
  82133. 4
  82134. 3
  82135. 2
  82136. northeast
  82137. 2
  82138. ne
  82139. 2
  82140. out
  82141. 228
  82142. 5
  82143. 5
  82144. 228
  82145. 5
  82146. 4
  82147. 2
  82148. 0
  82149. 0
  82150. 0
  82151. 0
  82152. 2
  82153. 1
  82154. #399
  82155. hallway near Kai's Cube
  82156.  
  82157. 0
  82158. 228
  82159. -1
  82160. -1
  82161. -1
  82162. 3
  82163. -1
  82164. 402
  82165. 0
  82166. 0
  82167. 17
  82168. 5
  82169. 228
  82170. 5
  82171. 5
  82172. 228
  82173. 5
  82174. 5
  82175. 228
  82176. 5
  82177. 5
  82178. 228
  82179. 5
  82180. 5
  82181. 228
  82182. 5
  82183. 5
  82184. 228
  82185. 5
  82186. 5
  82187. 228
  82188. 5
  82189. 4
  82190. 3
  82191. 1
  82192. 400
  82193. 1
  82194. 404
  82195. 1
  82196. 407
  82197. 228
  82198. 4
  82199. 1
  82200. -1
  82201. 228
  82202. 5
  82203. 0
  82204. 1201
  82205. 228
  82206. 5
  82207. 4
  82208. 3
  82209. 1
  82210. 401
  82211. 1
  82212. 403
  82213. 1
  82214. 406
  82215. 228
  82216. 4
  82217. 5
  82218. 228
  82219. 5
  82220. 5
  82221. 228
  82222. 5
  82223. 0
  82224. 0
  82225. 228
  82226. 4
  82227. 4
  82228. 1
  82229. 2
  82230. hallway near Kai's Cube
  82231. 228
  82232. 5
  82233. 2
  82234. You are in an east-west hallway. There is an opening to the north.
  82235. 228
  82236. 5
  82237. 4
  82238. 2
  82239. 0
  82240. 0
  82241. 0
  82242. 0
  82243. 2
  82244. 1
  82245. #400
  82246. west
  82247.  
  82248. 0
  82249. 228
  82250. -1
  82251. -1
  82252. -1
  82253. 7
  82254. -1
  82255. 401
  82256. 0
  82257. 0
  82258. 13
  82259. 5
  82260. 228
  82261. 5
  82262. 1
  82263. 387
  82264. 228
  82265. 5
  82266. 1
  82267. 399
  82268. 228
  82269. 5
  82270. 5
  82271. 228
  82272. 5
  82273. 5
  82274. 228
  82275. 5
  82276. 5
  82277. 228
  82278. 5
  82279. 5
  82280. 228
  82281. 5
  82282. 5
  82283. 228
  82284. 5
  82285. 5
  82286. 228
  82287. 5
  82288. 0
  82289. 0
  82290. 228
  82291. 4
  82292. 4
  82293. 2
  82294. 2
  82295. west
  82296. 2
  82297. w
  82298. 228
  82299. 5
  82300. 5
  82301. 228
  82302. 5
  82303. 4
  82304. 2
  82305. 0
  82306. 0
  82307. 0
  82308. 0
  82309. 2
  82310. 1
  82311. #401
  82312. east
  82313.  
  82314. 0
  82315. 228
  82316. -1
  82317. -1
  82318. -1
  82319. 7
  82320. -1
  82321. 403
  82322. 0
  82323. 0
  82324. 13
  82325. 5
  82326. 228
  82327. 5
  82328. 1
  82329. 399
  82330. 228
  82331. 5
  82332. 1
  82333. 387
  82334. 228
  82335. 5
  82336. 5
  82337. 228
  82338. 5
  82339. 5
  82340. 228
  82341. 5
  82342. 5
  82343. 228
  82344. 5
  82345. 5
  82346. 228
  82347. 5
  82348. 5
  82349. 228
  82350. 5
  82351. 5
  82352. 228
  82353. 5
  82354. 0
  82355. 0
  82356. 228
  82357. 4
  82358. 4
  82359. 2
  82360. 2
  82361. east
  82362. 2
  82363. e
  82364. 228
  82365. 5
  82366. 5
  82367. 228
  82368. 5
  82369. 4
  82370. 2
  82371. 0
  82372. 0
  82373. 0
  82374. 0
  82375. 2
  82376. 1
  82377. #402
  82378. Kai's Cube
  82379.  
  82380. 0
  82381. 228
  82382. -1
  82383. -1
  82384. -1
  82385. 3
  82386. -1
  82387. 405
  82388. 0
  82389. 0
  82390. 17
  82391. 5
  82392. 228
  82393. 5
  82394. 5
  82395. 228
  82396. 5
  82397. 5
  82398. 228
  82399. 5
  82400. 5
  82401. 228
  82402. 5
  82403. 5
  82404. 228
  82405. 5
  82406. 5
  82407. 228
  82408. 5
  82409. 5
  82410. 228
  82411. 5
  82412. 4
  82413. 1
  82414. 1
  82415. 403
  82416. 228
  82417. 4
  82418. 5
  82419. 228
  82420. 5
  82421. 5
  82422. 228
  82423. 5
  82424. 4
  82425. 1
  82426. 1
  82427. 404
  82428. 228
  82429. 4
  82430. 5
  82431. 228
  82432. 5
  82433. 5
  82434. 228
  82435. 5
  82436. 0
  82437. 0
  82438. 228
  82439. 4
  82440. 4
  82441. 1
  82442. 2
  82443. Kai's Cube
  82444. 228
  82445. 5
  82446. 5
  82447. 228
  82448. 5
  82449. 4
  82450. 2
  82451. 0
  82452. 0
  82453. 0
  82454. 0
  82455. 2
  82456. 1
  82457. #403
  82458. north
  82459.  
  82460. 0
  82461. 228
  82462. -1
  82463. -1
  82464. -1
  82465. 7
  82466. -1
  82467. 404
  82468. 0
  82469. 0
  82470. 13
  82471. 5
  82472. 228
  82473. 5
  82474. 1
  82475. 399
  82476. 228
  82477. 5
  82478. 1
  82479. 402
  82480. 228
  82481. 5
  82482. 5
  82483. 228
  82484. 5
  82485. 5
  82486. 228
  82487. 5
  82488. 5
  82489. 228
  82490. 5
  82491. 5
  82492. 228
  82493. 5
  82494. 5
  82495. 228
  82496. 5
  82497. 5
  82498. 228
  82499. 5
  82500. 0
  82501. 0
  82502. 228
  82503. 4
  82504. 4
  82505. 2
  82506. 2
  82507. north
  82508. 2
  82509. n
  82510. 228
  82511. 5
  82512. 5
  82513. 228
  82514. 5
  82515. 4
  82516. 2
  82517. 0
  82518. 0
  82519. 0
  82520. 0
  82521. 2
  82522. 1
  82523. #404
  82524. south
  82525.  
  82526. 0
  82527. 228
  82528. -1
  82529. -1
  82530. -1
  82531. 7
  82532. -1
  82533. 406
  82534. 0
  82535. 0
  82536. 13
  82537. 5
  82538. 228
  82539. 5
  82540. 1
  82541. 402
  82542. 228
  82543. 5
  82544. 1
  82545. 399
  82546. 228
  82547. 5
  82548. 5
  82549. 228
  82550. 5
  82551. 5
  82552. 228
  82553. 5
  82554. 5
  82555. 228
  82556. 5
  82557. 5
  82558. 228
  82559. 5
  82560. 5
  82561. 228
  82562. 5
  82563. 5
  82564. 228
  82565. 5
  82566. 0
  82567. 0
  82568. 228
  82569. 4
  82570. 4
  82571. 3
  82572. 2
  82573. south
  82574. 2
  82575. s
  82576. 2
  82577. out
  82578. 228
  82579. 5
  82580. 5
  82581. 228
  82582. 5
  82583. 4
  82584. 2
  82585. 0
  82586. 0
  82587. 0
  82588. 0
  82589. 2
  82590. 1
  82591. #405
  82592. hallway near Leslie's Cube
  82593.  
  82594. 0
  82595. 228
  82596. -1
  82597. -1
  82598. -1
  82599. 3
  82600. -1
  82601. 408
  82602. 0
  82603. 0
  82604. 17
  82605. 5
  82606. 228
  82607. 5
  82608. 5
  82609. 228
  82610. 5
  82611. 5
  82612. 228
  82613. 5
  82614. 5
  82615. 228
  82616. 5
  82617. 5
  82618. 228
  82619. 5
  82620. 5
  82621. 228
  82622. 5
  82623. 5
  82624. 228
  82625. 5
  82626. 4
  82627. 4
  82628. 1
  82629. 406
  82630. 1
  82631. 410
  82632. 1
  82633. 413
  82634. 1
  82635. 416
  82636. 228
  82637. 4
  82638. 1
  82639. -1
  82640. 228
  82641. 5
  82642. 0
  82643. 12898
  82644. 228
  82645. 5
  82646. 4
  82647. 4
  82648. 1
  82649. 407
  82650. 1
  82651. 409
  82652. 1
  82653. 412
  82654. 1
  82655. 415
  82656. 228
  82657. 4
  82658. 5
  82659. 228
  82660. 5
  82661. 5
  82662. 228
  82663. 5
  82664. 0
  82665. 0
  82666. 228
  82667. 4
  82668. 4
  82669. 1
  82670. 2
  82671. hallway near Leslie's Cube
  82672. 228
  82673. 5
  82674. 2
  82675. You are in an east-west hallway. There are exits leading north and south.
  82676. 228
  82677. 5
  82678. 4
  82679. 2
  82680. 0
  82681. 0
  82682. 0
  82683. 0
  82684. 2
  82685. 1
  82686. #406
  82687. west
  82688.  
  82689. 0
  82690. 228
  82691. -1
  82692. -1
  82693. -1
  82694. 7
  82695. -1
  82696. 407
  82697. 0
  82698. 0
  82699. 13
  82700. 5
  82701. 228
  82702. 5
  82703. 1
  82704. 399
  82705. 228
  82706. 5
  82707. 1
  82708. 405
  82709. 228
  82710. 5
  82711. 5
  82712. 228
  82713. 5
  82714. 5
  82715. 228
  82716. 5
  82717. 5
  82718. 228
  82719. 5
  82720. 5
  82721. 228
  82722. 5
  82723. 5
  82724. 228
  82725. 5
  82726. 5
  82727. 228
  82728. 5
  82729. 0
  82730. 0
  82731. 228
  82732. 4
  82733. 4
  82734. 2
  82735. 2
  82736. west
  82737. 2
  82738. w
  82739. 228
  82740. 5
  82741. 5
  82742. 228
  82743. 5
  82744. 4
  82745. 2
  82746. 0
  82747. 0
  82748. 0
  82749. 0
  82750. 2
  82751. 1
  82752. #407
  82753. east
  82754.  
  82755. 0
  82756. 228
  82757. -1
  82758. -1
  82759. -1
  82760. 7
  82761. -1
  82762. 409
  82763. 0
  82764. 0
  82765. 13
  82766. 5
  82767. 228
  82768. 5
  82769. 1
  82770. 405
  82771. 228
  82772. 5
  82773. 1
  82774. 399
  82775. 228
  82776. 5
  82777. 5
  82778. 228
  82779. 5
  82780. 5
  82781. 228
  82782. 5
  82783. 5
  82784. 228
  82785. 5
  82786. 5
  82787. 228
  82788. 5
  82789. 5
  82790. 228
  82791. 5
  82792. 5
  82793. 228
  82794. 5
  82795. 0
  82796. 0
  82797. 228
  82798. 4
  82799. 4
  82800. 2
  82801. 2
  82802. east
  82803. 2
  82804. e
  82805. 228
  82806. 5
  82807. 5
  82808. 228
  82809. 5
  82810. 4
  82811. 2
  82812. 0
  82813. 0
  82814. 0
  82815. 0
  82816. 2
  82817. 1
  82818. #408
  82819. Leslie Trybull's Cube
  82820.  
  82821. 0
  82822. 228
  82823. -1
  82824. -1
  82825. -1
  82826. 3
  82827. -1
  82828. 411
  82829. 0
  82830. 0
  82831. 17
  82832. 5
  82833. 228
  82834. 5
  82835. 5
  82836. 228
  82837. 5
  82838. 5
  82839. 228
  82840. 5
  82841. 5
  82842. 228
  82843. 5
  82844. 5
  82845. 228
  82846. 5
  82847. 5
  82848. 228
  82849. 5
  82850. 5
  82851. 228
  82852. 5
  82853. 4
  82854. 1
  82855. 1
  82856. 409
  82857. 228
  82858. 4
  82859. 5
  82860. 228
  82861. 5
  82862. 5
  82863. 228
  82864. 5
  82865. 4
  82866. 1
  82867. 1
  82868. 410
  82869. 228
  82870. 4
  82871. 5
  82872. 228
  82873. 5
  82874. 5
  82875. 228
  82876. 5
  82877. 0
  82878. 0
  82879. 228
  82880. 4
  82881. 4
  82882. 1
  82883. 2
  82884. Leslie Trybull's Cube
  82885. 228
  82886. 5
  82887. 5
  82888. 228
  82889. 5
  82890. 4
  82891. 2
  82892. 0
  82893. 0
  82894. 0
  82895. 0
  82896. 2
  82897. 1
  82898. #409
  82899. south
  82900.  
  82901. 0
  82902. 228
  82903. -1
  82904. -1
  82905. -1
  82906. 7
  82907. -1
  82908. 410
  82909. 0
  82910. 0
  82911. 13
  82912. 5
  82913. 228
  82914. 5
  82915. 1
  82916. 405
  82917. 228
  82918. 5
  82919. 1
  82920. 408
  82921. 228
  82922. 5
  82923. 5
  82924. 228
  82925. 5
  82926. 5
  82927. 228
  82928. 5
  82929. 5
  82930. 228
  82931. 5
  82932. 5
  82933. 228
  82934. 5
  82935. 5
  82936. 228
  82937. 5
  82938. 5
  82939. 228
  82940. 5
  82941. 0
  82942. 0
  82943. 228
  82944. 4
  82945. 4
  82946. 2
  82947. 2
  82948. south
  82949. 2
  82950. s
  82951. 228
  82952. 5
  82953. 5
  82954. 228
  82955. 5
  82956. 4
  82957. 2
  82958. 0
  82959. 0
  82960. 0
  82961. 0
  82962. 2
  82963. 1
  82964. #410
  82965. north
  82966.  
  82967. 0
  82968. 228
  82969. -1
  82970. -1
  82971. -1
  82972. 7
  82973. -1
  82974. 412
  82975. 0
  82976. 0
  82977. 13
  82978. 5
  82979. 228
  82980. 5
  82981. 1
  82982. 408
  82983. 228
  82984. 5
  82985. 1
  82986. 405
  82987. 228
  82988. 5
  82989. 5
  82990. 228
  82991. 5
  82992. 5
  82993. 228
  82994. 5
  82995. 5
  82996. 228
  82997. 5
  82998. 5
  82999. 228
  83000. 5
  83001. 5
  83002. 228
  83003. 5
  83004. 5
  83005. 228
  83006. 5
  83007. 0
  83008. 0
  83009. 228
  83010. 4
  83011. 4
  83012. 3
  83013. 2
  83014. north
  83015. 2
  83016. n
  83017. 2
  83018. out
  83019. 228
  83020. 5
  83021. 5
  83022. 228
  83023. 5
  83024. 4
  83025. 2
  83026. 0
  83027. 0
  83028. 0
  83029. 0
  83030. 2
  83031. 1
  83032. #411
  83033. Paul's Cube
  83034.  
  83035. 0
  83036. 228
  83037. -1
  83038. -1
  83039. -1
  83040. 3
  83041. -1
  83042. 414
  83043. 0
  83044. 0
  83045. 17
  83046. 5
  83047. 228
  83048. 5
  83049. 5
  83050. 228
  83051. 5
  83052. 5
  83053. 228
  83054. 5
  83055. 5
  83056. 228
  83057. 5
  83058. 5
  83059. 228
  83060. 5
  83061. 5
  83062. 228
  83063. 5
  83064. 5
  83065. 228
  83066. 5
  83067. 4
  83068. 1
  83069. 1
  83070. 412
  83071. 228
  83072. 4
  83073. 5
  83074. 228
  83075. 5
  83076. 5
  83077. 228
  83078. 5
  83079. 4
  83080. 1
  83081. 1
  83082. 413
  83083. 228
  83084. 4
  83085. 5
  83086. 228
  83087. 5
  83088. 5
  83089. 228
  83090. 5
  83091. 0
  83092. 0
  83093. 228
  83094. 4
  83095. 4
  83096. 1
  83097. 2
  83098. Paul's Cube
  83099. 228
  83100. 5
  83101. 5
  83102. 228
  83103. 5
  83104. 4
  83105. 2
  83106. 0
  83107. 0
  83108. 0
  83109. 0
  83110. 2
  83111. 1
  83112. #412
  83113. north
  83114.  
  83115. 0
  83116. 228
  83117. -1
  83118. -1
  83119. -1
  83120. 7
  83121. -1
  83122. 413
  83123. 0
  83124. 0
  83125. 13
  83126. 5
  83127. 228
  83128. 5
  83129. 1
  83130. 405
  83131. 228
  83132. 5
  83133. 1
  83134. 411
  83135. 228
  83136. 5
  83137. 5
  83138. 228
  83139. 5
  83140. 5
  83141. 228
  83142. 5
  83143. 5
  83144. 228
  83145. 5
  83146. 5
  83147. 228
  83148. 5
  83149. 5
  83150. 228
  83151. 5
  83152. 5
  83153. 228
  83154. 5
  83155. 0
  83156. 0
  83157. 228
  83158. 4
  83159. 4
  83160. 2
  83161. 2
  83162. north
  83163. 2
  83164. n
  83165. 228
  83166. 5
  83167. 5
  83168. 228
  83169. 5
  83170. 4
  83171. 2
  83172. 0
  83173. 0
  83174. 0
  83175. 0
  83176. 2
  83177. 1
  83178. #413
  83179. south
  83180.  
  83181. 0
  83182. 228
  83183. -1
  83184. -1
  83185. -1
  83186. 7
  83187. -1
  83188. 415
  83189. 0
  83190. 0
  83191. 13
  83192. 5
  83193. 228
  83194. 5
  83195. 1
  83196. 411
  83197. 228
  83198. 5
  83199. 1
  83200. 405
  83201. 228
  83202. 5
  83203. 5
  83204. 228
  83205. 5
  83206. 5
  83207. 228
  83208. 5
  83209. 5
  83210. 228
  83211. 5
  83212. 5
  83213. 228
  83214. 5
  83215. 5
  83216. 228
  83217. 5
  83218. 5
  83219. 228
  83220. 5
  83221. 0
  83222. 0
  83223. 228
  83224. 4
  83225. 4
  83226. 3
  83227. 2
  83228. south
  83229. 2
  83230. s
  83231. 2
  83232. out
  83233. 228
  83234. 5
  83235. 5
  83236. 228
  83237. 5
  83238. 4
  83239. 2
  83240. 0
  83241. 0
  83242. 0
  83243. 0
  83244. 2
  83245. 1
  83246. #414
  83247. hallway near Susan B's Office
  83248.  
  83249. 0
  83250. 228
  83251. -1
  83252. -1
  83253. -1
  83254. 3
  83255. -1
  83256. 417
  83257. 0
  83258. 0
  83259. 17
  83260. 5
  83261. 228
  83262. 5
  83263. 5
  83264. 228
  83265. 5
  83266. 5
  83267. 228
  83268. 5
  83269. 5
  83270. 228
  83271. 5
  83272. 5
  83273. 228
  83274. 5
  83275. 5
  83276. 228
  83277. 5
  83278. 5
  83279. 228
  83280. 5
  83281. 4
  83282. 3
  83283. 1
  83284. 415
  83285. 1
  83286. 419
  83287. 1
  83288. 421
  83289. 228
  83290. 4
  83291. 1
  83292. -1
  83293. 228
  83294. 5
  83295. 0
  83296. 14400
  83297. 228
  83298. 5
  83299. 4
  83300. 3
  83301. 1
  83302. 416
  83303. 1
  83304. 418
  83305. 1
  83306. 420
  83307. 228
  83308. 4
  83309. 5
  83310. 228
  83311. 5
  83312. 5
  83313. 228
  83314. 5
  83315. 0
  83316. 0
  83317. 228
  83318. 4
  83319. 4
  83320. 1
  83321. 2
  83322. hallway near Susan B's Office
  83323. 228
  83324. 5
  83325. 2
  83326. You are at the south end of a long north-south hallway. There is an office to the south, and another hallway leading east.
  83327. 228
  83328. 5
  83329. 4
  83330. 2
  83331. 0
  83332. 0
  83333. 0
  83334. 0
  83335. 2
  83336. 1
  83337. #415
  83338. west
  83339.  
  83340. 0
  83341. 228
  83342. -1
  83343. -1
  83344. -1
  83345. 7
  83346. -1
  83347. 416
  83348. 0
  83349. 0
  83350. 13
  83351. 5
  83352. 228
  83353. 5
  83354. 1
  83355. 405
  83356. 228
  83357. 5
  83358. 1
  83359. 414
  83360. 228
  83361. 5
  83362. 5
  83363. 228
  83364. 5
  83365. 5
  83366. 228
  83367. 5
  83368. 5
  83369. 228
  83370. 5
  83371. 5
  83372. 228
  83373. 5
  83374. 5
  83375. 228
  83376. 5
  83377. 5
  83378. 228
  83379. 5
  83380. 0
  83381. 0
  83382. 228
  83383. 4
  83384. 4
  83385. 2
  83386. 2
  83387. west
  83388. 2
  83389. w
  83390. 228
  83391. 5
  83392. 5
  83393. 228
  83394. 5
  83395. 4
  83396. 2
  83397. 0
  83398. 0
  83399. 0
  83400. 0
  83401. 2
  83402. 1
  83403. #416
  83404. east
  83405.  
  83406. 0
  83407. 228
  83408. -1
  83409. -1
  83410. -1
  83411. 7
  83412. -1
  83413. 418
  83414. 0
  83415. 0
  83416. 13
  83417. 5
  83418. 228
  83419. 5
  83420. 1
  83421. 414
  83422. 228
  83423. 5
  83424. 1
  83425. 405
  83426. 228
  83427. 5
  83428. 5
  83429. 228
  83430. 5
  83431. 5
  83432. 228
  83433. 5
  83434. 5
  83435. 228
  83436. 5
  83437. 5
  83438. 228
  83439. 5
  83440. 5
  83441. 228
  83442. 5
  83443. 5
  83444. 228
  83445. 5
  83446. 0
  83447. 0
  83448. 228
  83449. 4
  83450. 4
  83451. 2
  83452. 2
  83453. east
  83454. 2
  83455. e
  83456. 228
  83457. 5
  83458. 5
  83459. 228
  83460. 5
  83461. 4
  83462. 2
  83463. 0
  83464. 0
  83465. 0
  83466. 0
  83467. 2
  83468. 1
  83469. #417
  83470. Susan's Office
  83471.  
  83472. 0
  83473. 228
  83474. -1
  83475. -1
  83476. -1
  83477. 3
  83478. -1
  83479. -1
  83480. 0
  83481. 0
  83482. 17
  83483. 5
  83484. 228
  83485. 5
  83486. 5
  83487. 228
  83488. 5
  83489. 5
  83490. 228
  83491. 5
  83492. 5
  83493. 228
  83494. 5
  83495. 5
  83496. 228
  83497. 5
  83498. 5
  83499. 228
  83500. 5
  83501. 5
  83502. 228
  83503. 5
  83504. 4
  83505. 1
  83506. 1
  83507. 418
  83508. 228
  83509. 4
  83510. 1
  83511. -1
  83512. 228
  83513. 5
  83514. 0
  83515. 32455
  83516. 228
  83517. 5
  83518. 4
  83519. 1
  83520. 1
  83521. 419
  83522. 228
  83523. 4
  83524. 5
  83525. 228
  83526. 5
  83527. 5
  83528. 228
  83529. 5
  83530. 0
  83531. 0
  83532. 228
  83533. 4
  83534. 4
  83535. 1
  83536. 2
  83537. Susan's Office
  83538. 228
  83539. 5
  83540. 5
  83541. 228
  83542. 5
  83543. 4
  83544. 2
  83545. 0
  83546. 0
  83547. 0
  83548. 0
  83549. 2
  83550. 1
  83551. #418
  83552. south
  83553.  
  83554. 0
  83555. 228
  83556. -1
  83557. -1
  83558. -1
  83559. 7
  83560. -1
  83561. 419
  83562. 0
  83563. 0
  83564. 13
  83565. 5
  83566. 228
  83567. 5
  83568. 1
  83569. 414
  83570. 228
  83571. 5
  83572. 1
  83573. 417
  83574. 228
  83575. 5
  83576. 5
  83577. 228
  83578. 5
  83579. 5
  83580. 228
  83581. 5
  83582. 5
  83583. 228
  83584. 5
  83585. 5
  83586. 228
  83587. 5
  83588. 5
  83589. 228
  83590. 5
  83591. 5
  83592. 228
  83593. 5
  83594. 0
  83595. 0
  83596. 228
  83597. 4
  83598. 4
  83599. 2
  83600. 2
  83601. south
  83602. 2
  83603. s
  83604. 228
  83605. 5
  83606. 5
  83607. 228
  83608. 5
  83609. 4
  83610. 2
  83611. 0
  83612. 0
  83613. 0
  83614. 0
  83615. 2
  83616. 1
  83617. #419
  83618. north
  83619.  
  83620. 0
  83621. 228
  83622. -1
  83623. -1
  83624. -1
  83625. 7
  83626. -1
  83627. 420
  83628. 0
  83629. 0
  83630. 13
  83631. 5
  83632. 228
  83633. 5
  83634. 1
  83635. 417
  83636. 228
  83637. 5
  83638. 1
  83639. 414
  83640. 228
  83641. 5
  83642. 5
  83643. 228
  83644. 5
  83645. 5
  83646. 228
  83647. 5
  83648. 5
  83649. 228
  83650. 5
  83651. 5
  83652. 228
  83653. 5
  83654. 5
  83655. 228
  83656. 5
  83657. 5
  83658. 228
  83659. 5
  83660. 0
  83661. 0
  83662. 228
  83663. 4
  83664. 4
  83665. 3
  83666. 2
  83667. north
  83668. 2
  83669. n
  83670. 2
  83671. out
  83672. 228
  83673. 5
  83674. 5
  83675. 228
  83676. 5
  83677. 4
  83678. 2
  83679. 0
  83680. 0
  83681. 0
  83682. 0
  83683. 2
  83684. 1
  83685. #420
  83686. north
  83687.  
  83688. 0
  83689. 228
  83690. -1
  83691. -1
  83692. -1
  83693. 7
  83694. -1
  83695. 421
  83696. 0
  83697. 0
  83698. 13
  83699. 5
  83700. 228
  83701. 5
  83702. 1
  83703. 414
  83704. 228
  83705. 5
  83706. 1
  83707. 335
  83708. 228
  83709. 5
  83710. 5
  83711. 228
  83712. 5
  83713. 5
  83714. 228
  83715. 5
  83716. 5
  83717. 228
  83718. 5
  83719. 5
  83720. 228
  83721. 5
  83722. 5
  83723. 228
  83724. 5
  83725. 5
  83726. 228
  83727. 5
  83728. 0
  83729. 0
  83730. 228
  83731. 4
  83732. 4
  83733. 2
  83734. 2
  83735. north
  83736. 2
  83737. n
  83738. 228
  83739. 5
  83740. 5
  83741. 228
  83742. 5
  83743. 4
  83744. 2
  83745. 0
  83746. 0
  83747. 0
  83748. 0
  83749. 2
  83750. 1
  83751. #421
  83752. south
  83753.  
  83754. 0
  83755. 228
  83756. -1
  83757. -1
  83758. -1
  83759. 7
  83760. -1
  83761. -1
  83762. 0
  83763. 0
  83764. 13
  83765. 5
  83766. 228
  83767. 5
  83768. 1
  83769. 335
  83770. 228
  83771. 5
  83772. 1
  83773. 414
  83774. 228
  83775. 5
  83776. 5
  83777. 228
  83778. 5
  83779. 5
  83780. 228
  83781. 5
  83782. 5
  83783. 228
  83784. 5
  83785. 5
  83786. 228
  83787. 5
  83788. 5
  83789. 228
  83790. 5
  83791. 5
  83792. 228
  83793. 5
  83794. 0
  83795. 0
  83796. 228
  83797. 4
  83798. 4
  83799. 2
  83800. 2
  83801. south
  83802. 2
  83803. s
  83804. 228
  83805. 5
  83806. 5
  83807. 228
  83808. 5
  83809. 4
  83810. 2
  83811. 0
  83812. 0
  83813. 0
  83814. 0
  83815. 2
  83816. 1
  83817. #422
  83818. some junk
  83819.  
  83820. 0
  83821. 228
  83822. 369
  83823. -1
  83824. -1
  83825. 5
  83826. -1
  83827. 428
  83828. 1
  83829. t*ake g*et
  83830. 228
  83831. 41
  83832. -1
  83833. 0
  83834. 12
  83835. 5
  83836. 228
  83837. 5
  83838. 5
  83839. 228
  83840. 5
  83841. 5
  83842. 228
  83843. 5
  83844. 5
  83845. 228
  83846. 5
  83847. 5
  83848. 228
  83849. 5
  83850. 5
  83851. 228
  83852. 5
  83853. 5
  83854. 228
  83855. 5
  83856. 5
  83857. 228
  83858. 5
  83859. 0
  83860. 0
  83861. 228
  83862. 4
  83863. 4
  83864. 2
  83865. 2
  83866. some junk
  83867. 2
  83868. junk
  83869. 228
  83870. 5
  83871. 2
  83872. Lots of old, useless binders, 400K diskettes, and out of date manuals.
  83873. 228
  83874. 5
  83875. 4
  83876. 2
  83877. 0
  83878. 0
  83879. 0
  83880. 0
  83881. 2
  83882. 1
  83883. #423
  83884. Mary Felice
  83885.  
  83886. 0
  83887. 2
  83888. 426
  83889. -1
  83890. 424
  83891. 352
  83892. -1
  83893. 424
  83894. 4
  83895. Do_I_Like_It_Here
  83896. 2
  83897. 173
  83898. -1
  83899. do_something_here
  83900. 2
  83901. 173
  83902. -1
  83903. tell_contents
  83904. 2
  83905. 173
  83906. -1
  83907. look_self
  83908. 2
  83909. 173
  83910. -1
  83911. 1
  83912. ticks
  83913. 40
  83914. 0
  83915. 5
  83916. 2
  83917. 5
  83918. 0
  83919. 0
  83920. 2
  83921. 5
  83922. 5
  83923. 2
  83924. 5
  83925. 5
  83926. 2
  83927. 5
  83928. 1
  83929. 134
  83930. 2
  83931. 5
  83932. 4
  83933. 0
  83934. 2
  83935. 5
  83936. 5
  83937. 2
  83938. 5
  83939. 0
  83940. 10
  83941. 2
  83942. 5
  83943. 5
  83944. 2
  83945. 5
  83946. 5
  83947. 2
  83948. 5
  83949. 5
  83950. 2
  83951. 5
  83952. 5
  83953. 2
  83954. 5
  83955. 5
  83956. 2
  83957. 5
  83958. 5
  83959. 2
  83960. 5
  83961. 5
  83962. 2
  83963. 5
  83964. 0
  83965. 2
  83966. 2
  83967. 1
  83968. 0
  83969. 1
  83970. 2
  83971. 1
  83972. 5
  83973. 2
  83974. 5
  83975. 5
  83976. 2
  83977. 5
  83978. 5
  83979. 2
  83980. 5
  83981. 5
  83982. 2
  83983. 5
  83984. 5
  83985. 2
  83986. 5
  83987. 5
  83988. 2
  83989. 5
  83990. 5
  83991. 2
  83992. 5
  83993. 5
  83994. 2
  83995. 5
  83996. 5
  83997. 2
  83998. 5
  83999. 5
  84000. 2
  84001. 1
  84002. 5
  84003. 2
  84004. 4
  84005. 5
  84006. 2
  84007. 5
  84008. 5
  84009. 2
  84010. 5
  84011. 5
  84012. 2
  84013. 5
  84014. 5
  84015. 2
  84016. 5
  84017. 5
  84018. 2
  84019. 5
  84020. 5
  84021. 2
  84022. 5
  84023. 5
  84024. 2
  84025. 5
  84026. 5
  84027. 2
  84028. 5
  84029. 0
  84030. 0
  84031. 2
  84032. 4
  84033. 4
  84034. 2
  84035. 2
  84036. Mary Felice
  84037. 2
  84038. mf
  84039. 2
  84040. 5
  84041. 2
  84042. Mary Felice Crowe
  84043. 2
  84044. 5
  84045. 4
  84046. 2
  84047. 0
  84048. 0
  84049. 0
  84050. 0
  84051. 2
  84052. 1
  84053. #424
  84054. John Roberts
  84055.  
  84056. 0
  84057. 2
  84058. 426
  84059. -1
  84060. 353
  84061. 352
  84062. -1
  84063. -1
  84064. 2
  84065. do_i_like_it_here
  84066. 2
  84067. 173
  84068. -1
  84069. do_something_here
  84070. 2
  84071. 173
  84072. -1
  84073. 0
  84074. 39
  84075. 0
  84076. 0
  84077. 2
  84078. 5
  84079. 5
  84080. 2
  84081. 5
  84082. 5
  84083. 2
  84084. 5
  84085. 1
  84086. 100
  84087. 2
  84088. 5
  84089. 4
  84090. 0
  84091. 2
  84092. 5
  84093. 5
  84094. 2
  84095. 5
  84096. 0
  84097. 1
  84098. 2
  84099. 5
  84100. 5
  84101. 2
  84102. 5
  84103. 5
  84104. 2
  84105. 5
  84106. 5
  84107. 2
  84108. 5
  84109. 5
  84110. 2
  84111. 5
  84112. 5
  84113. 2
  84114. 5
  84115. 5
  84116. 2
  84117. 5
  84118. 5
  84119. 2
  84120. 5
  84121. 5
  84122. 2
  84123. 1
  84124. 5
  84125. 2
  84126. 1
  84127. 5
  84128. 2
  84129. 5
  84130. 5
  84131. 2
  84132. 5
  84133. 5
  84134. 2
  84135. 5
  84136. 5
  84137. 2
  84138. 5
  84139. 5
  84140. 2
  84141. 5
  84142. 5
  84143. 2
  84144. 5
  84145. 5
  84146. 2
  84147. 5
  84148. 5
  84149. 2
  84150. 5
  84151. 5
  84152. 2
  84153. 5
  84154. 5
  84155. 2
  84156. 1
  84157. 5
  84158. 2
  84159. 4
  84160. 5
  84161. 2
  84162. 5
  84163. 5
  84164. 2
  84165. 5
  84166. 5
  84167. 2
  84168. 5
  84169. 5
  84170. 2
  84171. 5
  84172. 5
  84173. 2
  84174. 5
  84175. 5
  84176. 2
  84177. 5
  84178. 5
  84179. 2
  84180. 5
  84181. 5
  84182. 2
  84183. 5
  84184. 0
  84185. 0
  84186. 2
  84187. 4
  84188. 4
  84189. 3
  84190. 2
  84191. John Roberts
  84192. 2
  84193. JR
  84194. 2
  84195. john
  84196. 2
  84197. 5
  84198. 5
  84199. 2
  84200. 5
  84201. 4
  84202. 2
  84203. 0
  84204. 0
  84205. 0
  84206. 0
  84207. 2
  84208. 1
  84209. #425 recycled
  84210. #426
  84211. bob's cabinet
  84212.  
  84213. 0
  84214. 2
  84215. 82
  84216. 423
  84217. 428
  84218. 8
  84219. -1
  84220. -1
  84221. 0
  84222. 0
  84223. 31
  84224. 5
  84225. 2
  84226. 5
  84227. 5
  84228. 2
  84229. 5
  84230. 5
  84231. 2
  84232. 5
  84233. 5
  84234. 2
  84235. 5
  84236. 5
  84237. 2
  84238. 5
  84239. 5
  84240. 2
  84241. 5
  84242. 5
  84243. 2
  84244. 1
  84245. 0
  84246. 0
  84247. 2
  84248. 1
  84249. 5
  84250. 2
  84251. 5
  84252. 5
  84253. 2
  84254. 5
  84255. 5
  84256. 2
  84257. 5
  84258. 5
  84259. 2
  84260. 5
  84261. 5
  84262. 2
  84263. 5
  84264. 5
  84265. 2
  84266. 5
  84267. 5
  84268. 2
  84269. 5
  84270. 5
  84271. 2
  84272. 5
  84273. 5
  84274. 2
  84275. 5
  84276. 0
  84277. 1
  84278. 2
  84279. 1
  84280. 1
  84281. 2
  84282. 2
  84283. 4
  84284. 5
  84285. 2
  84286. 5
  84287. 5
  84288. 2
  84289. 5
  84290. 5
  84291. 2
  84292. 5
  84293. 5
  84294. 2
  84295. 5
  84296. 5
  84297. 2
  84298. 5
  84299. 5
  84300. 2
  84301. 5
  84302. 5
  84303. 2
  84304. 5
  84305. 5
  84306. 2
  84307. 5
  84308. 1
  84309. 2
  84310. 2
  84311. 4
  84312. 4
  84313. 2
  84314. 2
  84315. bob's cabinet
  84316. 2
  84317. cabinet
  84318. 2
  84319. 5
  84320. 2
  84321. You see a bland beige cabinet. It has a lock, which you probably don't have the key for.
  84322. 2
  84323. 5
  84324. 4
  84325. 2
  84326. 0
  84327. 0
  84328. 0
  84329. 0
  84330. 2
  84331. 1
  84332. #427
  84333. Trygve's Newton
  84334.  
  84335. 0
  84336. 2
  84337. 393
  84338. -1
  84339. -1
  84340. 328
  84341. -1
  84342. -1
  84343. 0
  84344. 0
  84345. 12
  84346. 5
  84347. 2
  84348. 5
  84349. 5
  84350. 2
  84351. 5
  84352. 5
  84353. 2
  84354. 5
  84355. 5
  84356. 2
  84357. 5
  84358. 5
  84359. 2
  84360. 5
  84361. 5
  84362. 2
  84363. 5
  84364. 5
  84365. 2
  84366. 5
  84367. 5
  84368. 2
  84369. 5
  84370. 0
  84371. 0
  84372. 2
  84373. 4
  84374. 4
  84375. 2
  84376. 2
  84377. Trygve's Newton
  84378. 2
  84379. newton
  84380. 2
  84381. 5
  84382. 5
  84383. 2
  84384. 5
  84385. 4
  84386. 2
  84387. 0
  84388. 0
  84389. 0
  84390. 0
  84391. 2
  84392. 1
  84393. #428
  84394. a window
  84395.  
  84396. 0
  84397. 2
  84398. 82
  84399. -1
  84400. 2
  84401. 5
  84402. -1
  84403. 433
  84404. 1
  84405. look_self
  84406. 2
  84407. 172
  84408. -1
  84409. 0
  84410. 12
  84411. 5
  84412. 2
  84413. 5
  84414. 5
  84415. 2
  84416. 5
  84417. 5
  84418. 2
  84419. 5
  84420. 5
  84421. 2
  84422. 5
  84423. 5
  84424. 2
  84425. 5
  84426. 5
  84427. 2
  84428. 5
  84429. 5
  84430. 2
  84431. 5
  84432. 5
  84433. 2
  84434. 5
  84435. 1
  84436. 2
  84437. 2
  84438. 4
  84439. 4
  84440. 5
  84441. 2
  84442. a window
  84443. 2
  84444. the window
  84445. 2
  84446. through window
  84447. 2
  84448. out window
  84449. 2
  84450. window
  84451. 2
  84452. 5
  84453. 5
  84454. 2
  84455. 5
  84456. 4
  84457. 2
  84458. 0
  84459. 0
  84460. 0
  84461. 0
  84462. 2
  84463. 1
  84464. #429
  84465. Chocolate Eclair
  84466.  
  84467. 0
  84468. 2
  84469. 318
  84470. -1
  84471. 430
  84472. 319
  84473. -1
  84474. 430
  84475. 0
  84476. 0
  84477. 12
  84478. 5
  84479. 2
  84480. 5
  84481. 5
  84482. 2
  84483. 5
  84484. 5
  84485. 2
  84486. 5
  84487. 5
  84488. 2
  84489. 5
  84490. 5
  84491. 2
  84492. 5
  84493. 5
  84494. 2
  84495. 5
  84496. 5
  84497. 2
  84498. 5
  84499. 5
  84500. 2
  84501. 5
  84502. 0
  84503. 0
  84504. 2
  84505. 4
  84506. 4
  84507. 2
  84508. 2
  84509. Chocolate Eclair
  84510. 2
  84511. eclair
  84512. 2
  84513. 5
  84514. 5
  84515. 2
  84516. 5
  84517. 4
  84518. 2
  84519. 0
  84520. 0
  84521. 0
  84522. 0
  84523. 2
  84524. 1
  84525. #430
  84526. Jelly Doughnut
  84527.  
  84528. 0
  84529. 2
  84530. 318
  84531. -1
  84532. 431
  84533. 319
  84534. -1
  84535. 431
  84536. 0
  84537. 0
  84538. 12
  84539. 5
  84540. 2
  84541. 5
  84542. 5
  84543. 2
  84544. 5
  84545. 5
  84546. 2
  84547. 5
  84548. 5
  84549. 2
  84550. 5
  84551. 5
  84552. 2
  84553. 5
  84554. 5
  84555. 2
  84556. 5
  84557. 5
  84558. 2
  84559. 5
  84560. 5
  84561. 2
  84562. 5
  84563. 0
  84564. 0
  84565. 2
  84566. 4
  84567. 4
  84568. 1
  84569. 2
  84570. Jelly Doughnut
  84571. 2
  84572. 5
  84573. 5
  84574. 2
  84575. 5
  84576. 4
  84577. 2
  84578. 0
  84579. 0
  84580. 0
  84581. 0
  84582. 2
  84583. 1
  84584. #431
  84585. Half eaten dog biscuit
  84586.  
  84587. 0
  84588. 2
  84589. 318
  84590. -1
  84591. -1
  84592. 319
  84593. -1
  84594. -1
  84595. 0
  84596. 0
  84597. 12
  84598. 5
  84599. 2
  84600. 5
  84601. 5
  84602. 2
  84603. 5
  84604. 5
  84605. 2
  84606. 5
  84607. 5
  84608. 2
  84609. 5
  84610. 5
  84611. 2
  84612. 5
  84613. 5
  84614. 2
  84615. 5
  84616. 5
  84617. 2
  84618. 5
  84619. 5
  84620. 2
  84621. 5
  84622. 0
  84623. 0
  84624. 2
  84625. 4
  84626. 4
  84627. 1
  84628. 2
  84629. Half eaten dog biscuit
  84630. 2
  84631. 5
  84632. 5
  84633. 2
  84634. 5
  84635. 4
  84636. 2
  84637. 0
  84638. 0
  84639. 0
  84640. 0
  84641. 2
  84642. 1
  84643. #432 recycled
  84644. #433
  84645. devil
  84646.  
  84647. 0
  84648. 147
  84649. 168
  84650. -1
  84651. -1
  84652. 5
  84653. -1
  84654. 130
  84655. 0
  84656. 0
  84657. 12
  84658. 5
  84659. 147
  84660. 5
  84661. 5
  84662. 147
  84663. 5
  84664. 5
  84665. 147
  84666. 5
  84667. 5
  84668. 147
  84669. 5
  84670. 5
  84671. 147
  84672. 5
  84673. 5
  84674. 147
  84675. 5
  84676. 5
  84677. 147
  84678. 5
  84679. 2
  84680. The devil's eyes glow red.  You feel a burning sensation throughout your body.  Maybe it is not a good idea to take the devil?
  84681. 147
  84682. 5
  84683. 1
  84684. 147
  84685. 147
  84686. 4
  84687. 4
  84688. 3
  84689. 2
  84690. devil
  84691. 2
  84692. the devil
  84693. 2
  84694. satan
  84695. 147
  84696. 5
  84697. 2
  84698. A horned creature, who appears to be smoking...
  84699. 147
  84700. 5
  84701. 4
  84702. 2
  84703. 0
  84704. 0
  84705. 0
  84706. 0
  84707. 2
  84708. 1
  84709. #0:0
  84710. "...This code should only be run as a server task...";
  84711. if (callers())
  84712. return E_PERM;
  84713. elseif (player in $login.ignored)
  84714. boot_player(player);
  84715. $login.ignored = setremove($login.ignored, player);
  84716. return 0;
  84717. elseif (player in $network.open_connections)
  84718. if (i = $list_utils:iassoc(player, $network.connect_connections_to))
  84719. what = $network.connect_connections_to[i][2];
  84720. $network.connect_connections_to = listdelete($network.connect_connections_to, i);
  84721. "Since we are logging it in, the origial invalid doesn't mean anything anymore.";
  84722. $network.open_connections = setremove($network.open_connections, player);
  84723. return what;
  84724. else
  84725. $login.ignored = {@$login.ignored, player};
  84726. $network.open_connections = setremove($network.open_connections, player);
  84727. return 0;
  84728. endif
  84729. elseif ($login:redlisted($string_utils:connection_hostname(connection_name(player))))
  84730. boot_player(player);
  84731. return 0;
  84732. endif
  84733. args = $login:parse_command(@args);
  84734. return $login:(args[1])(@listdelete(args, 1));
  84735. .
  84736. #0:1
  84737. callers() || ($last_restart_time = time());
  84738. .
  84739. #0:2
  84740. saved = {#0};
  84741. for p in (properties(#0))
  84742. v = #0.(p);
  84743. if ((typeof(v) == OBJ) && valid(v))
  84744. saved = setadd(saved, v);
  84745. endif
  84746. endfor
  84747. for o in (saved)
  84748. p = parent(o);
  84749. while (valid(p))
  84750. saved = setadd(saved, p);
  84751. p = parent(p);
  84752. endwhile
  84753. endfor
  84754. return $list_utils:sort(saved);
  84755. .
  84756. #0:3
  84757. if (caller_perms().wizard)
  84758. pass();
  84759. if ("server_started" in verbs(this))
  84760. code = {"callers() || ($last_restart_time = time());"};
  84761. set_verb_code(this, "server_started", code);
  84762. endif
  84763. $shutdown_message = "";
  84764. $shutdown_time = 0;
  84765. $dump_interval = 3600;
  84766. $gripe_recipients = {player};
  84767. $class_registry = {{"generics", "Generic objects intended for use as the parents of new objects", {$room, $exit, $thing, $note, $letter, $container, $root_class, $player, $prog, $wiz, $generic_editor, $mail_recipient, $mail_agent}}, {"utilities", "Objects holding useful general-purpose verbs", {$string_utils, $gender_utils, $trig_utils, $time_utils, $match_utils, $object_utils, $lock_utils, $list_utils, $command_utils, $code_utils, $perm_utils, $building_utils}}};
  84768. endif
  84769. .
  84770. #0:4
  84771. user = args[1];
  84772. fork (0)
  84773. user:confunc();
  84774. endfork
  84775. user.location:confunc(user);
  84776. .
  84777. #0:5
  84778. user = args[1];
  84779. fork (0)
  84780. user.location:disfunc(user);
  84781. endfork
  84782. user:disfunc();
  84783. .
  84784. #1:0
  84785. if (typeof(this.owner.owned_objects) == LIST)
  84786. this.owner.owned_objects = setadd(this.owner.owned_objects, this);
  84787. endif
  84788. if ((caller == this) || $perm_utils:controls(caller_perms(), this))
  84789. this.object_size = {0, 0};
  84790. this.key = 0;
  84791. else
  84792. return E_PERM;
  84793. endif
  84794. .
  84795. #1:1
  84796. if ((caller == this) || $perm_utils:controls(caller_perms(), this))
  84797. if (typeof(this.owner.owned_objects) == LIST)
  84798. this.owner.owned_objects = setremove(this.owner.owned_objects, this);
  84799. endif
  84800. else
  84801. return E_PERM;
  84802. endif
  84803. .
  84804. #1:2
  84805. "set_name(newname) attempts to change this.name to newname";
  84806. "  => E_PERM   if you don't own this or aren't its parent, or are a player trying to do an end-run around $player_db...";
  84807. if ((!caller_perms().wizard) && (is_player(this) || ((caller_perms() != this.owner) && (this != caller))))
  84808. return E_PERM;
  84809. else
  84810. return (typeof(e = (this.name = args[1])) != ERR) || e;
  84811. endif
  84812. .
  84813. #1:3
  84814. return this.name;
  84815. .
  84816. #1:4
  84817. return $object_utils:has_property(this, "namec") ? this.namec | $string_utils:capitalize(this:title());
  84818. .
  84819. #1:5
  84820. "set_aliases(alias_list) attempts to change this.aliases to alias_list";
  84821. "  => E_PERM   if you don't own this or aren't its parent";
  84822. "  => E_TYPE   if alias_list is not a list";
  84823. "  => E_INVARG if any element of alias_list is not a string";
  84824. if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
  84825. return E_PERM;
  84826. elseif (typeof(aliases = args[1]) != LIST)
  84827. return E_TYPE;
  84828. else
  84829. for s in (aliases)
  84830. if (typeof(s) != STR)
  84831. return E_INVARG;
  84832. endif
  84833. endfor
  84834. this.aliases = aliases;
  84835. return 1;
  84836. endif
  84837. .
  84838. #1:6
  84839. c = this:contents();
  84840. return $string_utils:match(args[1], c, "name", c, "aliases");
  84841. .
  84842. #1:7
  84843. ":match_object(string [,who])";
  84844. args[2..1] = {this};
  84845. return $string_utils:match_object(@args);
  84846. .
  84847. #1:8
  84848. "set_description(newdesc) attempts to change this.description to newdesc";
  84849. "  => E_PERM   if you don't own this or aren't its parent";
  84850. if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
  84851. return E_PERM;
  84852. elseif (typeof(desc = args[1]) in {LIST, STR})
  84853. this.description = desc;
  84854. return 1;
  84855. else
  84856. return E_TYPE;
  84857. endif
  84858. .
  84859. #1:9
  84860. return this.description;
  84861. .
  84862. #1:10
  84863. desc = this:description();
  84864. if (desc)
  84865. player:tell_lines(desc);
  84866. else
  84867. player:tell("You see nothing special.");
  84868. endif
  84869. .
  84870. #1:11
  84871. player:tell("The examine command has been renamed to @examine.  Please use @examine.");
  84872. .
  84873. #1:12
  84874. if (is_player(this))
  84875. notify(this, args[1]);
  84876. endif
  84877. .
  84878. #1:13
  84879. this:notify(tostr(@args));
  84880. .
  84881. #1:14
  84882. lines = args[1];
  84883. if (typeof(lines) == LIST)
  84884. for line in (lines)
  84885. this:tell(line);
  84886. endfor
  84887. else
  84888. this:tell(lines);
  84889. endif
  84890. .
  84891. #1:15
  84892. return 0;
  84893. .
  84894. #1:16
  84895. set_task_perms(this.owner);
  84896. return move(this, args[1]);
  84897. .
  84898. #1:17
  84899. "eject(victim) --- usable by the owner of this to remove victim from this.contents.  victim goes to its home if different from here, or $nothing or $player_start according as victim is a player.";
  84900. "eject_basic(victim) --- victim goes to $nothing or $player_start according as victim is a player; victim:moveto is not called.";
  84901. what = args[1];
  84902. nice = (verb != "eject_basic");
  84903. perms = caller_perms();
  84904. if ((!perms.wizard) && (perms != this.owner))
  84905. return E_PERM;
  84906. elseif ((!(what in this.contents)) || what.wizard)
  84907. return 0;
  84908. endif
  84909. if (nice && ($object_utils:has_property(what, "home") && ((typeof(what.home) == OBJ) && ((what.home != this) && (is_player(what) ? what.home:accept_for_abode(what) | what.home:accept(what))))))
  84910. where = what.home;
  84911. else
  84912. where = (is_player(what) ? $player_start | $nothing);
  84913. endif
  84914. if (nice)
  84915. fork (0)
  84916. "...Some objects like to know they've been moved...";
  84917. "... this is the best we can do.  Remember :moveto() may be broken.";
  84918. what:moveto(where);
  84919. endfork
  84920. endif
  84921. return move(what, where);
  84922. .
  84923. #1:18
  84924. return (this.key == 0) || $lock_utils:eval_key(this.key, args[1]);
  84925. .
  84926. #1:19
  84927. set_task_perms(valid(caller_perms()) ? caller_perms() | player);
  84928. $command_utils:do_huh(verb, args);
  84929. .
  84930. #1:20
  84931. ":set_message(msg_name,new_value)";
  84932. "Does the actual dirty work of @<msg_name> object is <new_value>";
  84933. "changing the raw value of the message msg_name to be new_value.";
  84934. "Both msg_name and new_value should be strings, though their interpretation is up to the object itself.";
  84935. " => error value (use E_PROPNF if msg_name isn't recognized)";
  84936. " => string error message if something else goes wrong.";
  84937. " => 1 (true non-string) if the message is successfully set";
  84938. " => 0 (false non-error) if the message is successfully `cleared'";
  84939. if (!((caller == this) || $perm_utils:controls(caller_perms(), this)))
  84940. return E_PERM;
  84941. else
  84942. return (this.(args[1] + "_msg") = args[2]) && 1;
  84943. endif
  84944. .
  84945. #1:21
  84946. "do_examine(examiner)";
  84947. "the guts of examine";
  84948. "call a series of verbs and report their return values to the player";
  84949. who = args[1];
  84950. "if (caller == this || caller == who)";
  84951. if (caller == who)
  84952. "set_task_perms();";
  84953. who:notify_lines(this:examine_names(who) || {});
  84954. "this:examine_names(who);";
  84955. who:notify_lines(this:examine_owner(who) || {});
  84956. "this:examine_owner(who);";
  84957. who:notify_lines(this:examine_desc(who) || {});
  84958. "this:examine_desc(who);";
  84959. who:notify_lines(this:examine_key(who) || {});
  84960. "this:examine_key(who);";
  84961. who:notify_lines(this:examine_contents(who) || {});
  84962. who:notify_lines(this:examine_verbs(who) || {});
  84963. else
  84964. return E_PERM;
  84965. endif
  84966. .
  84967. #1:22
  84968. "examine_key(examiner)";
  84969. "return a list of strings to be told to the player, indicating what the key on this type of object means, and what this object's key is set to.";
  84970. "the default will only tell the key to a wizard or this object's owner.";
  84971. who = args[1];
  84972. if (((caller == this) && $perm_utils:controls(who, this)) && (this.key != 0))
  84973. return {tostr("Key:  ", $lock_utils:unparse_key(this.key))};
  84974. "who:notify(tostr(\"Key:  \", $lock_utils:unparse_key(this.key)));";
  84975. endif
  84976. .
  84977. #1:23
  84978. "examine_names(examiner)";
  84979. "Return a list of strings to be told to the player, indicating the name and aliases (and, by default, the object number) of this.";
  84980. return {tostr(this.name, " (aka ", $string_utils:english_list({tostr(this), @this.aliases}), ")")};
  84981. .
  84982. #1:24
  84983. "examine_desc(who) - return the description, probably";
  84984. "who is the player examining";
  84985. "this should probably go away";
  84986. desc = this:description();
  84987. if (desc)
  84988. if (typeof(desc) != LIST)
  84989. desc = {desc};
  84990. endif
  84991. return desc;
  84992. else
  84993. return {"(No description set.)"};
  84994. endif
  84995. .
  84996. #1:25
  84997. "examine_contents(examiner)";
  84998. "by default, calls :tell_contents.";
  84999. "Should probably go away.";
  85000. who = args[1];
  85001. "if (caller == this && $object_utils:has_verb(this, \"tell_contents\"))";
  85002. if (caller == this)
  85003. this:tell_contents(this.contents, this.ctype);
  85004. endif
  85005. .
  85006. #1:26
  85007. "Return a list of strings to be told to the player.  Standard format says \"Obvious verbs:\" followed by a series of lines explaining syntax for each usable verb.";
  85008. if (caller != this)
  85009. return E_PERM;
  85010. endif
  85011. who = args[1];
  85012. name = dobjstr;
  85013. vrbs = {};
  85014. commands_ok = this:examine_commands_ok(who);
  85015. dull_classes = {$root_class, $room, $player, $prog, $builder};
  85016. what = this;
  85017. hidden_verbs = this:hidden_verbs(who);
  85018. while (what != $nothing)
  85019. $command_utils:suspend_if_needed(0);
  85020. if (!(what in dull_classes))
  85021. for i in [0..length(verbs(what)) - 1]
  85022. $command_utils:suspend_if_needed(0);
  85023. info = verb_info(what, tostr(i));
  85024. syntax = verb_args(what, tostr(i));
  85025. if (this:examine_verb_ok(what, i, info, syntax, commands_ok, hidden_verbs))
  85026. dobj = syntax[1];
  85027. prep = syntax[2];
  85028. iobj = syntax[3];
  85029. if (syntax == {"any", "any", "any"})
  85030. prep = "none";
  85031. endif
  85032. if (prep != "none")
  85033. for x in ($string_utils:explode(prep, "/"))
  85034. if (length(x) <= length(prep))
  85035. prep = x;
  85036. endif
  85037. endfor
  85038. endif
  85039. "This is the correct way to handle verbs ending in *";
  85040. vname = info[3];
  85041. while (i = index(vname, "* "))
  85042. vname = tostr(vname[1..i - 1], "<anything>", vname[i + 1..length(vname)]);
  85043. endwhile
  85044. if (vname[i = length(vname)] == "*")
  85045. vname = (vname[1..i - 1] + "<anything>");
  85046. endif
  85047. vname = strsub(vname, " ", "/");
  85048. rest = "";
  85049. if (prep != "none")
  85050. rest = (" " + ((prep == "any") ? "<anything>" | prep));
  85051. if (iobj != "none")
  85052. rest = tostr(rest, " ", (iobj == "this") ? name | "<anything>");
  85053. endif
  85054. endif
  85055. if (dobj != "none")
  85056. rest = tostr(" ", (dobj == "this") ? name | "<anything>", rest);
  85057. endif
  85058. vrbs = setadd(vrbs, ("  " + vname) + rest);
  85059. endif
  85060. endfor
  85061. endif
  85062. what = parent(what);
  85063. endwhile
  85064. if ($code_utils:verb_or_property(this, "help_msg"))
  85065. vrbs = {@vrbs, tostr("  help ", dobjstr)};
  85066. endif
  85067. return vrbs && {"Obvious verbs:", @vrbs};
  85068. .
  85069. #1:27
  85070. "EXPERIMENTAL -- this may disappear tomorrow.";
  85071. ":get_message(msg_name)";
  85072. "=> error (use E_PROPNF if msg_name isn't recognized)";
  85073. "=> string or list-of-strings raw value";
  85074. "=> {2, @(list of {msg_name_n,rawvalue_n} pairs to give to :set_message)}";
  85075. "=> {1, other kind of raw value}";
  85076. "=> {E_NONE, error message} ";
  85077. if (!((caller == this) || $perm_utils:controls(caller_perms(), this)))
  85078. return E_PERM;
  85079. elseif (((t = typeof(msg = this.(msgname = (args[1] + "_msg")))) in {ERR, STR}) || ((t == LIST) && (typeof(msg[1]) == STR)))
  85080. return msg;
  85081. else
  85082. return {1, msg};
  85083. endif
  85084. .
  85085. #1:28
  85086. this.location:(verb)(@args);
  85087. .
  85088. #1:29
  85089. if (caller_perms().wizard)
  85090. vnum = 0;
  85091. while (vnum <= (length(verbs(this)) - 1))
  85092. $command_utils:suspend_if_needed(0);
  85093. info = verb_info(this, tostr(vnum))[3];
  85094. if (index(info, "(old)"))
  85095. delete_verb(this, tostr(vnum));
  85096. else
  85097. vnum = (vnum + 1);
  85098. endif
  85099. endwhile
  85100. endif
  85101. .
  85102. #1:30
  85103. "Returns a list of the objects that are apparently inside this one.  Don't confuse this with .contents, which is a property kept consistent with .location by the server.  This verb should be used in `VR' situations, for instance when looking in a room, and does not necessarily have anything to do with the value of .contents (although the default implementation does).  `Non-VR' commands (like @contents) should look directly at .contents.";
  85104. return this.contents;
  85105. .
  85106. #1:31
  85107. "examine_verb_ok(loc, index, info, syntax, commands_ok, hidden_verbs)";
  85108. "loc is the object that defines the verb; index is which verb on the object; info is verb_info; syntax is verb_args; commands_ok is determined by this:commands_ok, probably, but passed in so we don't have to calculate it for each verb.";
  85109. "hidden_verbs is passed in for the same reasons.  It should be a list, each of whose entries is either a string with the full verb name to be hidden (e.g., \"d*rop th*row\") or a list of the form {verb location, full verb name, args}.";
  85110. if ((caller == this) || $perm_utils:controls(caller_perms(), this))
  85111. loc = args[1];
  85112. info = args[3];
  85113. vname = info[3];
  85114. syntax = args[4];
  85115. hidden_verbs = args[6];
  85116. return (((((syntax[2..3] != {"none", "this"}) && (!index(vname, "("))) && (args[5] || ("this" in syntax))) && verb_code(loc, tostr(args[2]))) && (!(vname in hidden_verbs))) && (!({loc, vname, syntax} in hidden_verbs));
  85117. else
  85118. return E_PERM;
  85119. endif
  85120. .
  85121. #1:32
  85122. "return 1 if the object can hear a :tell, or cares. Useful for active objects that want to stop when nothing is listening.";
  85123. return 0;
  85124. .
  85125. #1:33
  85126. "hidden_verbs(who)";
  85127. "returns a list of verbs on this that should be hidden from examine";
  85128. "the player who's examining is passed in, so objects can hide verbs from specific players";
  85129. "verbs are returned as {location, full_verb_name, args} or just full_verb_name.  full_verb name is what shows up in verb_info(object, verb)[2], for example \"d*op th*row\".";
  85130. if ((caller == this) || $perm_utils:controls(caller_perms(), this))
  85131. hidden = {};
  85132. what = this;
  85133. while (what != $nothing)
  85134. for i in [0..length(verbs(what)) - 1]
  85135. info = verb_info(what, tostr(i));
  85136. if (!index(info[2], "r"))
  85137. hidden = setadd(hidden, {what, info[3], verb_args(what, tostr(i))});
  85138. endif
  85139. endfor
  85140. what = parent(what);
  85141. endwhile
  85142. return hidden;
  85143. else
  85144. return E_PERM;
  85145. endif
  85146. .
  85147. #1:34
  85148. "examine_owner(examiner)";
  85149. "Return a list of strings to be told to the player, indicating who owns this.";
  85150. return {tostr("Owned by ", this.owner.name, ".")};
  85151. .
  85152. #1:35
  85153. return;
  85154. .
  85155. #2:0
  85156. iobj.password = crypt(iobj.name);
  85157. .
  85158. #3:0
  85159. this:look_self(player.brief);
  85160. this:announce(player.name, " has connected.");
  85161. .
  85162. #3:1
  85163. fork (300)
  85164. if ((((valid(player) && (!(player in connected_players()))) && ((player.last_connect_time + 300) < time())) && (this != player.home)) && (player.location != player.home))
  85165. fork (0)
  85166. "This is forked so that it's protected from aborts due to errors in the player's :moveto verb.";
  85167. if (player.location != player.home)
  85168. move(player, $player_start);
  85169. endif
  85170. endfork
  85171. start = player.location;
  85172. player:moveto(player.home);
  85173. if (player.location != start)
  85174. start:announce("The housekeeper arrives to cart ", player.name, " off to bed.");
  85175. endif
  85176. if (player.location == player.home)
  85177. player.home:announce("The housekeeper arrives to drop off ", player.name, ", who is sound asleep.");
  85178. endif
  85179. endif
  85180. endfork
  85181. this:announce(player.name, " has disconnected.");
  85182. .
  85183. #3:2
  85184. player:tell("You say, \"", argstr, "\"");
  85185. this:announce(player.name, " says, \"", argstr, "\"");
  85186. .
  85187. #3:3
  85188. if ((argstr != "") && (argstr[1] == ":"))
  85189. this:announce_all(player.name, argstr[2..length(argstr)]);
  85190. else
  85191. this:announce_all(player.name, " ", argstr);
  85192. endif
  85193. .
  85194. #3:4
  85195. for dude in (setremove(this:contents(), player))
  85196. dude:tell(@args);
  85197. endfor
  85198. .
  85199. #3:5
  85200. what = args[1];
  85201. if (what)
  85202. yes = $failed_match;
  85203. for e in (this.exits)
  85204. if (valid(e) && (what in {e.name, @e.aliases}))
  85205. if (yes == $failed_match)
  85206. yes = e;
  85207. elseif (yes != e)
  85208. return $ambiguous_match;
  85209. endif
  85210. endif
  85211. endfor
  85212. return yes;
  85213. else
  85214. return $nothing;
  85215. endif
  85216. .
  85217. #3:6
  85218. set_task_perms(caller_perms());
  85219. return (this.exits = setadd(this.exits, args[1])) != E_PERM;
  85220. .
  85221. #3:7
  85222. contents = args[1];
  85223. ctype = args[2];
  85224. if ((!this.dark) && (contents != {}))
  85225. if (ctype == 0)
  85226. player:tell("Contents:");
  85227. for thing in (contents)
  85228. player:tell("  ", thing:title());
  85229. endfor
  85230. elseif (ctype == 1)
  85231. for thing in (contents)
  85232. if (is_player(thing))
  85233. player:tell(thing:title(), " is here.");
  85234. else
  85235. player:tell("You see ", thing:title(), " here.");
  85236. endif
  85237. endfor
  85238. elseif (ctype == 2)
  85239. player:tell("You see ", $string_utils:title_list(contents), " here.");
  85240. elseif (ctype == 3)
  85241. players = (things = {});
  85242. for x in (contents)
  85243. if (is_player(x))
  85244. players = {@players, x};
  85245. else
  85246. things = {@things, x};
  85247. endif
  85248. endfor
  85249. if (things)
  85250. player:tell("You see ", $string_utils:title_list(things), " here.");
  85251. endif
  85252. if (players)
  85253. player:tell($string_utils:title_listc(players), (length(players) == 1) ? " is" | " are", " here.");
  85254. endif
  85255. endif
  85256. endif
  85257. .
  85258. #3:8
  85259. if (!$perm_utils:controls(valid(caller_perms()) ? caller_perms() | player, this))
  85260. player:tell("Sorry, only the owner of a room may list its exits.");
  85261. elseif (this.exits == {})
  85262. player:tell("This room has no conventional exits.");
  85263. else
  85264. for exit in (this.exits)
  85265. player:tell(exit.name, " (", exit, ") leads to ", valid(exit.dest) ? exit.dest.name | "???", " (", exit.dest, ") via {", $string_utils:from_list(exit.aliases, ", "), "}.");
  85266. endfor
  85267. endif
  85268. .
  85269. #3:9
  85270. player:tell(this:title());
  85271. if (!(args && args[1]))
  85272. pass();
  85273. endif
  85274. this:tell_contents(setremove(this:contents(), player), this.ctype);
  85275. .
  85276. #3:10
  85277. what = args[1];
  85278. return this:is_unlocked_for(what) && (((this.free_entry || ((what == this.blessed_object) && (task_id() == this.blessed_task))) || (what.owner == this.owner)) || ((typeof(this.residents) == LIST) && (what in this.residents)));
  85279. .
  85280. #3:11
  85281. set_task_perms(caller_perms());
  85282. return (this.entrances = setadd(this.entrances, args[1])) != E_PERM;
  85283. .
  85284. #3:12
  85285. if (caller in this.entrances)
  85286. this.blessed_object = args[1];
  85287. this.blessed_task = task_id();
  85288. endif
  85289. .
  85290. #3:13
  85291. if (!$perm_utils:controls(valid(caller_perms()) ? caller_perms() | player, this))
  85292. player:tell("Sorry, only the owner of a room may list its entrances.");
  85293. elseif (this.entrances == {})
  85294. player:tell("This room has no conventional entrances.");
  85295. else
  85296. for exit in (this.entrances)
  85297. player:tell(exit.name, " (", exit, ") comes from ", valid(exit.source) ? exit.source.name | "???", " (", exit.source, ") via {", $string_utils:from_list(exit.aliases, ", "), "}.");
  85298. endfor
  85299. endif
  85300. .
  85301. #3:14
  85302. if ((!args) || (!(dir = args[1])))
  85303. player:tell("You need to specify a direction.");
  85304. return E_INVARG;
  85305. elseif (valid(exit = player.location:match_exit(dir)))
  85306. exit:invoke();
  85307. if (length(args) > 1)
  85308. "Now give objects in the room we just passed through a chance to act.";
  85309. suspend(0);
  85310. player.location:go(@listdelete(args, 1));
  85311. endif
  85312. elseif (exit == $failed_match)
  85313. player:tell("You can't go that way (", dir, ").");
  85314. else
  85315. player:tell("I don't know which direction `", dir, "' you mean.");
  85316. endif
  85317. .
  85318. #3:15
  85319. if ((dobjstr == "") && (!prepstr))
  85320. this:look_self();
  85321. elseif ((prepstr != "in") && (prepstr != "on"))
  85322. if ((!dobjstr) && (prepstr == "at"))
  85323. dobjstr = iobjstr;
  85324. iobjstr = "";
  85325. else
  85326. dobjstr = (dobjstr + (prepstr && ((dobjstr && " ") + prepstr)));
  85327. dobjstr = (dobjstr + (iobjstr && ((dobjstr && " ") + iobjstr)));
  85328. endif
  85329. dobj = this:match_object(dobjstr);
  85330. if (!$command_utils:object_match_failed(dobj, dobjstr))
  85331. dobj:look_self();
  85332. endif
  85333. elseif (!iobjstr)
  85334. player:tell(verb, " ", prepstr, " what?");
  85335. else
  85336. iobj = this:match_object(iobjstr);
  85337. if (!$command_utils:object_match_failed(iobj, iobjstr))
  85338. if (dobjstr == "")
  85339. iobj:look_self();
  85340. elseif ((thing = iobj:match(dobjstr)) == $failed_match)
  85341. player:tell("I don't see any \"", dobjstr, "\" ", prepstr, " ", iobj.name, ".");
  85342. elseif (thing == $ambiguous_match)
  85343. player:tell("There are several things ", prepstr, " ", iobj.name, " one might call \"", dobjstr, "\".");
  85344. else
  85345. thing:look_self();
  85346. endif
  85347. endif
  85348. endif
  85349. .
  85350. #3:16
  85351. for dude in (this:contents())
  85352. dude:tell(@args);
  85353. endfor
  85354. .
  85355. #3:17
  85356. text = listdelete(args, 1);
  85357. contents = this:contents();
  85358. for l in (args[1])
  85359. contents = setremove(contents, l);
  85360. endfor
  85361. for listener in (contents)
  85362. listener:tell(@text);
  85363. endfor
  85364. .
  85365. #3:18
  85366. object = args[1];
  85367. if (is_player(object))
  85368. player = object;
  85369. this:look_self(player.brief);
  85370. endif
  85371. if (object == this.blessed_object)
  85372. this.blessed_object = #-1;
  85373. endif
  85374. .
  85375. #3:19
  85376. return;
  85377. .
  85378. #3:20
  85379. exit = args[1];
  85380. if (caller != exit)
  85381. set_task_perms(caller_perms());
  85382. endif
  85383. return (this.exits = setremove(this.exits, exit)) != E_PERM;
  85384. .
  85385. #3:21
  85386. exit = args[1];
  85387. if (caller != exit)
  85388. set_task_perms(caller_perms());
  85389. endif
  85390. return (this.entrances = setremove(this.entrances, exit)) != E_PERM;
  85391. .
  85392. #3:22
  85393. set_task_perms(player);
  85394. if (!dobjstr)
  85395. player:tell("Usage:  @add-exit <exit-number>");
  85396. return;
  85397. endif
  85398. exit = this:match_object(dobjstr);
  85399. if ($command_utils:object_match_failed(exit, dobjstr))
  85400. return;
  85401. endif
  85402. if (!($exit in $object_utils:ancestors(exit)))
  85403. player:tell("That doesn't look like an exit object to me...");
  85404. return;
  85405. endif
  85406. dest = exit.dest;
  85407. source = exit.source;
  85408. if (dest == E_PERM)
  85409. player:tell("You can't read the exit's destination to check that it's consistent!");
  85410. return;
  85411. elseif (source == E_PERM)
  85412. player:tell("You can't read that exit's source to check that it's consistent!");
  85413. return;
  85414. elseif (source != this)
  85415. player:tell("That exit wasn't made to be attached here; it was made as an exit from ", source.name, " (", source, ").");
  85416. return;
  85417. elseif (((typeof(dest) != OBJ) || (!valid(dest))) || (!($room in $object_utils:ancestors(dest))))
  85418. player:tell("That exit doesn't lead to a room!");
  85419. return;
  85420. endif
  85421. if (!this:add_exit(exit))
  85422. player:tell("Sorry, but you must not have permission to add exits to this room.");
  85423. else
  85424. player:tell("You have added ", exit, " as an exit that goes to ", exit.dest.name, " (", exit.dest, ") via ", $string_utils:english_list(setadd(exit.aliases, exit.name)), ".");
  85425. endif
  85426. .
  85427. #3:23
  85428. set_task_perms(player);
  85429. if (!dobjstr)
  85430. player:tell("Usage:  @add-entrance <exit-number>");
  85431. return;
  85432. endif
  85433. exit = this:match_object(dobjstr);
  85434. if ($command_utils:object_match_failed(exit, dobjstr))
  85435. return;
  85436. endif
  85437. if (!($exit in $object_utils:ancestors(exit)))
  85438. player:tell("That doesn't look like an exit object to me...");
  85439. return;
  85440. endif
  85441. dest = exit.dest;
  85442. if (dest == E_PERM)
  85443. player:tell("You can't read the exit's destination to check that it's consistent!");
  85444. return;
  85445. elseif (dest != this)
  85446. player:tell("That exit doesn't lead here!");
  85447. return;
  85448. endif
  85449. if (!this:add_entrance(exit))
  85450. player:tell("Sorry, but you must not have permission to add entrances to this room.");
  85451. else
  85452. player:tell("You have added ", exit, " as an entrance that gets here via ", $string_utils:english_list(setadd(exit.aliases, exit.name)), ".");
  85453. endif
  85454. .
  85455. #3:24
  85456. "Make a mild attempt to keep people and objects from ending up in #-1 when people recycle a room";
  85457. if ((caller == this) || $perm_utils:controls(caller_perms(), this))
  85458. "... first try spilling them out onto the floor of enclosing room if any";
  85459. if (valid(this.location))
  85460. for x in (this.contents)
  85461. x:moveto(this.location);
  85462. endfor
  85463. endif
  85464. "... try sending them home...";
  85465. for x in (this.contents)
  85466. if (is_player(x))
  85467. if ((typeof(x.home) == OBJ) && valid(x.home))
  85468. x:moveto(x.home);
  85469. endif
  85470. if (x.location == this)
  85471. move(x, $player_start);
  85472. endif
  85473. elseif (valid(x.owner))
  85474. x:moveto(x.owner);
  85475. endif
  85476. endfor
  85477. pass(@args);
  85478. else
  85479. return E_PERM;
  85480. endif
  85481. .
  85482. #3:25
  85483. exit = this:match_exit(verb);
  85484. if (valid(exit))
  85485. exit:invoke();
  85486. elseif (exit == $failed_match)
  85487. player:tell("You can't go that way.");
  85488. else
  85489. player:tell("I don't know which direction `", verb, "' you mean.");
  85490. endif
  85491. .
  85492. #3:26
  85493. set_task_perms(player);
  85494. if ($command_utils:object_match_failed(dobj, dobjstr))
  85495. return;
  85496. elseif (dobj.location != this)
  85497. player:tell(dobj.name, "(", dobj, ") is not here.");
  85498. return;
  85499. elseif (!$perm_utils:controls(player, this))
  85500. player:tell("You are not the owner of this room.");
  85501. return;
  85502. elseif (dobj.wizard)
  85503. player:tell("Sorry, you can't ", verb, " a wizard.");
  85504. dobj:tell(player.name, " tried to ", verb, " you.");
  85505. return;
  85506. endif
  85507. iobj = this;
  85508. player:tell(this:ejection_msg());
  85509. this:eject(dobj);
  85510. dobj:tell(this:victim_ejection_msg());
  85511. this:announce_all_but({player, dobj}, this:oejection_msg());
  85512. .
  85513. #3:27
  85514. return $string_utils:pronoun_sub(this.(verb));
  85515. .
  85516. #3:28
  85517. who = args[1];
  85518. return (valid(who) && ((this.free_home || $perm_utils:controls(who, this)) || (who in this.residents))) && this:accept(who);
  85519. .
  85520. #3:29
  85521. if (!$perm_utils:controls(player, this))
  85522. player:tell("You must own this room to manipulate the legal residents list.  Try contacting ", this.owner.name, ".");
  85523. else
  85524. if (!dobjstr)
  85525. "First, remove !valid objects from this room...";
  85526. for x in (this.residents)
  85527. if (!valid(x))
  85528. player:tell("Warning: removing ", x, ", an invalid object, from the residents list.");
  85529. this.residents = setremove(this.residents, x);
  85530. endif
  85531. endfor
  85532. player:tell("Allowable residents in this room:  ", $string_utils:english_list($list_utils:map_prop(this.residents, "name"), "no one"), ".");
  85533. return;
  85534. elseif (dobjstr[1] == "!")
  85535. notflag = 1;
  85536. dobjstr = dobjstr[2..length(dobjstr)];
  85537. else
  85538. notflag = 0;
  85539. endif
  85540. result = $string_utils:match_player_or_object(dobjstr);
  85541. if (!result)
  85542. return;
  85543. else
  85544. "a one element list was returned to us if it won.";
  85545. result = result[1];
  85546. if (notflag)
  85547. if (!(result in this.residents))
  85548. player:tell(result.name, " doesn't appear to be in the residents list of ", this.name, ".");
  85549. else
  85550. this.residents = setremove(this.residents, result);
  85551. player:tell(result.name, " removed from the residents list of ", this.name, ".");
  85552. endif
  85553. else
  85554. if (result in this.residents)
  85555. player:tell(result.name, " is already an allowed resident of ", this.name, ".");
  85556. else
  85557. this.residents = {@this.residents, result};
  85558. player:tell(result.name, " added to the residents list of ", this.name, ".");
  85559. endif
  85560. endif
  85561. endif
  85562. endif
  85563. .
  85564. #3:30
  85565. target = {@this:contents(), @this:exits()};
  85566. return $string_utils:match(args[1], target, "name", target, "aliases");
  85567. .
  85568. #3:31
  85569. set_task_perms(player);
  85570. if (!dobjstr)
  85571. player:tell("Usage:  @remove-exit <exit>");
  85572. return;
  85573. endif
  85574. exit = this:match_object(dobjstr);
  85575. if (!(exit in this.exits))
  85576. if ($command_utils:object_match_failed(exit, dobjstr))
  85577. return;
  85578. endif
  85579. player:tell("Couldn't find \"", dobjstr, "\" in the exits list of ", this.name, ".");
  85580. return;
  85581. elseif (!this:remove_exit(exit))
  85582. player:tell("Sorry, but you do not have permission to remove exits from this room.");
  85583. else
  85584. name = (valid(exit) ? exit.name | "<recycled>");
  85585. player:tell("Exit ", exit, " (", name, ") removed from exit list of ", this.name, " (", this, ").");
  85586. endif
  85587. .
  85588. #3:32
  85589. set_task_perms(player);
  85590. if (!dobjstr)
  85591. player:tell("Usage:  @remove-entrance <entrance>");
  85592. return;
  85593. endif
  85594. entrance = $string_utils:match(dobjstr, this.entrances, "name", this.entrances, "aliases");
  85595. if (!valid(entrance))
  85596. "Try again to parse it.  Maybe they gave object number.  Don't complain if it's invalid though; maybe it's been recycled in some nefarious way.";
  85597. entrance = this:match_object(dobjstr);
  85598. endif
  85599. if (!(entrance in this.entrances))
  85600. player:tell("Couldn't find \"", dobjstr, "\" in the entrances list of ", this.name, ".");
  85601. return;
  85602. elseif (!this:remove_entrance(entrance))
  85603. player:tell("Sorry, but you do not have permission to remove entrances from this room.");
  85604. else
  85605. name = (valid(entrance) ? entrance.name | "<recycled>");
  85606. player:tell("Entrance ", entrance, " (", name, ") removed from entrance list of ", this.name, " (", this, ").");
  85607. endif
  85608. .
  85609. #3:33
  85610. if ((caller in {this, this.owner}) || $perm_utils:controls(caller_perms(), this))
  85611. return pass(@args);
  85612. else
  85613. return E_PERM;
  85614. endif
  85615. .
  85616. #3:34
  85617. return (msg = this.(verb)) ? $string_utils:pronoun_sub(msg, args[1]) | "";
  85618. .
  85619. #3:35
  85620. if ((caller == this) || $perm_utils:controls(caller_perms(), this))
  85621. return this.exits;
  85622. else
  85623. return E_PERM;
  85624. endif
  85625. .
  85626. #3:36
  85627. exits = {};
  85628. for exit in (this.exits)
  85629. if (exit.obvious)
  85630. exits = setadd(exits, exit);
  85631. endif
  85632. endfor
  85633. return exits;
  85634. .
  85635. #3:37
  85636. ":here_huh(verb,args)  -- room-specific :huh processing.  This should return 1 if it finds something interesting to do and 0 otherwise; see $command_utils:do_huh.";
  85637. "For the generic room, we check for the case of the caller specifying an exit for which a corresponding verb was never defined.";
  85638. set_task_perms(caller_perms());
  85639. if (args[2] || ($failed_match == (exit = this:match_exit(verb = args[1]))))
  85640. "... okay, it's not an exit.  we give up...";
  85641. return 0;
  85642. elseif (valid(exit))
  85643. exit:invoke();
  85644. else
  85645. "... ambiguous exit ...";
  85646. player:tell("I don't know which direction `", verb, "' you mean.");
  85647. endif
  85648. return 1;
  85649. .
  85650. #3:38
  85651. this:(verb[6..length(verb)])(@args);
  85652. .
  85653. #3:39
  85654. return this == args[1].location;
  85655. .
  85656. #3:40
  85657. "examine_key(examiner)";
  85658. "return a list of strings to be told to the player, indicating what the key on this type of object means, and what this object's key is set to.";
  85659. "the default will only tell the key to a wizard or this object's owner.";
  85660. who = args[1];
  85661. if (((caller == this) && $perm_utils:controls(who, this)) && (this.key != 0))
  85662. return {tostr(this:title(), " will accept only objects matching the following key:"), tostr("  ", $lock_utils:unparse_key(this.key))};
  85663. endif
  85664. .
  85665. #3:41
  85666. "examine_contents(who)";
  85667. if (caller == this)
  85668. this:tell_contents(this.contents, this.ctype);
  85669. endif
  85670. .
  85671. #4:0
  85672. if ((dobjstr == "") || (dobj == player))
  85673. q = player.ownership_quota;
  85674. if (q == 0)
  85675. player:notify("You can't create any more objects until you recycle some of the ones you already own.");
  85676. else
  85677. player:notify(tostr("You can create ", q, " new object", (q == 1) ? "" | "s", " without recycling any that you already own."));
  85678. endif
  85679. else
  85680. set_task_perms(player);
  85681. dobj = $string_utils:match_player(dobjstr);
  85682. if (!valid(dobj))
  85683. player:notify("Show whose quota?");
  85684. return;
  85685. endif
  85686. q = dobj.ownership_quota;
  85687. if (typeof(q) == ERR)
  85688. player:notify(tostr(q));
  85689. else
  85690. player:notify(tostr(dobj.name, "'s quota is currently ", q, "."));
  85691. endif
  85692. endif
  85693. .
  85694. #4:1
  85695. set_task_perms(player);
  85696. nargs = length(args);
  85697. pos = ("named" in args);
  85698. if ((pos <= 1) || (pos == nargs))
  85699. pos = ("called" in args);
  85700. endif
  85701. if ((pos <= 1) || (pos == nargs))
  85702. player:notify("Usage:  @create <parent-class> named [name:]alias,...,alias");
  85703. player:notify("   or:  @create <parent-class> named name-and-alias,alias,...,alias");
  85704. player:notify("");
  85705. player:notify("where <parent-class> is one of the standard classes ($note, $letter, $thing, or $container) or an object number (e.g., #999), or the name of some object in the current room.");
  85706. player:notify("You can use \"called\" instead of \"named\"");
  85707. return;
  85708. endif
  85709. parentstr = $string_utils:from_list(args[1..pos - 1], " ");
  85710. namestr = $string_utils:from_list(args[pos + 1..nargs], " ");
  85711. if (parentstr[1] == "$")
  85712. parent = #0.(parentstr[2..length(parentstr)]);
  85713. if (typeof(parent) != OBJ)
  85714. player:notify(tostr("\"", parentstr, "\" does not name an object."));
  85715. return;
  85716. endif
  85717. else
  85718. parent = player:my_match_object(parentstr);
  85719. if ($command_utils:object_match_failed(parent, parentstr))
  85720. return;
  85721. endif
  85722. endif
  85723. object = player:_create(parent);
  85724. if (typeof(object) == ERR)
  85725. player:notify(tostr(object));
  85726. return;
  85727. endif
  85728. move(object, player);
  85729. $building_utils:set_names(object, namestr);
  85730. if ((other_names = setremove(object.aliases, object.name)) != {})
  85731. aka = ((" (aka " + $string_utils:english_list(other_names)) + ")");
  85732. else
  85733. aka = "";
  85734. endif
  85735. player:notify(tostr("You now have ", object.name, aka, " with object number ", object, " and parent ", parent.name, " (", parent, ")."));
  85736. .
  85737. #4:2
  85738. set_task_perms(player);
  85739. dobj = player:my_match_object(dobjstr);
  85740. if (dobj == $nothing)
  85741. player:notify(tostr("Usage:  ", verb, " <object>"));
  85742. elseif ($command_utils:object_match_failed(dobj, dobjstr))
  85743. "...bogus object...";
  85744. elseif (player == dobj)
  85745. player:notify("You don't *really* want to commit suicide, do you?");
  85746. else
  85747. name = dobj.name;
  85748. result = player:_recycle(dobj);
  85749. if (typeof(result) == ERR)
  85750. player:notify(tostr(result));
  85751. else
  85752. player:notify(tostr(name, " (", dobj, ") recycled."));
  85753. endif
  85754. endif
  85755. .
  85756. #4:3
  85757. "@recreate <object> as <parent-class> named [name:]alias,alias,...";
  85758. "  effectively recycles and creates <object> all over again.";
  85759. set_task_perms(player);
  85760. named = ("named" in args);
  85761. as = (prepstr in args);
  85762. if ((named <= (as + 1)) || (named == length(args)))
  85763. player:notify_lines({tostr("Usage:  ", verb, " <object> as <parent-class> named [name:]alias,...,alias"), "", "where <parent-class> is one of the standard classes ($note, $letter, $thing, or $container) or an object number (e.g., #999), or the name of some object in the current room.  The [name:]alias... specification is as in @create."});
  85764. return;
  85765. elseif ($command_utils:object_match_failed(dobj = player:my_match_object(dobjstr), dobjstr))
  85766. return;
  85767. elseif (is_player(dobj))
  85768. player:notify("You really *don't* want to do that!");
  85769. return;
  85770. endif
  85771. parentstr = $string_utils:from_list(args[as + 1..named - 1], " ");
  85772. namestr = $string_utils:from_list(args[named + 1..length(args)], " ");
  85773. if (parentstr[1] == "$")
  85774. parent = #0.(parentstr[2..length(parentstr)]);
  85775. if (typeof(parent) != OBJ)
  85776. player:notify(tostr("\"", parentstr, "\" does not name an object."));
  85777. return;
  85778. endif
  85779. else
  85780. parent = player:my_match_object(parentstr);
  85781. if ($command_utils:object_match_failed(parent, parentstr))
  85782. return;
  85783. endif
  85784. endif
  85785. if (!(e = $building_utils:recreate(dobj, parent)))
  85786. player:notify(tostr(e));
  85787. return;
  85788. endif
  85789. move(dobj, player);
  85790. $building_utils:set_names(dobj, namestr);
  85791. if ((other_names = setremove(dobj.aliases, dobj.name)) != {})
  85792. aka = ((" (aka " + $string_utils:english_list(other_names)) + ")");
  85793. else
  85794. aka = "";
  85795. endif
  85796. player:notify(tostr("Object number ", dobj, " is now ", dobj.name, aka, " with parent ", parent.name, " (", parent, ")."));
  85797. .
  85798. #4:4
  85799. set_task_perms(player);
  85800. nargs = length(args);
  85801. if (nargs == 1)
  85802. room = args[1];
  85803. exit_spec = "";
  85804. elseif ((nargs >= 3) && (args[2] == "to"))
  85805. exit_spec = args[1];
  85806. room = $string_utils:from_list(args[3..nargs], " ");
  85807. else
  85808. player:notify(tostr("Usage:  ", verb, " <new-room-name>"));
  85809. player:notify(tostr("    or  ", verb, " <exit-description> to <new-room-name-or-old-room-object-number>"));
  85810. return;
  85811. endif
  85812. if (room != tostr(other_room = toobj(room)))
  85813. other_room = player:_create($room);
  85814. if (typeof(other_room) == ERR)
  85815. player:notify(tostr(other_room));
  85816. return;
  85817. endif
  85818. other_room.name = room;
  85819. other_room.aliases = {room};
  85820. move(other_room, $nothing);
  85821. player:notify(tostr(other_room.name, " (", other_room, ") created."));
  85822. elseif (nargs == 1)
  85823. player:notify("You can't dig a room that already exists!");
  85824. return;
  85825. elseif ((!valid(player.location)) || (!($room in $object_utils:ancestors(player.location))))
  85826. player:notify(tostr("You may only use the ", verb, " command from inside a room."));
  85827. return;
  85828. elseif ((!valid(other_room)) || (!($room in $object_utils:ancestors(other_room))))
  85829. player:notify(tostr(other_room, " doesn't look like a room to me..."));
  85830. return;
  85831. endif
  85832. if (exit_spec)
  85833. exits = $string_utils:explode(exit_spec, "|");
  85834. if ((length(exits) < 1) || (length(exits) > 2))
  85835. player:notify("The exit-description must have the form");
  85836. player:notify("     [name:]alias,...,alias");
  85837. player:notify("or   [name:]alias,...,alias|[name:]alias,...,alias");
  85838. return;
  85839. endif
  85840. to_ok = $building_utils:make_exit(exits[1], player.location, other_room, player.recreate_enabled);
  85841. if (to_ok && (length(exits) == 2))
  85842. $building_utils:make_exit(exits[2], other_room, player.location, player.recreate_enabled);
  85843. endif
  85844. endif
  85845. .
  85846. #4:5
  85847. "Usage:  @audit [player] [from <start>] [to <end>] [for <matching string>]";
  85848. set_task_perms(player);
  85849. dobj = $string_utils:match_player(dobjstr);
  85850. if (!dobjstr)
  85851. dobj = player;
  85852. elseif ($command_utils:player_match_result(dobj, dobjstr)[1])
  85853. return;
  85854. endif
  85855. dobjwords = $string_utils:words(dobjstr);
  85856. if (args[1..length(dobjwords)] == dobjwords)
  85857. args = args[length(dobjwords) + 1..length(args)];
  85858. endif
  85859. if (!(parse_result = $code_utils:_parse_audit_args(@args)))
  85860. player:notify(tostr("Usage:  ", verb, " [player] [from <start>] [to <end>] [for <match>]"));
  85861. return;
  85862. endif
  85863. if (typeof(dobj.owned_objects) != LIST)
  85864. player:notify(tostr(dobj.name, "'s owned_objects property is not a list.  Use @auditDB instead."));
  85865. return;
  85866. endif
  85867. start = parse_result[1];
  85868. end = parse_result[2];
  85869. match = parse_result[3];
  85870. player:notify(tostr("Objects owned by ", valid(dobj) ? dobj.name | dobj, ((" (from #" + tostr(start)) + " to #") + tostr(end), match ? " matching " + match | "", ")", ":"));
  85871. player:notify("");
  85872. count = 0;
  85873. "Only print every third suspension, so printed_anything gets 1-- until it's negative.  Can control this by changing the reset value higher or lower.";
  85874. printed = 0;
  85875. for o in (dobj.owned_objects)
  85876. if ($command_utils:running_out_of_time())
  85877. if (printed < 0)
  85878. player:tell(o, " ...");
  85879. printed = 2;
  85880. else
  85881. printed = (printed - 1);
  85882. endif
  85883. suspend(0);
  85884. endif
  85885. if (valid(o) && ((tonum(o) >= start) && (tonum(o) <= end)))
  85886. found = (match ? 0 | 1);
  85887. names = {o.name, @o.aliases};
  85888. while (names && (!found))
  85889. if (index(names[1], match) == 1)
  85890. found = 1;
  85891. endif
  85892. names = listdelete(names, 1);
  85893. endwhile
  85894. if (found)
  85895. player:tell(this:object_audit_string(o));
  85896. count = (count + 1);
  85897. printed = 1;
  85898. endif
  85899. endif
  85900. endfor
  85901. if (count)
  85902. player:notify("");
  85903. endif
  85904. player:notify(tostr("Total: ", count, " object", (count == 1) ? "." | "s."));
  85905. .
  85906. #4:6
  85907. "Usage:  @auditDB [player] [from <start>] [to <end>] [for <matching string>]";
  85908. set_task_perms(player);
  85909. dobj = $string_utils:match_player(dobjstr);
  85910. if (!dobjstr)
  85911. dobj = player;
  85912. elseif ($command_utils:player_match_failed(dobj, dobjstr) && (!(valid(dobj = $string_utils:literal_object(dobjstr)) && $command_utils:yes_or_no("Continue?"))))
  85913. return;
  85914. endif
  85915. dobjwords = $string_utils:words(dobjstr);
  85916. if (args[1..length(dobjwords)] == dobjwords)
  85917. args = args[length(dobjwords) + 1..length(args)];
  85918. endif
  85919. if (!(parse_result = $code_utils:_parse_audit_args(@args)))
  85920. player:notify(tostr("Usage:  ", verb, " [player] [from <start>] [to <end>] [for <match>]"));
  85921. return;
  85922. endif
  85923. start = parse_result[1];
  85924. end = parse_result[2];
  85925. match = parse_result[3];
  85926. player:notify(tostr("Objects owned by ", valid(dobj) ? dobj.name | dobj, ((" (from #" + tostr(start)) + " to #") + tostr(end), match ? " matching " + match | "", ")", ":"));
  85927. player:notify("");
  85928. count = 0;
  85929. "Only print every third suspension";
  85930. do_print = 0;
  85931. for i in [start..end]
  85932. o = toobj(i);
  85933. if ($command_utils:running_out_of_time())
  85934. (do_print = ((do_print + 1) % 3)) || player:notify(tostr("... ", o));
  85935. suspend(5);
  85936. endif
  85937. if (valid(o) && (o.owner == dobj))
  85938. found = 0;
  85939. names = {o.name, @o.aliases};
  85940. while (names && (!found))
  85941. if (index(names[1], match) == 1)
  85942. found = 1;
  85943. endif
  85944. names = listdelete(names, 1);
  85945. endwhile
  85946. if (found)
  85947. player:tell(player:object_audit_string(o));
  85948. count = (count + 1);
  85949. do_print = 0;
  85950. endif
  85951. endif
  85952. endfor
  85953. if (count)
  85954. player:notify("");
  85955. endif
  85956. player:notify(tostr("Total: ", count, " object", (count == 1) ? "." | "s."));
  85957. .
  85958. #4:7
  85959. if (!dobjstr)
  85960. dobj = player;
  85961. elseif ($command_utils:player_match_result(dobj = $string_utils:match_player(dobjstr), dobjstr)[1])
  85962. return;
  85963. endif
  85964. set_task_perms(player);
  85965. if (typeof(dobj.owned_objects) == LIST)
  85966. count = length(dobj.owned_objects);
  85967. player:notify(tostr(dobj.name, " currently owns ", count, " object", (count == 1) ? "." | "s."));
  85968. else
  85969. player:notify(tostr(dobj.name, " is not enrolled in the object ownership system.  Use @countDB instead."));
  85970. endif
  85971. .
  85972. #4:8
  85973. if (!dobjstr)
  85974. dobj = player;
  85975. elseif ($command_utils:player_match_result(dobj = $string_utils:match_player(dobjstr), dobjstr)[1])
  85976. return;
  85977. endif
  85978. set_task_perms(player);
  85979. count = 0;
  85980. for i in [1..tonum(max_object())]
  85981. if ($command_utils:running_out_of_time())
  85982. player:notify("Counting...");
  85983. suspend(5);
  85984. endif
  85985. o = toobj(i);
  85986. if (valid(o) && (o.owner == dobj))
  85987. count = (count + 1);
  85988. endif
  85989. endfor
  85990. player:notify(tostr(dobj.name, " currently owns ", count, " object", (count == 1) ? "." | "s."));
  85991. .
  85992. #4:9
  85993. "$player:owned_objects -- sorts a players .owned_objects property in ascending";
  85994. "order so it looks nice on @audit.";
  85995. if (player != this)
  85996. return E_PERM;
  85997. endif
  85998. if (typeof(player.owned_objects) == LIST)
  85999. ret = $list_utils:sort(player.owned_objects);
  86000. if (typeof(ret) == LIST)
  86001. player.owned_objects = ret;
  86002. player:tell("Your .owned_objects list has been sorted.");
  86003. return 1;
  86004. else
  86005. player:tell("Something went wrong. .owned_obejcts not sorted.");
  86006. return 0;
  86007. endif
  86008. else
  86009. player:tell("You are not enrolled in .owned_objects scheme, sorry.");
  86010. endif
  86011. .
  86012. #4:10
  86013. if (player != this)
  86014. player:tell("Permission Denied");
  86015. return E_PERM;
  86016. endif
  86017. if (!valid(dobj))
  86018. player:tell("Don't understand `", dobjstr, "' as an object to add.");
  86019. elseif (dobj.owner != player)
  86020. player:tell("You don't own ", dobj.name, ".");
  86021. elseif (dobj in player.owned_objects)
  86022. player:tell(dobj.name, " is already recorded in your .owned_objects.");
  86023. else
  86024. player.owned_objects = setadd(player.owned_objects, dobj);
  86025. player:tell("Added ", dobj, " to your .owned_objects.");
  86026. endif
  86027. .
  86028. #4:11
  86029. for x in (player.owned_objects)
  86030. if ((!valid(x)) || (x.owner != player))
  86031. player.owned_objects = setremove(player.owned_objects, x);
  86032. if (valid(x))
  86033. player:tell("Removing ", x.name, "(", x, "), owned by ", valid(x.owner) ? x.owner.name | "<recycled player>", " from your .owned_objects property.");
  86034. else
  86035. player:tell("Removing invalid object ", x, " from your .owned_objects property.");
  86036. endif
  86037. endif
  86038. endfor
  86039. player:tell(".owned_objects property verified.");
  86040. .
  86041. #4:12
  86042. set_task_perms(player);
  86043. dobj = player:my_match_object(dobjstr);
  86044. if ($command_utils:object_match_failed(dobj, dobjstr))
  86045. return;
  86046. endif
  86047. res = (dobj.key = 0);
  86048. if (typeof(res) == ERR)
  86049. player:notify(tostr(res, "."));
  86050. else
  86051. player:notify(tostr("Unlocked ", dobj.name, "."));
  86052. endif
  86053. .
  86054. #4:13
  86055. set_task_perms(player);
  86056. dobj = player:my_match_object(dobjstr);
  86057. if ($command_utils:object_match_failed(dobj, dobjstr))
  86058. return;
  86059. endif
  86060. key = $lock_utils:parse_keyexp(iobjstr, player);
  86061. if (typeof(key) == STR)
  86062. player:notify("That key expression is malformed:");
  86063. player:notify(tostr("  ", key));
  86064. else
  86065. res = (dobj.key = key);
  86066. if (typeof(res) == ERR)
  86067. player:notify(tostr(res, "."));
  86068. else
  86069. player:notify(tostr("Locked ", dobj.name, " to this key:"));
  86070. player:notify(tostr("  ", $lock_utils:unparse_key(key)));
  86071. endif
  86072. endif
  86073. .
  86074. #4:14
  86075. "Usage:  @message <message-name> [<message>] [on <object>]";
  86076. "Add a message property to an object (default is player), and optionally";
  86077. "set its value.  For use by non-programmers, who aren't allowed to add";
  86078. "properties generally.";
  86079. "To undo the effects of this, use @unmessage.";
  86080. set_task_perms(player);
  86081. dobjwords = $string_utils:words(dobjstr);
  86082. if (!dobjwords)
  86083. player:notify(tostr("Usage:  ", verb, " <message-name> [<message>] [on <object>]"));
  86084. return;
  86085. endif
  86086. object = (valid(iobj) ? iobj | player);
  86087. name = this:_messagify(dobjwords[1]);
  86088. value = dobjstr[length(dobjwords[1]) + 2..length(dobjstr)];
  86089. nickname = ("@" + name[1..length(name) - 4]);
  86090. e = add_property(object, name, value, {player, "rc"});
  86091. if (typeof(e) != ERR)
  86092. player:notify(tostr(nickname, " on ", object.name, " is now \"", object.(name), "\"."));
  86093. elseif (e != E_INVARG)
  86094. player:notify(tostr(e));
  86095. elseif ($object_utils:has_property(object, name))
  86096. "object already has property";
  86097. player:notify(tostr(object.name, " already has a ", nickname, " message."));
  86098. else
  86099. player:notify(tostr("Unable to add ", nickname, " message to ", object.name, ": ", e));
  86100. endif
  86101. .
  86102. #4:15
  86103. "Usage:  @unmessage <message-name> [from <object>]";
  86104. "Remove a message property from an object (default is player).";
  86105. set_task_perms(player);
  86106. if ((!dobjstr) || (length($string_utils:words(dobjstr)) > 1))
  86107. player:notify(tostr("Usage:  ", verb, " <message-name> [from <object>]"));
  86108. return;
  86109. endif
  86110. object = (valid(iobj) ? iobj | player);
  86111. name = this:_messagify(dobjstr);
  86112. nickname = ("@" + name[1..length(name) - 4]);
  86113. e = delete_property(object, name);
  86114. if (e == E_PROPNF)
  86115. player:notify(tostr("No ", nickname, " message found on ", object.name, "."));
  86116. elseif (typeof(e) == ERR)
  86117. player:notify(tostr(e));
  86118. else
  86119. player:notify(tostr(nickname, " message removed from ", object.name, "."));
  86120. endif
  86121. .
  86122. #4:16
  86123. "Given any of several formats people are likely to use for a @message";
  86124. "property, return the canonical form (\"foobar_msg\").";
  86125. name = args[1];
  86126. if (name[1] == "@")
  86127. name = name[2..length(name)];
  86128. endif
  86129. if ((length(name) < 4) || (name[length(name) - 3..length(name)] != "_msg"))
  86130. name = (name + "_msg");
  86131. endif
  86132. return name;
  86133. .
  86134. #4:17
  86135. "'@kids <obj>' - List the children of an object. This is handy for seeing whether anybody's actually using your carefully-wrought public objects.";
  86136. thing = player:my_match_object(dobjstr);
  86137. if (!$command_utils:object_match_failed(thing, dobjstr))
  86138. kids = children(thing);
  86139. if (kids)
  86140. player:notify(tostr(thing:title(), "(", thing, ") has ", length(kids), " kid", (length(kids) == 1) ? "" | "s", "."));
  86141. player:notify(tostr($string_utils:names_of(kids)));
  86142. else
  86143. player:notify(tostr(thing:title(), "(", thing, ") has no kids."));
  86144. endif
  86145. endif
  86146. .
  86147. #4:18
  86148. "'@contents <obj> - list the contents of an object, with object numbers. This verb is by yduJ.";
  86149. set_task_perms(player);
  86150. if (!dobjstr)
  86151. dobj = player.location;
  86152. else
  86153. dobj = player:my_match_object(dobjstr);
  86154. endif
  86155. if ($command_utils:object_match_failed(dobj, dobjstr))
  86156. else
  86157. if ($object_utils:has_verb(dobj, "contents"))
  86158. contents = dobj:contents();
  86159. else
  86160. contents = dobj.contents;
  86161. endif
  86162. if (contents)
  86163. player:notify(tostr(dobj:title(), "(", dobj, ") contains:"));
  86164. player:notify(tostr($string_utils:names_of(contents)));
  86165. else
  86166. player:notify(tostr(dobj:title(), "(", dobj, ") contains nothing."));
  86167. endif
  86168. endif
  86169. .
  86170. #4:19
  86171. "'@parents <thing>' - List <thing> and its ancestors, all the way back to the Root Class (#1).";
  86172. set_task_perms(player);
  86173. if (!dobjstr)
  86174. player:notify(tostr("Usage:  ", verb, " <object>"));
  86175. return;
  86176. else
  86177. o = player:my_match_object(dobjstr);
  86178. endif
  86179. if (!$command_utils:object_match_failed(o, dobjstr))
  86180. player:notify($string_utils:names_of({o, @$object_utils:ancestors(o)}));
  86181. endif
  86182. .
  86183. #4:20
  86184. "@locations <thing> - List <thing> and its containers, all the way back to the outermost one.";
  86185. set_task_perms(player);
  86186. if (!dobjstr)
  86187. what = player;
  86188. elseif ((!valid(what = player:my_match_object(dobjstr))) && (!valid(what = $string_utils:match_player(dobjstr))))
  86189. $command_utils:object_match_failed(dobj, dobjstr);
  86190. return;
  86191. endif
  86192. player:notify($string_utils:names_of({what, @$object_utils:locations(what)}));
  86193. .
  86194. #4:21
  86195. "Usage: @realm [owner] [from root] [missing list_to_miss]";
  86196. "Where owner is a player's name or #nnn";
  86197. "      root is $property or #nnn";
  86198. "      list_to_miss elements are #nnn or $property";
  86199. set_task_perms(player);
  86200. "Let the owner kill the task...";
  86201. miss = {};
  86202. root = #1;
  86203. who = {};
  86204. c = 1;
  86205. for q in (args)
  86206. if (c == 1)
  86207. if ((q == "*") || (q == "!"))
  86208. who = setadd(who, $nothing);
  86209. elseif (q == tostr(z = toobj(q)))
  86210. who = setadd(who, z);
  86211. elseif (index("from", q))
  86212. c = 2;
  86213. elseif (index("missing", q))
  86214. c = 3;
  86215. elseif (valid(z = $string_utils:match_player(q)))
  86216. who = setadd(who, z);
  86217. endif
  86218. elseif (c == 2)
  86219. if (index("missing", q))
  86220. c = 3;
  86221. elseif (valid(z = this.location:match_object(q)))
  86222. root = z;
  86223. elseif (q == tostr(z = toobj(q)))
  86224. root = z;
  86225. elseif (q == "me")
  86226. root = this;
  86227. elseif (q == "here")
  86228. root = this.location;
  86229. elseif (((q[1] == "$") && ((z = q[2..length(q)]) in properties(#0))) && (typeof(#0.(z)) == OBJ))
  86230. root = #0.(z);
  86231. endif
  86232. elseif (c == 3)
  86233. if (q == tostr(z = toobj(q)))
  86234. miss = listappend(miss, z);
  86235. elseif ((q[1] == "$") && ((z = q[2..length(q)]) in properties(#0)))
  86236. miss = listappend(miss, #0.(z));
  86237. elseif (valid(z = this.location:match_object(q)))
  86238. miss = listappend(miss, z);
  86239. endif
  86240. endif
  86241. endfor
  86242. if (who == {})
  86243. who = {player};
  86244. endif
  86245. if ((player.wizard && (length(who) == 1)) && valid(who[1]))
  86246. quota = tostr(", ", who[1].ownership_quota, " additional allowed");
  86247. else
  86248. quota = "";
  86249. endif
  86250. anc = {};
  86251. spc = "";
  86252. anc = $object_utils:ancestors(root);
  86253. for k in [1..length(anc)]
  86254. foo = anc[(length(anc) + 1) - k];
  86255. player:notify(tostr(spc, foo.name, " (", foo, ") [", foo.owner.name, " (", foo.owner, ")]"));
  86256. spc = (spc + "  ");
  86257. endfor
  86258. text = this:realm2(root, who, spc, miss);
  86259. player:notify_lines(text[2]);
  86260. player:notify(tostr("*** Objects: ", length(text[2]), " in hierarchy, ", text[1], " owned", quota, ". ***"));
  86261. .
  86262. #4:22
  86263. root = args[1];
  86264. owner = args[2];
  86265. space = args[3];
  86266. missing = args[4];
  86267. number = 0;
  86268. text = {};
  86269. set_task_perms(caller_perms());
  86270. for foo in (children(root))
  86271. $command_utils:suspend_if_needed(0);
  86272. if (!(foo in missing))
  86273. branch = this:realm2(foo, owner, space + "  ", missing);
  86274. text = {@text, @branch[2]};
  86275. number = (number + branch[1]);
  86276. endif
  86277. endfor
  86278. bra = (ket = "");
  86279. if (((((root.owner in owner) && 1) != (($nothing in owner) && 1)) && (number = (number + 1))) || ((text != {}) && ((bra = "<") && (ket = ">"))))
  86280. text = listinsert(text, tostr(space, bra, root.name, " (", root, ")", ket, @((length(owner) == 1) && (owner != {$nothing})) ? {} | {" [", valid(root.owner) ? root.owner.name | "** recycled **", " (", root.owner, ")]"}));
  86281. endif
  86282. return {number, text};
  86283. .
  86284. #4:23
  86285. "$class_registry is in the following format:";
  86286. "        { {name, description, members}, ... }";
  86287. "where `name' is the name of a particular class of objects, `description' is a one-sentence description of the membership of the class, and `members' is a list of object numbers, the members of the class.";
  86288. "";
  86289. if (args)
  86290. members = {};
  86291. for name in (args)
  86292. class = $list_utils:assoc_prefix(name, $class_registry);
  86293. if (class)
  86294. for o in (class[3])
  86295. members = setadd(members, o);
  86296. endfor
  86297. else
  86298. player:tell("There is no defined class of objects named `", name, "'; type `@classes' to see a complete list of defined classes.");
  86299. return;
  86300. endif
  86301. endfor
  86302. printed = {};
  86303. for o in (members)
  86304. what = o;
  86305. while (valid(what))
  86306. printed = setadd(printed, what);
  86307. what = parent(what);
  86308. endwhile
  86309. endfor
  86310. player:tell("Members of the class", (length(args) > 1) ? "es" | "", " named ", $string_utils:english_list(args), ":");
  86311. player:tell();
  86312. set_task_perms(player);
  86313. this:classes_2($root_class, "", members, printed);
  86314. player:tell();
  86315. else
  86316. "List all class names and descriptions";
  86317. player:tell("The following classes of objects have been defined:");
  86318. for class in ($class_registry)
  86319. name = class[1];
  86320. description = class[2];
  86321. player:tell();
  86322. player:tell("-- ", name, ": ", description);
  86323. endfor
  86324. player:tell();
  86325. player:tell("Type `@classes <name>' to see the members of the class with the given <name>.");
  86326. endif
  86327. .
  86328. #4:24
  86329. root = args[1];
  86330. indent = args[2];
  86331. members = args[3];
  86332. printed = args[4];
  86333. if (root in members)
  86334. player:tell(indent, root.name, " (", root, ")");
  86335. else
  86336. player:tell(indent, "<", root.name, " (", root, ")>");
  86337. endif
  86338. indent = (indent + "  ");
  86339. set_task_perms(caller_perms());
  86340. for c in (children(root))
  86341. $command_utils:suspend_if_needed(10);
  86342. if (c in printed)
  86343. this:classes_2(c, indent, members, printed);
  86344. endif
  86345. endfor
  86346. .
  86347. #4:25
  86348. set_task_perms(caller_perms());
  86349. if (this.recreate_enabled)
  86350. return $recycler:(verb)(@args);
  86351. else
  86352. return create(@args);
  86353. endif
  86354. .
  86355. #4:26
  86356. set_task_perms(caller_perms());
  86357. if (this.recreate_enabled)
  86358. return $recycler:(verb)(@args);
  86359. else
  86360. return recycle(@args);
  86361. endif
  86362. .
  86363. #4:27
  86364. set_task_perms(player);
  86365. if ($command_utils:object_match_failed(object = player:my_match_object(dobjstr), dobjstr))
  86366. "...bogus object...";
  86367. elseif ($command_utils:object_match_failed(parent = player:my_match_object(iobjstr), iobjstr))
  86368. "...bogus new parent...";
  86369. elseif ((this != player) && (!$object_utils:isa(player, $player)))
  86370. "...They chparented to #1 and want to chparent back to $prog.  Probably for some nefarious purpose...";
  86371. player:notify("You don't seem to already be a valid player class.  Perhaps chparenting away from the $player hierarchy was not such a good idea.  Permission denied.");
  86372. elseif (is_player(object) && (!$object_utils:isa(parent, $player)))
  86373. player:notify(tostr(object, " is a player and ", parent, " is not a player class."));
  86374. player:notify("You really *don't* want to do this.  Trust me.");
  86375. elseif (typeof(result = chparent(object, parent)) != ERR)
  86376. player:notify("Parent changed.");
  86377. elseif ((result == E_INVARG) && (valid(object) && valid(parent)))
  86378. player:notify(tostr("Some property existing on ", parent, " is defined on ", object, " or one of its descendants."));
  86379. player:notify(tostr("Try @check-chparent ", dobjstr, " to ", iobjstr));
  86380. else
  86381. player:notify(tostr(result));
  86382. endif
  86383. .
  86384. #4:28
  86385. "Copied from generic programmer (#217):@check-chparent by ur-Rog (#6349) Sun Nov  8 22:13:53 1992 PST";
  86386. "@check-chparent object to newparent";
  86387. "checks for property name conflicts that would make @chparent bomb.";
  86388. set_task_perms(player);
  86389. if (!(dobjstr && iobjstr))
  86390. player:notify(tostr("Usage:  ", verb, " <object> to <newparent>"));
  86391. elseif ($command_utils:object_match_failed(object = player:my_match_object(dobjstr), dobjstr))
  86392. "...bogus object...";
  86393. elseif ($command_utils:object_match_failed(parent = player:my_match_object(iobjstr), iobjstr))
  86394. "...bogus new parent...";
  86395. elseif (player != this)
  86396. player:notify(tostr(E_PERM));
  86397. elseif (typeof(result = $object_utils:property_conflicts(object, parent)) == ERR)
  86398. player:notify(tostr(result));
  86399. elseif (result)
  86400. su = $string_utils;
  86401. player:notify("");
  86402. player:notify(su:left("Property", 30) + "Also Defined on");
  86403. player:notify(su:left("--------", 30) + "---------------");
  86404. for r in (result)
  86405. player:notify(su:left(tostr(parent, ".", r[1]), 30) + su:from_list(listdelete(r, 1), " "));
  86406. $command_utils:suspend_if_needed(0);
  86407. endfor
  86408. else
  86409. player:notify("No property conflicts found.");
  86410. endif
  86411. .
  86412. #4:29
  86413. "Syntax:  @set <object>.<prop-name> to <value>";
  86414. "";
  86415. "Changes the value of the specified object's property to the given value.";
  86416. "You must have permission to modify the property, either because you own the property or if it is writable.";
  86417. set_task_perms(player);
  86418. if (this != player)
  86419. return player:tell(E_PERM);
  86420. endif
  86421. l = $code_utils:parse_propref(dobjstr);
  86422. if (l)
  86423. dobj = player:my_match_object(l[1], player.location);
  86424. if ($command_utils:object_match_failed(dobj, l[1]))
  86425. return;
  86426. endif
  86427. prop = l[2];
  86428. to_i = ("to" in args);
  86429. at_i = ("at" in args);
  86430. i = ((to_i && at_i) ? min(to_i, at_i) | (to_i || at_i));
  86431. iobjstr = argstr[$string_utils:word_start(argstr)[i][2] + 1..length(argstr)];
  86432. iobjstr = $string_utils:trim(iobjstr);
  86433. if (!iobjstr)
  86434. val = (dobj.(prop) = "");
  86435. iobjstr = "\"\"";
  86436. elseif (iobjstr[1] == "\"")
  86437. val = (dobj.(prop) = iobjstr);
  86438. iobjstr = (("\"" + iobjstr) + "\"");
  86439. else
  86440. val = $string_utils:to_value(iobjstr);
  86441. if (!val[1])
  86442. player:tell("Could not parse: ", iobjstr);
  86443. return;
  86444. endif
  86445. val = (dobj.(prop) = val[2]);
  86446. endif
  86447. player:tell("Property ", dobj, ".", prop, " set to ", $string_utils:print(val), ".");
  86448. else
  86449. player:tell("Property ", dobjstr, " not found.");
  86450. endif
  86451. .
  86452. #4:30
  86453. o = args[1];
  86454. if (length(args) == 2)
  86455. kids = 0;
  86456. for k in (children(o))
  86457. if (k.owner != o.owner)
  86458. kids = 2;
  86459. elseif (kids == 0)
  86460. kids = 1;
  86461. endif
  86462. endfor
  86463. "The verbs() call below might fail, but that's OK";
  86464. v = verbs(o);
  86465. if (v)
  86466. vstr = tostr("[", $string_utils:right(length(v), 3), "] ");
  86467. else
  86468. vstr = "      ";
  86469. endif
  86470. if (o.r && o.f)
  86471. r = "f";
  86472. elseif (o.r)
  86473. r = "r";
  86474. elseif (o.f)
  86475. r = "F";
  86476. else
  86477. r = " ";
  86478. endif
  86479. vstr = tostr(" kK"[kids + 1], r, this:audit_object_category(o), vstr);
  86480. else
  86481. vstr = "";
  86482. endif
  86483. if (valid(o.location))
  86484. loc = (((((o.location.owner == o.owner) ? " " | "*") + "[") + o.location.name) + "]");
  86485. elseif ($object_utils:has_property(o, "dest") && $object_utils:has_property(o, "source"))
  86486. if (!valid(o.source))
  86487. source = "Nowhere";
  86488. else
  86489. source = o.source.name;
  86490. if (o.source.owner != o.owner)
  86491. source = ("*" + source);
  86492. endif
  86493. endif
  86494. if (!valid(o.dest))
  86495. destin = "Nowhere";
  86496. else
  86497. destin = o.dest.name;
  86498. if (o.dest.owner != o.owner)
  86499. destin = ("*" + destin);
  86500. endif
  86501. endif
  86502. srclen = ((length(source) < 20) ? length(source) | 19);
  86503. destlen = ((length(destin) < 20) ? length(destin) | 19);
  86504. loc = (((" " + source[1..srclen]) + "->") + destin[1..destlen]);
  86505. elseif ($object_utils:isa(o, $room))
  86506. loc = "";
  86507. for x in (o.entrances)
  86508. if (((((typeof(x) == OBJ) && valid(x)) && (x.owner != o.owner)) && $object_utils:has_property(x, "dest")) && (x.dest == o))
  86509. loc = (((loc + (loc ? ", " | "")) + "<-*") + x.name);
  86510. endif
  86511. endfor
  86512. else
  86513. loc = " [Nowhere]";
  86514. endif
  86515. if (length(loc) > 41)
  86516. loc = (loc[1..37] + "..]");
  86517. endif
  86518. namelen = ((length(o.name) < 30) ? length(o.name) | 29);
  86519. return tostr(vstr, $string_utils:right(o, 6), " ", $string_utils:left(o.name[1..namelen], 30), loc);
  86520. .
  86521. #4:31
  86522. cl = {$player, $room, $exit, $note, $container, $thing};
  86523. cs = {"p", "R", "E", "N", "C", "T"};
  86524. if (is_player(OBJ = args[1]))
  86525. return "P";
  86526. endif
  86527. while (valid(OBJ))
  86528. if (i = (OBJ in cl))
  86529. return cs[i];
  86530. endif
  86531. OBJ = parent(OBJ);
  86532. endwhile
  86533. return " ";
  86534. .
  86535. #5:0
  86536. set_task_perms(callers() ? caller_perms() | player);
  86537. if (this.location == player)
  86538. player:tell("You already have that!");
  86539. elseif (this.location != player.location)
  86540. player:tell("I don't see that here.");
  86541. else
  86542. this:moveto(player);
  86543. if (this.location == player)
  86544. player:tell(this:take_succeeded_msg() || "Taken.");
  86545. if (msg = this:otake_succeeded_msg())
  86546. player.location:announce(player.name, " ", msg);
  86547. endif
  86548. else
  86549. player:tell(this:take_failed_msg() || "You can't pick that up.");
  86550. if (msg = this:otake_failed_msg())
  86551. player.location:announce(player.name, " ", msg);
  86552. endif
  86553. endif
  86554. endif
  86555. .
  86556. #5:1
  86557. set_task_perms(callers() ? caller_perms() | player);
  86558. if (this.location != player)
  86559. player:tell("You don't have that.");
  86560. elseif (!player.location:accept(this))
  86561. player:tell("You can't drop that here.");
  86562. else
  86563. this:moveto(player.location);
  86564. if (this.location == player.location)
  86565. player:tell_lines(this:drop_succeeded_msg() || "Dropped.");
  86566. if (msg = this:odrop_succeeded_msg())
  86567. player.location:announce(player.name, " ", msg);
  86568. endif
  86569. else
  86570. player:tell_lines(this:drop_failed_msg() || "You can't seem to drop that here.");
  86571. if (msg = this:odrop_failed_msg())
  86572. player.location:announce(player.name, " ", msg);
  86573. endif
  86574. endif
  86575. endif
  86576. .
  86577. #5:2
  86578. where = args[1];
  86579. "if (!valid(where) || this:is_unlocked_for(where))";
  86580. if (this:is_unlocked_for(where))
  86581. pass(where);
  86582. endif
  86583. .
  86584. #5:3
  86585. set_task_perms(caller_perms());
  86586. return $string_utils:pronoun_sub(this.(verb));
  86587. .
  86588. #5:4
  86589. set_task_perms(callers() ? caller_perms() | player);
  86590. if (this.location != player)
  86591. player:tell("You don't have that!");
  86592. elseif (!valid(player.location))
  86593. player:tell("I see no \"", iobjstr, "\" here.");
  86594. elseif ($command_utils:object_match_failed(who = player.location:match_object(iobjstr), iobjstr))
  86595. elseif (who.location != player.location)
  86596. player:tell("I see no \"", iobjstr, "\" here.");
  86597. elseif (who == player)
  86598. player:tell("Give it to yourself?");
  86599. else
  86600. this:moveto(who);
  86601. if (this.location == who)
  86602. player:tell("You hand ", this:title(), " to ", who:title(), ".");
  86603. who:tell(player:titlec(), " ", $gender_utils:get_conj("hands/hand", player), " you ", this:title(), ".");
  86604. else
  86605. player:tell(who:titlec(), " ", $gender_utils:get_conj("does/do", who), " not want that item.");
  86606. endif
  86607. endif
  86608. .
  86609. #5:5
  86610. "examine_key(examiner)";
  86611. "return a list of strings to be told to the player, indicating what the key on this type of object means, and what this object's key is set to.";
  86612. "the default will only tell the key to a wizard or this object's owner.";
  86613. who = args[1];
  86614. if (((caller == this) && $perm_utils:controls(who, this)) && (this.key != 0))
  86615. return {tostr(this:title(), " can only be moved to locations matching this key:"), tostr("  ", $lock_utils:unparse_key(this.key))};
  86616. endif
  86617. .
  86618. #6:0
  86619. if (caller_perms().wizard)
  86620. pass();
  86621. this.home = ((this in {$no_one, $hacker}) ? $nothing | $player_start);
  86622. if (a = $list_utils:assoc(this, {{$prog, {$prog_help, $builtin_function_help, $verb_help, $core_help}}, {$wiz, $wiz_help}}))
  86623. this.help = a[2];
  86624. else
  86625. this.help = 0;
  86626. endif
  86627. if (this != $player)
  86628. for p in ({"last_connect_place", "all_connect_places"})
  86629. clear_property(this, p);
  86630. endfor
  86631. endif
  86632. endif
  86633. .
  86634. #6:1
  86635. if (valid(caller_perms()) && (caller != this))
  86636. return E_PERM;
  86637. endif
  86638. this:("@last-connection")();
  86639. $news:check();
  86640. nm = (this:length_all_msgs() - this:length_date_le(this:get_current_message()[2]));
  86641. if (nm)
  86642. this:notify(tostr("You have new mail (", nm, " message", (nm == 1) ? "" | "s", ").", this:mail_option("expert") ? "" | "  Type 'help mail' for info on reading it."));
  86643. endif
  86644. this:mail_catch_up();
  86645. this:check_mail_lists();
  86646. .
  86647. #6:2
  86648. if (valid(caller_perms()) && (caller != this))
  86649. return E_PERM;
  86650. endif
  86651. this:expunge_rmm();
  86652. this.last_disconnect_time = time();
  86653. return;
  86654. .
  86655. #6:3
  86656. if ((caller == this) || $perm_utils:controls(caller_perms(), this))
  86657. this.help = 0;
  86658. return pass(@args);
  86659. else
  86660. return E_PERM;
  86661. endif
  86662. .
  86663. #6:4
  86664. set_task_perms(caller_perms());
  86665. if ((!is_player(this)) || caller_perms().wizard)
  86666. pass(@args);
  86667. return;
  86668. endif
  86669. "...start off with a wizard shout...";
  86670. for p in (connected_players())
  86671. if (p.wizard)
  86672. p:tell($string_utils:pronoun_sub("%N (%#) is currently trying to recycle %t (%[#t])"));
  86673. endif
  86674. endfor
  86675. "...Okay here's the fun part.";
  86676. "...Doing kill_task(task_id()) doesn't work because the server can";
  86677. "...figure out that it's okay to go ahead and recycle once the task finishes.";
  86678. "...Evidently, suspend() confuses the server sufficiently that it forgets to";
  86679. "...do the recycle once the task finishes or dies.  Now of course, we don't";
  86680. "...want suspended tasks hanging around indefinitely, so we fork something";
  86681. "...off to kill it.  This seems to work...";
  86682. t = task_id();
  86683. fork (1)
  86684. kill_task(t);
  86685. endfork
  86686. "...let him think he succeeded (should we do this ?)...no.";
  86687. "...boot_player(this)";
  86688. "...emergency life support...";
  86689. suspend(1073741823);
  86690. "...code not reached --- the patient lives...";
  86691. "...keep this around for posterity...";
  86692. if (is_player(this))
  86693. for a in (this.aliases)
  86694. $player_db:delete(a);
  86695. endfor
  86696. $player_db:delete(this.name);
  86697. endif
  86698. pass(@args);
  86699. .
  86700. #6:5
  86701. return !is_player(args[1]);
  86702. .
  86703. #6:6
  86704. "Extra parsing of player commands.  Called by $command_utils:do_huh.";
  86705. "This version of my_huh just handles features.";
  86706. if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
  86707. "Standard permissions check.";
  86708. return E_PERM;
  86709. endif
  86710. "verb - obvious                 pass - would be args";
  86711. "plist - list of prepspecs that this command matches";
  86712. "dlist and ilist - likewise for dobjspecs, iobjspecs";
  86713. verb = args[1];
  86714. pass = args[2];
  86715. plist = {"any", prepstr ? $code_utils:full_prep(prepstr) | "none"};
  86716. dlist = (dobjstr ? {"any"} | {"none", "any"});
  86717. ilist = (iobjstr ? {"any"} | {"none", "any"});
  86718. for fobj in (this.features)
  86719. if (!$recycler:valid(fobj))
  86720. this:remove_feature(fobj);
  86721. elseif (valid(loc = $object_utils:has_callable_verb(fobj, verb)[1]))
  86722. vargs = verb_args(loc, verb);
  86723. if ((vargs[2] in plist) && ((vargs[1] in dlist) && (vargs[3] in ilist)))
  86724. "(got rid of notify_huh - should write a @which command)";
  86725. "if (this.notify_huh)";
  86726. "player:notify(tostr(\"Using \", what.name, \" (\", what, \")\"));";
  86727. "endif";
  86728. set_task_perms(this);
  86729. fobj:(verb)(@pass);
  86730. "Problem with verbs of the same name. If we use which=vrb in the loop instead, we have a problem with verbs that use the variable verb.";
  86731. return 1;
  86732. endif
  86733. endif
  86734. if ($command_utils:running_out_of_time())
  86735. player:tell("You have too many features.  Parsing your command runs out of ticks while checking ", fobj.name, " (", fobj, ").");
  86736. return 1;
  86737. endif
  86738. endfor
  86739. .
  86740. #6:7
  86741. ":last_huh(verb,args)  final attempt to parse a command...";
  86742. set_task_perms(caller_perms());
  86743. verb = args[1];
  86744. args = args[2];
  86745. if ((verb[1] == "@") && (prepstr == "is"))
  86746. "... set or show _msg property ...";
  86747. set_task_perms(player);
  86748. $last_huh:(verb)(@args);
  86749. elseif (verb in {"give", "hand", "get", "take", "drop", "throw"})
  86750. $last_huh:(verb)(@args);
  86751. else
  86752. return 0;
  86753. endif
  86754. return 1;
  86755. .
  86756. #6:8
  86757. ":my_match_object(string [,location])";
  86758. return $string_utils:match_object(@{@args, this.location}[1..2], this);
  86759. .
  86760. #6:9
  86761. c = args[1];
  86762. if (c)
  86763. longear = {};
  86764. gear = {};
  86765. width = player:linelen();
  86766. half = (width / 2);
  86767. player:tell("Carrying:");
  86768. for thing in (c)
  86769. cx = tostr(" ", thing:title());
  86770. if (length(cx) > half)
  86771. longear = {@longear, cx};
  86772. else
  86773. gear = {@gear, cx};
  86774. endif
  86775. endfor
  86776. player:tell_lines($string_utils:columnize(gear, 2, width));
  86777. player:tell_lines(longear);
  86778. endif
  86779. .
  86780. #6:10
  86781. return $object_utils:has_property(this, "namec") ? this.namec | this:title();
  86782. .
  86783. #6:11
  86784. line = args[1];
  86785. if (this.pagelen)
  86786. if (!(this in connected_players()))
  86787. "...drop it on the floor...";
  86788. return 0;
  86789. elseif ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
  86790. return E_PERM;
  86791. endif
  86792. "...need wizard perms if this and this.owner are different, since...";
  86793. "...only this can notify() and only this.owner can read .linebuffer...";
  86794. if ((player == this) && (this.linetask[2] != task_id()))
  86795. "...player has started a new task...";
  86796. "....linetask[2] is the taskid of the most recent player task...";
  86797. if (this.linetask[2] != this.linetask[1])
  86798. this.linesleft = (this.pagelen - 2);
  86799. endif
  86800. this.linetask[2] = task_id();
  86801. endif
  86802. "... digest the current line...";
  86803. if (this.linelen > 0)
  86804. lbuf = {@this.linebuffer, @this:linesplit(line, this.linelen)};
  86805. else
  86806. lbuf = {@this.linebuffer, line};
  86807. endif
  86808. "... print out what we can...";
  86809. if (this.linesleft)
  86810. howmany = min(this.linesleft, length(lbuf));
  86811. for l in (lbuf[1..howmany])
  86812. notify(this, l);
  86813. endfor
  86814. this.linesleft = (this.linesleft - howmany);
  86815. lbuf[1..howmany] = {};
  86816. endif
  86817. if (lbuf)
  86818. "...see if we need to say ***More***";
  86819. if (this.linetask[1] != this.linetask[2])
  86820. "....linetask[1] is the taskid of the most recent player task";
  86821. "...   for which ***More*** was printed...";
  86822. this.linetask[1] = this.linetask[2];
  86823. fork (0)
  86824. notify(this, strsub(this.more_msg, "%n", tostr(length(this.linebuffer))));
  86825. endfork
  86826. endif
  86827. llen = length(lbuf);
  86828. if (llen > 500)
  86829. "...way too much saved text, flush some of it...";
  86830. lbuf[1..llen - 100] = {"*** buffer overflow, lines flushed ***"};
  86831. endif
  86832. endif
  86833. this.linebuffer = lbuf;
  86834. else
  86835. if (caller != this)
  86836. set_task_perms(caller_perms());
  86837. endif
  86838. if (this.linelen > 0)
  86839. for l in (this:linesplit(line, this.linelen))
  86840. notify(this, l);
  86841. endfor
  86842. else
  86843. notify(this, line);
  86844. endif
  86845. endif
  86846. .
  86847. #6:12
  86848. if ($perm_utils:controls(caller_perms(), this) || (caller == this))
  86849. set_task_perms(caller_perms());
  86850. for line in ((typeof(lines = args[1]) != LIST) ? {lines} | lines)
  86851. this:notify(line);
  86852. endfor
  86853. else
  86854. return E_PERM;
  86855. endif
  86856. .
  86857. #6:13
  86858. ":linesplit(line,len) => list of substrings of line";
  86859. "used by :notify to split up long lines if .linelen>0";
  86860. line = args[1];
  86861. len = args[2];
  86862. cline = {};
  86863. while (length(line) > len)
  86864. cutoff = rindex(line[1..len], " ");
  86865. if (nospace = (cutoff < ((4 * len) / 5)))
  86866. cutoff = (len + 1);
  86867. nospace = (line[cutoff] != " ");
  86868. endif
  86869. cline = {@cline, line[1..cutoff - 1]};
  86870. line = ((nospace ? " " | "") + line[cutoff..length(line)]);
  86871. endwhile
  86872. return {@cline, line};
  86873. .
  86874. #6:14
  86875. return abs(this.linelen);
  86876. .
  86877. #6:15
  86878. if (player != this)
  86879. "... somebody's being sneaky...";
  86880. "... Can't do set_task_perms(player) since we need to be `this'...";
  86881. "... to notify and `this.owner' to change +c properties...";
  86882. return;
  86883. elseif (!(lbuf = this.linebuffer))
  86884. this.linesleft = (this.pagelen - 2);
  86885. notify(this, "*** No more ***");
  86886. elseif (index("flush", dobjstr || "x") == 1)
  86887. this.linesleft = (this.pagelen - 2);
  86888. notify(this, tostr("*** Flushed ***  ", length(lbuf), " lines"));
  86889. this.linebuffer = {};
  86890. elseif ((index("rest", dobjstr || "x") == 1) || (!this.pagelen))
  86891. this.linesleft = (this.pagelen - 2);
  86892. for l in (lbuf)
  86893. notify(this, l);
  86894. endfor
  86895. this.linebuffer = {};
  86896. else
  86897. howmany = min(this.pagelen - 2, llen = length(lbuf = this.linebuffer));
  86898. for l in (lbuf[1..howmany])
  86899. notify(this, l);
  86900. endfor
  86901. this.linesleft = ((this.pagelen - 2) - howmany);
  86902. this.linebuffer = lbuf[howmany + 1..llen];
  86903. if (howmany < llen)
  86904. notify(this, strsub(this.more_msg, "%n", tostr(llen - howmany)));
  86905. this.linetask[1] = task_id();
  86906. endif
  86907. endif
  86908. this.linetask[2] = task_id();
  86909. .
  86910. #6:16
  86911. if (player != this)
  86912. "... someone is being sneaky...";
  86913. "... Can't do set_task_perms(player) since we need to be `this'...";
  86914. "... to notify and `this.owner' to change +c properties...";
  86915. return;
  86916. endif
  86917. linelen = player.linelen;
  86918. if (!(prepstr in {"on", "off"}))
  86919. player:notify("Usage:  @wrap on|off");
  86920. player:notify(tostr("Word wrap is currently ", (linelen > 0) ? "on" | "off", "."));
  86921. return;
  86922. endif
  86923. player.linelen = (abs(linelen) * ((prepstr == "on") ? 1 | -1));
  86924. player:notify(tostr("Word wrap is now ", prepstr, "."));
  86925. .
  86926. #6:17
  86927. if (callers() ? (caller != this) && (!$perm_utils:controls(caller_perms(), this)) | (player != this))
  86928. "... somebody is being sneaky ...";
  86929. return;
  86930. endif
  86931. curlen = player.linelen;
  86932. wrap = (curlen > 0);
  86933. wrapstr = (wrap ? "on" | "off");
  86934. if (!dobjstr)
  86935. player:notify(tostr("Usage:  ", verb, " <number>"));
  86936. player:notify(tostr("Current line length is ", abs(curlen), ".  Word wrapping is ", wrapstr, "."));
  86937. return;
  86938. endif
  86939. newlen = tonum(dobjstr);
  86940. if (newlen < 0)
  86941. player:notify("Line length can't be a negative number.");
  86942. return;
  86943. elseif (newlen < 10)
  86944. player:notify("You don't want your linelength that small.  Setting it to 10.");
  86945. newlen = 10;
  86946. endif
  86947. this:set_linelength(newlen);
  86948. player:notify(tostr("Line length is now ", abs(player.linelen), ".  Word wrapping is ", wrapstr, "."));
  86949. if (!wrap)
  86950. player:notify("To enable word wrapping, type `@wrap on'.");
  86951. endif
  86952. .
  86953. #6:18
  86954. "@pagelength number  -- sets page buffering to that many lines (or 0 to turn off page buffering)";
  86955. if (player != this)
  86956. "... somebody is being sneaky ...";
  86957. "... Can't do set_task_perms(player) since we need to be `this'...";
  86958. "... to notify and `this.owner' to change +c properties...";
  86959. return;
  86960. elseif (!dobjstr)
  86961. notify(player, tostr("Usage:  ", verb, " <number>"));
  86962. notify(player, tostr("Current page length is ", player.pagelen, "."));
  86963. return;
  86964. elseif (0 > (newlen = tonum(dobjstr)))
  86965. notify(player, "Page length can't be a negative number.");
  86966. return;
  86967. elseif (newlen == 0)
  86968. player.pagelen = 0;
  86969. notify(player, "Page buffering off.");
  86970. elseif (newlen < 5)
  86971. player.pagelen = 5;
  86972. notify(player, "Too small.  Setting it to 5.");
  86973. else
  86974. notify(player, tostr("Page length is now ", player.pagelen = newlen, "."));
  86975. endif
  86976. if (this.linebuffer)
  86977. notify(this, strsub(this.more_msg, "%n", tostr(length(this.linebuffer))));
  86978. player.linetask = {task_id(), task_id()};
  86979. player.linesleft = 0;
  86980. else
  86981. player.linetask = {0, task_id()};
  86982. player.linesleft = (player.pagelen - 2);
  86983. endif
  86984. .
  86985. #6:19
  86986. if (this.gaglist || this.paranoid)
  86987. "Check the above first, default case, to save ticks.  Paranoid gaggers are cost an extra three or so ticks by this, probably a net savings.";
  86988. if (this:gag_p())
  86989. return;
  86990. endif
  86991. if (this.paranoid == 1)
  86992. if (((len = length(this.responsible = {@this.responsible, {{@callers(), {player, "<cmd-line>", player}}, args}})) * 2) > (this.lines * 3))
  86993. this.responsible = this.responsible[(len - this.lines) + 1..len];
  86994. endif
  86995. elseif (this.paranoid == 2)
  86996. z = this:whodunnit({@callers(), {player, "", player}}, {this, $no_one}, {})[3];
  86997. args = {"(", z.name, " ", z, ") ", @args};
  86998. else
  86999. this.responsible = {};
  87000. endif
  87001. endif
  87002. pass(@args);
  87003. .
  87004. #6:20
  87005. if (player in this.gaglist)
  87006. return 1;
  87007. elseif (this.gaglist)
  87008. for x in (callers())
  87009. if (valid(x[1]))
  87010. if (x[1] in this.gaglist)
  87011. return 1;
  87012. endif
  87013. endif
  87014. endfor
  87015. endif
  87016. return 0;
  87017. .
  87018. #6:21
  87019. ":set_gaglist(@newlist) => this.gaglist = newlist";
  87020. if (!((caller == this) || $perm_utils:controls(caller_perms(), this)))
  87021. return E_PERM;
  87022. else
  87023. return this.gaglist = args;
  87024. endif
  87025. .
  87026. #6:22
  87027. set_task_perms(player);
  87028. if (player != this)
  87029. player:notify("Permission denied.");
  87030. return;
  87031. endif
  87032. if (!args)
  87033. player:notify(tostr("Usage:  ", verb, " <player or object> [<player or object>...]"));
  87034. return;
  87035. endif
  87036. victims = $string_utils:match_player_or_object(@args);
  87037. changed = 0;
  87038. for p in (victims)
  87039. if (p in player.gaglist)
  87040. player:notify(tostr("You are already gagging ", p.name, "."));
  87041. elseif (p == player)
  87042. player:notify("Gagging yourself is a bad idea.");
  87043. else
  87044. changed = 1;
  87045. player:set_gaglist(@setadd(this.gaglist, p));
  87046. endif
  87047. endfor
  87048. if (changed)
  87049. this:("@listgag")("but don't fork");
  87050. endif
  87051. .
  87052. #6:23
  87053. set_task_perms(valid(caller_perms()) ? caller_perms() | player);
  87054. if (!this.gaglist)
  87055. player:notify(tostr("You are ", callers() ? "no longer gagging anything." | "not gagging anything right now."));
  87056. else
  87057. player:notify(tostr("You are ", callers() ? "now" | "currently", " gagging ", $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", this.gaglist)), "."));
  87058. endif
  87059. gl = {};
  87060. if (!args)
  87061. for p in (players())
  87062. if ((typeof(p.gaglist) == LIST) && (this in p.gaglist))
  87063. gl = {@gl, p};
  87064. endif
  87065. $command_utils:suspend_if_needed(0);
  87066. endfor
  87067. if (gl || (!callers()))
  87068. player:notify(tostr($string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", gl), "No one"), " appear", (length(gl) <= 1) ? "s" | "", " to be gagging you."));
  87069. endif
  87070. endif
  87071. .
  87072. #6:24
  87073. if ((player != this) || ((caller != this) && (!$perm_utils:controls(caller_perms(), this))))
  87074. player:notify("Permission denied.");
  87075. elseif (dobjstr == "")
  87076. player:notify(tostr("Usage:  ", verb, " <player>  or  ", verb, " everyone"));
  87077. elseif (dobjstr == "everyone")
  87078. this.gaglist = {};
  87079. player:notify("You are no longer gagging anyone or anything.");
  87080. else
  87081. if (valid(dobj))
  87082. match = dobj;
  87083. elseif ((match = toobj(dobjstr)) > #0)
  87084. else
  87085. match = $string_utils:match(dobjstr, this.gaglist, "name", this.gaglist, "aliases");
  87086. endif
  87087. if (match == $failed_match)
  87088. player:notify(tostr("You don't seem to be gagging anything named ", dobjstr, "."));
  87089. elseif (match == $ambiguous_match)
  87090. player:notify(tostr("I don't know which \"", dobjstr, "\" you mean."));
  87091. else
  87092. this.gaglist = setremove(this.gaglist, match);
  87093. player:notify(tostr(valid(match) ? match.name | match, " removed from gag list."));
  87094. endif
  87095. this:("@listgag")("but don't fork");
  87096. endif
  87097. .
  87098. #6:25
  87099. record = args[1];
  87100. trust = args[2];
  87101. mistrust = args[3];
  87102. s = {this, "???", this};
  87103. for w in (record)
  87104. if (((s[3].wizard || (s[3] in trust)) && (!(s[3] in mistrust))) || (s[1] == this))
  87105. s = w;
  87106. else
  87107. return s;
  87108. endif
  87109. endfor
  87110. return s;
  87111. .
  87112. #6:26
  87113. if (length(verb) <= 6)
  87114. "@check, not @check-full";
  87115. n = 5;
  87116. trust = {this, $no_one};
  87117. "... trust no one, my friend.... no one....  --Herod";
  87118. mistrust = {};
  87119. for k in (args)
  87120. if (z = $code_utils:tonum(k))
  87121. n = z;
  87122. elseif (k[1] == "!")
  87123. mistrust = listappend(mistrust, $string_utils:match_player(k[2..length(k)]));
  87124. else
  87125. trust = listappend(trust, $string_utils:match_player(k));
  87126. endif
  87127. endfor
  87128. msg_width = (player:linelen() - 60);
  87129. for q in ((n > (y = length(z = this.responsible))) ? z | z[(y - n) + 1..y])
  87130. msg = tostr(@q[2]);
  87131. if (length(msg) > msg_width)
  87132. msg = msg[1..msg_width];
  87133. endif
  87134. s = this:whodunnit(q[1], trust, mistrust);
  87135. text = (valid(s[1]) ? s[1].name | "** NONE **");
  87136. this:notify(tostr($string_utils:left(tostr((length(text) > 13) ? text[1..13] | text, " (", s[1], ")"), 20), $string_utils:left(s[2], 15), $string_utils:left(tostr((length(s[3].name) > 13) ? s[3].name[1..13] | s[3].name, " (", s[3], ")"), 20), msg));
  87137. endfor
  87138. this:notify("*** finished ***");
  87139. this.responsible = z;
  87140. else
  87141. "@check-full, from @traceback by APHiD";
  87142. matches = {};
  87143. if (length(match = argstr) == 0)
  87144. player:notify(tostr("Usage: ", verb, " <string> --or-- ", verb, " <number>"));
  87145. return;
  87146. endif
  87147. if (!(responsible = player.responsible))
  87148. player:notify("No text has been saved by the monitor.  (See `help @paranoid').");
  87149. else
  87150. if (typeof(x = $code_utils:tonum(argstr)) == ERR)
  87151. for line in (responsible)
  87152. if (index(tostr(@line[length(line)]), argstr))
  87153. matches = {@matches, line};
  87154. endif
  87155. endfor
  87156. else
  87157. matches = this.responsible[((l = length(this.responsible)) - x) + 1..l];
  87158. endif
  87159. if (matches)
  87160. linelen = player:linelen();
  87161. string_utils = $string_utils;
  87162. list_utils = $list_utils;
  87163. for match in (matches)
  87164. $command_utils:suspend_if_needed(3);
  87165. text = tostr(@match[length(match)]);
  87166. player:notify("Traceback for:");
  87167. player:notify(text);
  87168. verbwidth = 0;
  87169. for verbitem in (list_utils:slice(mm = listdelete(mm = match[1], length(mm)), 2))
  87170. verbwidth = max(verbwidth, length(verbitem));
  87171. endfor
  87172. numwidth = (((linelen - verbwidth) / 4) - 1);
  87173. widths = {numwidth, verbwidth, numwidth, numwidth, numwidth};
  87174. top = (l = (between = ""));
  87175. for x in [1..5]
  87176. top = ((top + between) + string_utils:left({"This", "Verb", "Programmer", "VerbLocation", "Player"}[x], -widths[x]));
  87177. l = ((l + between) + string_utils:space(widths[x], "-"));
  87178. between = " ";
  87179. endfor
  87180. player:notify(top);
  87181. player:notify(l);
  87182. for line in (listdelete(mm = match[1], length(mm)))
  87183. output = {};
  87184. for bit in [1..5]
  87185. output = {@output, string_utils:left((typeof(word = line[bit]) == STR) ? word | tostr(word, "(", valid(word) ? list_utils:shortest({word.name, @word.aliases}) | ((word == $nothing) ? "invalid" | ((word == $ambiguous_match) ? "ambiguous match" | "Error")), ")"), -widths[bit]), " "};
  87186. endfor
  87187. player:notify(string_utils:trimr(tostr(@output)));
  87188. endfor
  87189. player:notify(l);
  87190. endfor
  87191. player:notify("**** finished ****");
  87192. else
  87193. player:notify(tostr("No matches for \"", argstr, "\" found."));
  87194. endif
  87195. endif
  87196. endif
  87197. .
  87198. #6:27
  87199. if ((args == {}) || ((typ = args[1]) == ""))
  87200. this.lines = 20;
  87201. this.paranoid = 1;
  87202. this:notify("Anti-spoofer on and keeping 20 lines.");
  87203. elseif (index("immediate", typ))
  87204. this.lines = 0;
  87205. this.paranoid = 2;
  87206. this:notify("Anti-spoofer now in immediate mode.");
  87207. elseif (index("off", typ) || (typ == "0"))
  87208. this.paranoid = 0;
  87209. this.lines = 0;
  87210. this:notify("Anti-spoofer off.");
  87211. elseif ((tostr(y = tonum(typ)) != typ) || (y < 0))
  87212. this:notify(tostr("Usage: ", verb, " <lines to be kept>     to turn on your anti-spoofer."));
  87213. this:notify(tostr("       ", verb, " off                    to turn it off."));
  87214. this:notify(tostr("       ", verb, " immediate              to use immediate mode."));
  87215. else
  87216. this.paranoid = 1;
  87217. this.lines = (y = min(y, 30));
  87218. this:notify(tostr("Anti-spoofer on and keeping ", y, " lines."));
  87219. endif
  87220. .
  87221. #6:28
  87222. buggers = 1;
  87223. found_listener = 0;
  87224. here = this.location;
  87225. for thing in (setremove(here.contents, this))
  87226. tellwhere = $object_utils:has_verb(thing, "tell");
  87227. notifywhere = $object_utils:has_verb(thing, "notify");
  87228. if (thing in connected_players())
  87229. this:notify(tostr(thing.name, " (", thing, ") is listening."));
  87230. found_listener = 1;
  87231. elseif ($object_utils:has_callable_verb(thing, "sweep_msg") && (typeof(msg = thing:sweep_msg()) == STR))
  87232. this:notify(tostr(thing.name, " (", thing, ") ", msg, "."));
  87233. found_listener = 1;
  87234. elseif (tellwhere && (((owner = verb_info(tellwhere[1], "tell")[1]) != this) && (!owner.wizard)))
  87235. this:notify(tostr(thing.name, " (", thing, ") has been taught to listen by ", owner.name, " (", owner, ")"));
  87236. found_listener = 1;
  87237. elseif (notifywhere && (((owner = verb_info(notifywhere[1], "notify")[1]) != this) && (!owner.wizard)))
  87238. this:notify(tostr(thing.name, " (", thing, ") has been taught to listen by ", owner.name, " (", owner, ")"));
  87239. found_listener = 1;
  87240. endif
  87241. endfor
  87242. buggers = {};
  87243. for v in ({"announce", "announce_all", "announce_all_but", "say", "emote", "huh", "here_huh", "huh2", "whisper"})
  87244. vwhere = $object_utils:has_verb(here, v);
  87245. if (vwhere && (((owner = verb_info(vwhere[1], v)[1]) != this) && (!owner.wizard)))
  87246. buggers = setadd(buggers, owner);
  87247. endif
  87248. endfor
  87249. if (buggers != {})
  87250. if ($object_utils:has_verb(here, "sweep_msg") && (typeof(msg = here:sweep_msg()) == STR))
  87251. this:notify(tostr(here.name, " (", here, ") ", msg, "."));
  87252. else
  87253. this:notify(tostr(here.name, " (", here, ") may have been bugged by ", $string_utils:english_list($list_utils:map_prop(buggers, "name")), "."));
  87254. endif
  87255. elseif (!found_listener)
  87256. this:notify("Communications look secure.");
  87257. endif
  87258. .
  87259. #6:29
  87260. this:tell(player.name, " whispers, \"", dobjstr, "\"");
  87261. player:tell("You whisper, \"", dobjstr, "\" to ", this.name, ".");
  87262. .
  87263. #6:30
  87264. nargs = length(args);
  87265. if (nargs < 1)
  87266. player:notify(tostr("Usage: ", verb, " <player> [with <message>]"));
  87267. return;
  87268. endif
  87269. who = $string_utils:match_player(args[1]);
  87270. if ($command_utils:player_match_result(who, args[1])[1])
  87271. return;
  87272. elseif (who in this.gaglist)
  87273. player:tell("You have ", who:title(), " @gagged.  If you paged ", who.po, ", ", who.ps, " wouldn't be able to answer you.");
  87274. return;
  87275. endif
  87276. "for pronoun_sub's benefit...";
  87277. dobj = who;
  87278. iobj = player;
  87279. header = player:page_origin_msg();
  87280. text = "";
  87281. if (nargs > 1)
  87282. if ((args[2] == "with") && (nargs > 2))
  87283. msg_start = 3;
  87284. else
  87285. msg_start = 2;
  87286. endif
  87287. msg = $string_utils:from_list(args[msg_start..nargs], " ");
  87288. text = tostr($string_utils:pronoun_sub(($string_utils:index_delimited(header, player.name) ? "%S" | "%N") + " %<pages>, \""), msg, "\"");
  87289. endif
  87290. result = (text ? who:receive_page(header, text) | who:receive_page(header));
  87291. if (result == 2)
  87292. "not connected";
  87293. player:tell((typeof(msg = who:page_absent_msg()) == STR) ? msg | $string_utils:pronoun_sub("%n is not currently logged in.", who));
  87294. else
  87295. player:tell(who:page_echo_msg());
  87296. endif
  87297. .
  87298. #6:31
  87299. "called by $player:page.  Two args, the page header and the text, all pre-processed by the page command.  Could be extended to provide haven abilities, multiline pages, etc.  Indeed, at the moment it just does :tell_lines, so we already do have multiline pages, if someone wants to take advantage of it.";
  87300. "Return codes:";
  87301. "  1:  page was received";
  87302. "  2:  player is not connected";
  87303. "  0:  page refused";
  87304. "If a specialization wants to refuse a page, it should return 0 to say it was refused.  If it uses pass(@args) it should propagate back up the return value.  It is possible that this code should interact with gagging and return 0 if the page was gagged.";
  87305. if (this:is_listening())
  87306. this:tell_lines(args);
  87307. return 1;
  87308. else
  87309. return 2;
  87310. endif
  87311. .
  87312. #6:32
  87313. "set_task_perms(this.owner)";
  87314. return (msg = this.(verb)) ? $string_utils:pronoun_sub(this.(verb), this) | "";
  87315. .
  87316. #6:33
  87317. if (c = player:contents())
  87318. this:tell_contents(c);
  87319. else
  87320. player:tell("You are empty-handed.");
  87321. endif
  87322. .
  87323. #6:34
  87324. pass();
  87325. if (!(this in connected_players()))
  87326. player:tell($gender_utils:pronoun_sub("%{:He} %{!is} sleeping.", this));
  87327. elseif ((idle = idle_seconds(this)) < 60)
  87328. player:tell($gender_utils:pronoun_sub("%{:He} %{!is} awake and %{!looks} alert.", this));
  87329. else
  87330. time = $string_utils:from_seconds(idle);
  87331. player:tell($gender_utils:pronoun_sub("%{:He} %{!is} awake, but %{!has} been staring off into space for ", this), time, ".");
  87332. endif
  87333. if (c = this:contents())
  87334. this:tell_contents(c);
  87335. endif
  87336. .
  87337. #6:35
  87338. start = this.location;
  87339. if (start == this.home)
  87340. player:tell("You're already home!");
  87341. return;
  87342. elseif (typeof(this.home) != OBJ)
  87343. player:tell("You've got a weird home, pal.  I've reset it to the default one.");
  87344. this.home = $player_start;
  87345. elseif (!valid(this.home))
  87346. player:tell("Oh no!  Your home's been recycled.  Time to look around for a new one.");
  87347. this.home = $player_start;
  87348. else
  87349. player:tell("You click your heels three times.");
  87350. endif
  87351. this:moveto(this.home);
  87352. if (!valid(start))
  87353. elseif (start == this.location)
  87354. start:announce(player.name, " learns that you can never go home...");
  87355. else
  87356. start:announce(player.name, " goes home.");
  87357. endif
  87358. if (this.location == this.home)
  87359. this.location:announce(player.name, " comes home.");
  87360. elseif (this.location == start)
  87361. player:tell("Either home doesn't want you, or you don't really want to go.");
  87362. else
  87363. player:tell("Wait a minute!  This isn't your home...");
  87364. if (valid(this.location))
  87365. this.location:announce(player.name, " arrives, looking quite bewildered.");
  87366. endif
  87367. endif
  87368. .
  87369. #6:36
  87370. set_task_perms(this);
  87371. here = this.location;
  87372. if (!$object_utils:has_callable_verb(here, "accept_for_abode"))
  87373. player:notify("This is a pretty odd place.  You should make your home in an actual room.");
  87374. elseif (here:accept_for_abode(this))
  87375. this.home = here;
  87376. player:notify(tostr(here.name, " is your new home."));
  87377. else
  87378. player:notify(tostr("This place doesn't want to be your home.  Contact ", here.owner.name, " to be added to the residents list of this place, or choose another place as your home."));
  87379. endif
  87380. .
  87381. #6:37
  87382. player:tell("This is not a pick-up joint!");
  87383. this:tell(player.name, " tried to pick you up.");
  87384. .
  87385. #6:38
  87386. set_task_perms((caller == this) ? this | $no_one);
  87387. dobj = this:my_match_object(dobjstr);
  87388. iobj = this:my_match_object(iobjstr);
  87389. if ($command_utils:object_match_failed(dobj, dobjstr) || ((iobj != $nothing) && $command_utils:object_match_failed(iobj, iobjstr)))
  87390. return;
  87391. endif
  87392. if ((!$perm_utils:controls(this, dobj)) && (this != dobj))
  87393. player:tell("You may only @move your own things.");
  87394. return;
  87395. endif
  87396. old_loc = dobj.location;
  87397. if (old_loc == iobj)
  87398. player:tell(dobj.name, " is already ", valid(iobj) ? "in " + iobj.name | "nowhere", ".");
  87399. return;
  87400. endif
  87401. dobj:moveto(iobj);
  87402. if (dobj.location == iobj)
  87403. player:tell("Moved.");
  87404. if (is_player(dobj))
  87405. if (valid(old_loc))
  87406. old_loc:announce_all(dobj.name, " disappears suddenly for parts unknown.");
  87407. if (dobj != player)
  87408. dobj:tell("You have been moved by ", player.name, ".");
  87409. endif
  87410. endif
  87411. if (valid(dobj.location))
  87412. dobj.location:announce(dobj.name, " materializes out of thin air.");
  87413. endif
  87414. endif
  87415. elseif (dobj.location == old_loc)
  87416. if ($object_utils:contains(dobj, iobj))
  87417. player:tell(iobj.name, " is inside of ", dobj.name, "!");
  87418. else
  87419. player:tell($string_utils:pronoun_sub("Either %d doesn't want to go, or %i doesn't want to accept %[dpo]."));
  87420. endif
  87421. elseif (dobj == player)
  87422. player:tell("You have been deflected from your original destination.");
  87423. else
  87424. player:tell($string_utils:pronoun_sub("%D has been deflected from %[dpp] original destination."));
  87425. endif
  87426. .
  87427. #6:39
  87428. set_task_perms(player);
  87429. if (iobjstr == "here")
  87430. iobj = player.location;
  87431. elseif (iobjstr == "me")
  87432. iobj = player;
  87433. elseif ($command_utils:object_match_failed(iobj, iobjstr))
  87434. return;
  87435. endif
  87436. if (!$perm_utils:controls(player, iobj))
  87437. player:notify(tostr("You are not the owner of ", iobj.name, "."));
  87438. return;
  87439. endif
  87440. if (dobjstr == "me")
  87441. dobj = player;
  87442. elseif (($failed_match == (dobj = $string_utils:literal_object(dobjstr))) && $command_utils:object_match_failed(dobj = iobj:match(dobjstr), dobjstr))
  87443. return;
  87444. endif
  87445. if (dobj.location != iobj)
  87446. player:notify(tostr(dobj.name, "(", dobj, ") is not in ", iobj.name, "(", iobj, ")."));
  87447. return;
  87448. endif
  87449. if (dobj.wizard)
  87450. player:notify(tostr("Sorry, you can't ", verb, " a wizard."));
  87451. dobj:tell(player.name, " tried to ", verb, " you.");
  87452. return;
  87453. endif
  87454. iobj:eject(dobj);
  87455. player:notify($object_utils:has_callable_verb(iobj, "ejection_msg") ? iobj:ejection_msg() | $room:ejection_msg());
  87456. dobj:tell($object_utils:has_callable_verb(iobj, "victim_ejection_msg") ? iobj:victim_ejection_msg() | $room:victim_ejection_msg());
  87457. iobj:announce_all_but({player, dobj}, $object_utils:has_callable_verb(iobj, "oejection_msg") ? iobj:oejection_msg() | $room:oejection_msg());
  87458. .
  87459. #6:40
  87460. if (!args)
  87461. them = connected_players();
  87462. else
  87463. who = $command_utils:player_match_result($string_utils:match_player(args), args);
  87464. if (length(who) <= 1)
  87465. if (!who[1])
  87466. player:notify("Where is who?");
  87467. endif
  87468. return;
  87469. elseif (who[1])
  87470. player:notify("");
  87471. endif
  87472. them = listdelete(who, 1);
  87473. endif
  87474. lmax = (rmax = 0);
  87475. for p in (them)
  87476. player:notify($string_utils:pronoun_sub("%N (%#) is in %l (%[#l]).", p));
  87477. endfor
  87478. .
  87479. #6:41
  87480. if (caller != player)
  87481. return E_PERM;
  87482. endif
  87483. plyrs = (args ? listdelete($command_utils:player_match_result($string_utils:match_player(args), args), 1) | connected_players());
  87484. if (!plyrs)
  87485. return;
  87486. endif
  87487. $code_utils:show_who_listing(plyrs);
  87488. .
  87489. #6:42
  87490. "@wizards [all]";
  87491. if (caller != player)
  87492. return E_PERM;
  87493. endif
  87494. if (args)
  87495. $code_utils:show_who_listing($wiz_utils:all_wizards());
  87496. else
  87497. $code_utils:show_who_listing($wiz_utils:connected_wizards()) || player:notify("No wizards currently logged in.");
  87498. endif
  87499. .
  87500. #6:43
  87501. set_task_perms(callers() ? caller_perms() | player);
  87502. "...this code explicitly relies on being !d in several places...";
  87503. if ((index(verb, "?") != 1) || (length(verb) <= 1))
  87504. what = $string_utils:trimr(argstr);
  87505. elseif (argstr)
  87506. what = tostr(verb[2..length(verb)], " ", $string_utils:trimr(argstr));
  87507. else
  87508. what = verb[2..length(verb)];
  87509. endif
  87510. "...find a db that claims to know about `what'...";
  87511. dblist = $code_utils:help_db_list();
  87512. result = $code_utils:help_db_search(what, dblist);
  87513. if (!result)
  87514. "... note: all of the last-resort stuff...";
  87515. "... is now located on $help:find_topics/get_topic...";
  87516. "$wiz_utils:missed_help(what, result)";
  87517. player:notify(tostr("Sorry, but no help is available on `", what, "'."));
  87518. elseif (result[1] == $ambiguous_match)
  87519. "$wiz_utils:missed_help(what, result)";
  87520. player:notify_lines(tostr("Sorry, but the topic-name `", what, "' is ambiguous.  I don't know which of the following topics you mean:"));
  87521. for x in ($string_utils:columnize($help:sort_topics(result[2]), 3, 60))
  87522. player:notify(tostr("   ", x));
  87523. endfor
  87524. else
  87525. help = result[1];
  87526. topic = result[2];
  87527. if (topic != what)
  87528. player:notify(tostr("Showing help on `", topic, "':"));
  87529. player:notify("----");
  87530. endif
  87531. dblist = dblist[1 + (help in dblist)..length(dblist)];
  87532. if (1 == (text = help:get_topic(topic, dblist)))
  87533. "...get_topic took matters into its own hands...";
  87534. elseif (text)
  87535. "...these can get long...";
  87536. for line in ((typeof(text) == LIST) ? text | {text})
  87537. if (typeof(line) != STR)
  87538. player:notify("Odd results from help -- complain to a wizard.");
  87539. else
  87540. player:notify(line);
  87541. endif
  87542. $command_utils:suspend_if_needed(0);
  87543. endfor
  87544. else
  87545. player:notify(tostr("Help DB ", help, " thinks it knows about `", what, "' but something's messed up."));
  87546. player:notify(tostr("Tell ", help.owner.wizard ? "" | tostr(help.owner.name, " (", help.owner, ") or "), "a wizard."));
  87547. endif
  87548. endif
  87549. .
  87550. #6:44
  87551. $news:read();
  87552. .
  87553. #6:45
  87554. if (typeof(mf = this.(verb)) == STR)
  87555. return $string_utils:pronoun_sub(mf, @args);
  87556. else
  87557. return mf;
  87558. endif
  87559. .
  87560. #6:46
  87561. ":receive_message(msg,from)";
  87562. if ((!$perm_utils:controls(caller_perms(), this)) && (caller != this))
  87563. return E_PERM;
  87564. else
  87565. set_task_perms(this.owner);
  87566. new = this:new_message_num();
  87567. ncur = ((new <= 1) ? 0 | min(this:current_message(this), new));
  87568. this:set_current_message(this, ncur);
  87569. new = max(new, ncur + 1);
  87570. this.messages = {@this.messages, {new, args[1]}};
  87571. "... new-mail notification is now done directly by $mail_agent:raw_send";
  87572. "... see :notify_mail...";
  87573. return new;
  87574. endif
  87575. .
  87576. #6:47
  87577. ":display_message(preamble,msg) --- prints msg to player.";
  87578. vb = (((this._mail_task == task_id()) || (caller == $mail_editor)) ? "notify_lines" | "tell_lines");
  87579. preamble = args[1];
  87580. player:(vb)({@(typeof(preamble) == LIST) ? preamble | {preamble}, @args[2], "--------------------------"});
  87581. .
  87582. #6:48
  87583. "parse_message_seq(strings,cur)         => msg_seq";
  87584. "messages_in_seq(msg_seq);              => text of messages in msg_seq";
  87585. "display_seq_headers(msg_seq[,current]) :displays summary lines of those msgs";
  87586. "rmm_message_seq(msg_seq)               => string giving msg numbers removed";
  87587. "undo_rmm()    => msg_seq of restored messages";
  87588. "expunge_rmm() => number of messages expunged";
  87589. "list_rmm()    => number of messages awaiting expunge";
  87590. "renumber(cur) => {number of messages in folder, new_cur}";
  87591. "";
  87592. "See the corresponding routines on $mail_agent.";
  87593. if ((caller == $mail_agent) || $perm_utils:controls(caller_perms(), this))
  87594. set_task_perms(this.owner);
  87595. return $mail_agent:(verb)(@args);
  87596. else
  87597. return E_PERM;
  87598. endif
  87599. .
  87600. #6:49
  87601. return $mail_agent:msg_summary_line(@args);
  87602. .
  87603. #6:50
  87604. return $mail_agent:to_text(@args);
  87605. .
  87606. #6:51
  87607. ":notify_mail(from,recipients[,msgnums])";
  87608. " used by $mail_agent:raw_send to notify this player about mail being sent";
  87609. " from <from> to <recipients>.  <msgnums> if given gives the message number(s) assigned (in the event that the corresponding recipient actually kept the mail)";
  87610. if (!$object_utils:connected(this))
  87611. return;
  87612. elseif (!((caller in {this, $mail_agent}) || $perm_utils:controls(caller_perms(), this)))
  87613. return E_PERM;
  87614. else
  87615. from = args[1];
  87616. recipients = args[2];
  87617. msgnums = {@args, {}}[3];
  87618. "... msgnums may be shorter than recipients or may have some slots filled";
  87619. "... with 0's if msg numbers are not available for some recipients.";
  87620. if ((t = (this in recipients)) && ((length(msgnums) >= t) && msgnums[t]))
  87621. "... you are getting the mail and moreover your :receive_message kept it.";
  87622. namelist = $string_utils:english_list($list_utils:map_arg($mail_agent, "name", setremove(recipients, this)), "");
  87623. this:notify(tostr("You have new mail (", msgnums[t], ") from ", from.name, " (", from, ")", namelist ? " which was also sent to " + namelist | "", "."));
  87624. if (!this:mail_option("expert"))
  87625. this:notify(tostr("Type `help mail' for info on reading it."));
  87626. endif
  87627. else
  87628. "... vanilla notification; somebody got sent mail and you're finding out.";
  87629. namelist = $string_utils:english_list({@t ? {"You"} | {}, @$list_utils:map_arg($mail_agent, "name", setremove(recipients, this))}, "");
  87630. this:notify(tostr(namelist, (length(recipients) == 1) ? " has" | " have", " just been sent new mail by ", from.name, " (", from, ")."));
  87631. endif
  87632. endif
  87633. .
  87634. #6:52
  87635. "runs the old->new format conversion on every message in this.messages.";
  87636. " => 1 if successful";
  87637. " => 0 if anything toward happened during a suspension";
  87638. "      (e.g., new message received, someone deleted stuff) ";
  87639. "      in which case this.messages is left as if this routine were never run.";
  87640. if (!$perm_utils:controls(caller_perms(), this))
  87641. return E_PERM;
  87642. endif
  87643. msgs = {};
  87644. i = 1;
  87645. for m in (oldmsgs = this.messages)
  87646. msgs = {@msgs, {m[1], $mail_agent:__convert_new(@m[2])}};
  87647. if ($command_utils:running_out_of_time())
  87648. player:notify(tostr("...", i, " ", this));
  87649. suspend(0);
  87650. if (oldmsgs != this.messages)
  87651. return 0;
  87652. endif
  87653. endif
  87654. i = (i + 1);
  87655. endfor
  87656. this.messages = msgs;
  87657. return 1;
  87658. .
  87659. #6:53
  87660. ":current_message([recipient])";
  87661. " => current message number for the given recipient (defaults to this).";
  87662. " => 0 if we have no record of that recipient.";
  87663. if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
  87664. $error:raise(E_PERM);
  87665. elseif ((!args) || (args[1] == this))
  87666. return this.current_message[1];
  87667. elseif (a = $list_utils:assoc(args[1], this.current_message))
  87668. return a[2];
  87669. else
  87670. return 0;
  87671. endif
  87672. .
  87673. #6:54
  87674. ":get_current_message([recipient])";
  87675. " => {msg_num, last_read_date} for the given recipient.";
  87676. " => 0 if we have no record of that recipient.";
  87677. if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
  87678. $error:raise(E_PERM);
  87679. elseif ((!args) || (args[1] == this))
  87680. return this.current_message[1..2];
  87681. elseif (a = $list_utils:assoc(args[1], this.current_message))
  87682. return a[2..3];
  87683. else
  87684. return 0;
  87685. endif
  87686. .
  87687. #6:55
  87688. ":set_current_message(recipient[,number[,date]])";
  87689. "Returns the new {number,last-read-date} pair for recipient.";
  87690. if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
  87691. return $error:raise(E_PERM);
  87692. endif
  87693. recip = args[1];
  87694. number = {@args, E_NONE}[2];
  87695. date = {@args, 0, 0}[3];
  87696. cm = this.current_message;
  87697. if (recip == this)
  87698. this.current_message[2] = max(date, cm[2]);
  87699. if (number != E_NONE)
  87700. this.current_message[1] = number;
  87701. endif
  87702. return this.current_message[1..2];
  87703. elseif (i = $list_utils:iassoc(recip, cm))
  87704. return (this.current_message[i] = {recip, (number == E_NONE) ? cm[i][2] | number, max(date, cm[i][3])})[2..3];
  87705. else
  87706. entry = {recip, (number != E_NONE) && number, date};
  87707. this.current_message = {@cm, entry};
  87708. return entry[2..3];
  87709. endif
  87710. .
  87711. #6:56
  87712. ":make_current_message(recipient)";
  87713. "starts a new current_message record for recipient";
  87714. if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
  87715. return $error:raise(E_PERM);
  87716. elseif (((recip = args[1]) != this) && (!$list_utils:assoc(recip, cm = this.current_message)))
  87717. this.current_message = listappend(cm, {recip, 0, 0});
  87718. endif
  87719. .
  87720. #6:57
  87721. ":kill_current_message(recipient)";
  87722. "entirely forgets current message for this recipient...";
  87723. "Returns true iff successful.";
  87724. if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
  87725. return $error:raise(E_PERM);
  87726. else
  87727. return ((recip = args[1]) != this) && ((i = $list_utils:iassoc(recip, cm = this.current_message)) && (this.current_message = listdelete(cm, i)));
  87728. endif
  87729. .
  87730. #6:58
  87731. ":current_folder() => default folder to use, always an object, usually `this'";
  87732. set_task_perms(caller_perms());
  87733. return ((!this:mail_option("sticky")) || this.current_folder) && this;
  87734. .
  87735. #6:59
  87736. set_task_perms(caller_perms());
  87737. return this.current_folder = args[1];
  87738. .
  87739. #6:60
  87740. ":parse_folder_spec(verb,args,expected_preposition[,allow_trailing_args_p])";
  87741. " => {folder, msg_seq_args, trailing_args}";
  87742. set_task_perms(caller_perms());
  87743. folder = this:current_folder();
  87744. if (!prepstr)
  87745. return {folder, args[2], {}};
  87746. endif
  87747. verb = args[1];
  87748. prep = args[3];
  87749. extra = {@args, 0}[4];
  87750. args = args[2];
  87751. p = (prepstr in args);
  87752. if (prepstr != prep)
  87753. "...unexpected preposition...";
  87754. if (extra && (!index(prepstr, " ")))
  87755. return {folder, args[1..p - 1], args[p..length(args)]};
  87756. else
  87757. player:tell("Usage:  ", verb, " [<message numbers>] [", prep, " <folder/list-name>]");
  87758. endif
  87759. elseif (!((p < length(args)) && (fname = args[p + 1])))
  87760. "...preposition but no iobj...";
  87761. player:tell(verb, " ", $string_utils:from_list(args, " "), " WHAT?");
  87762. elseif ($mail_agent:match_failed(folder = $mail_agent:match_recipient(fname), fname))
  87763. "...bogus mail folder...";
  87764. else
  87765. return {folder, args[1..p - 1], args[p + 2..length(args)]};
  87766. endif
  87767. return 0;
  87768. .
  87769. #6:61
  87770. ":parse_mailread_cmd(verb,args,default,prep[,trailer])";
  87771. "  handles anything of the form  `VERB message_seq [PREP folder ...]'";
  87772. "    default is the default msg-seq to use if none given";
  87773. "    prep is the expected prepstr (assumes prepstr is set), usually `on'";
  87774. "    trailer, if present and true, indicates trailing args are permitted.";
  87775. "  returns {recipient object, message_seq, current_msg,\"...\"} or 0";
  87776. set_task_perms(caller_perms());
  87777. if (!(pfs = this:parse_folder_spec(@listdelete(args, 3))))
  87778. return 0;
  87779. endif
  87780. verb = args[1];
  87781. default = args[3];
  87782. extra = {@args, 0}[5];
  87783. folder = pfs[1];
  87784. cur = (this:get_current_message(folder) || {0});
  87785. if (typeof(pms = folder:parse_message_seq(pfs[2], @cur)) == LIST)
  87786. rest = {@listdelete(pms, 1), @pfs[3]};
  87787. if ((!extra) && rest)
  87788. "...everything should have been gobbled by :parse_message_seq...";
  87789. player:tell("I don't understand `", rest[1], "'");
  87790. return 0;
  87791. elseif (pms[1])
  87792. "...we have a nonempty message sequence...";
  87793. return {folder, pms[1], cur, rest};
  87794. elseif (used = ((length(pfs[2]) + 1) - length(pms)))
  87795. "...:parse_message_seq used some words, but didn't get anything out of it";
  87796. pms = (("%f %<has> no `" + $string_utils:from_list(pfs[2][1..used], " ")) + "' messages.");
  87797. elseif (typeof(pms = folder:parse_message_seq(default, @cur)) == LIST)
  87798. "...:parse_message_seq used nothing, try the default; wow it worked";
  87799. return {folder, pms[1], cur, rest};
  87800. endif
  87801. elseif (typeof(pms) == ERR)
  87802. player:tell($mail_agent:name(folder), " is not readable by you.");
  87803. if (!$object_utils:isa(folder, $mail_recipient))
  87804. player:tell("Use * to indicate a non-player mail recipient.");
  87805. endif
  87806. return 0;
  87807. endif
  87808. if (folder == this)
  87809. subst = {{"%f's", "Your"}, {"%f", "You"}, {"%<has>", "have"}};
  87810. elseif (is_player(folder))
  87811. subst = {{"%f", folder.name}, {"%<has>", $gender_utils:get_conj("has", folder)}};
  87812. else
  87813. subst = {{"%f", $mail_agent:name(folder)}, {"%<has>", "has"}};
  87814. endif
  87815. player:tell($string_utils:substitute(pms, {@subst, {"%%", "%"}}));
  87816. return 0;
  87817. .
  87818. #6:62
  87819. "@mail <msg-sequence>                --- as in help @mail";
  87820. "@mail <msg-sequence> on <recipient> --- shows mail on mailing list or player.";
  87821. set_task_perms(valid(caller_perms()) ? caller_perms() | player);
  87822. if (p = this:parse_mailread_cmd("@mail", args, this:mail_option("@mail") || "last:15", "on"))
  87823. this:set_current_folder(folder = p[1]);
  87824. msg_seq = p[2];
  87825. seq_size = $seq_utils:size(msg_seq);
  87826. if ((lim = player:mail_option("manymsgs")) && ((lim <= seq_size) && (!$command_utils:yes_or_no(tostr("You are about to see ", seq_size, " message headers.  Continue?")))))
  87827. player:notify(tostr("Aborted.  @mailoption manymsgs=", lim));
  87828. return;
  87829. endif
  87830. if (1 != seq_size)
  87831. player:notify(tostr(seq_size, " messages", (folder == this) ? "" | (" on " + $mail_agent:name(folder)), ":"));
  87832. endif
  87833. folder:display_seq_headers(msg_seq, @p[3]);
  87834. endif
  87835. .
  87836. #6:63
  87837. "@read <msg>...                  -- as in help @read";
  87838. "@read <msg>... on *<recipient>  -- reads messages on recipient.";
  87839. "@peek ...                       -- like @read, but don't set current message";
  87840. set_task_perms(valid(caller_perms()) ? caller_perms() | player);
  87841. if (p = this:parse_mailread_cmd("@read", args, "", "on"))
  87842. this:set_current_folder(folder = p[1]);
  87843. msg_seq = p[2];
  87844. if ((lim = player:mail_option("manymsgs")) && ((lim <= (seq_size = $seq_utils:size(msg_seq))) && (!$command_utils:yes_or_no(tostr("You are about to see ", seq_size, " messages.  Continue?")))))
  87845. player:notify(tostr("Aborted.  @mailoption manymsgs=", lim));
  87846. return;
  87847. endif
  87848. this._mail_task = task_id();
  87849. if (cur = folder:display_seq_full(msg_seq, tostr("Message %d", (folder == this) ? "" | (" on " + $mail_agent:name(folder)), ":")))
  87850. if (verb != "@peek")
  87851. this:set_current_message(folder, @cur);
  87852. endif
  87853. endif
  87854. endif
  87855. .
  87856. #6:64
  87857. set_task_perms(player);
  87858. if (dobjstr)
  87859. player:notify(tostr("Usage:  ", verb, " [on <recipient>]"));
  87860. else
  87861. this:("@read")(verb[2..5], @args);
  87862. endif
  87863. .
  87864. #6:65
  87865. "@rmm <message-sequence> [from <recipient>].   Use @unrmm if you screw up.";
  87866. " Beware, though.  @unrmm can only undo the most recent @rmm.";
  87867. set_task_perms(player);
  87868. if (!(p = this:parse_mailread_cmd("@rmm", args, "cur", "from")))
  87869. "...parse failed, we've already complained...";
  87870. elseif ((!prepstr) && ((p[1] != this) && (!$command_utils:yes_or_no(("@rmmail from " + $mail_agent:name(p[1])) + ".  Continue?"))))
  87871. "...wasn't the folder player was expecting...";
  87872. player:notify("@rmmail aborted.");
  87873. else
  87874. this:set_current_folder(folder = p[1]);
  87875. e = folder:rm_message_seq(p[2]);
  87876. if (typeof(e) == ERR)
  87877. player:notify(tostr(e));
  87878. else
  87879. count = (((n = $seq_utils:size(p[2])) == 1) ? "." | tostr(" (", n, " messages)."));
  87880. fname = ((folder == this) ? "" | (" from " + $mail_agent:name(folder)));
  87881. player:notify(tostr("Deleted ", e, fname, count));
  87882. endif
  87883. endif
  87884. .
  87885. #6:66
  87886. set_task_perms(player);
  87887. if (!dobjstr)
  87888. folder = this:current_folder();
  87889. elseif ($mail_agent:match_failed(folder = $mail_agent:match_recipient(dobjstr), dobjstr))
  87890. return;
  87891. endif
  87892. cur = this:current_message(folder);
  87893. fname = $mail_agent:name(folder);
  87894. if (typeof(h = folder:renumber(cur)) == ERR)
  87895. player:notify(tostr(h));
  87896. else
  87897. if (!h[1])
  87898. player:notify(tostr("No messages on ", fname, "."));
  87899. else
  87900. player:notify(tostr("Messages on ", fname, " renumbered 1-", h[1], "."));
  87901. this:set_current_folder(folder);
  87902. if (h[2] && this:set_current_message(folder, h[2]))
  87903. player:notify(tostr("Current message is now ", h[2], "."));
  87904. endif
  87905. endif
  87906. endif
  87907. .
  87908. #6:67
  87909. "@unrmm [on <recipient>]  -- undoes the previous @rmm on that recipient.";
  87910. set_task_perms(player);
  87911. if (!(p = this:parse_folder_spec("@unrmm", args, "on")))
  87912. return;
  87913. endif
  87914. dobjstr = $string_utils:from_list(p[2], " ");
  87915. if (!dobjstr)
  87916. do = "undo_rmm";
  87917. elseif (index("expunge", dobjstr) == 1)
  87918. do = "expunge_rmm";
  87919. elseif (index("list", dobjstr) == 1)
  87920. do = "list_rmm";
  87921. else
  87922. player:notify(tostr("Usage:  ", verb, " [expunge|list] [on <recipient>]"));
  87923. return;
  87924. endif
  87925. this:set_current_folder(folder = p[1]);
  87926. if (msg_seq = folder:(do)())
  87927. if (do == "undo_rmm")
  87928. player:notify(tostr($seq_utils:size(msg_seq), " messages restored to ", $mail_agent:name(folder), "."));
  87929. folder:display_seq_headers(msg_seq, 0);
  87930. else
  87931. player:notify(tostr(msg_seq, " zombie message", (msg_seq == 1) ? " " | "s ", (do == "expunge_rmm") ? "expunged from " | "on ", $mail_agent:name(folder), "."));
  87932. endif
  87933. elseif (typeof(msg_seq) == ERR)
  87934. player:notify(tostr(msg_seq));
  87935. else
  87936. player:notify(tostr("No messages to ", (do == "expunge_rmm") ? "expunge from " | "restore to ", $mail_agent:name(folder)));
  87937. endif
  87938. .
  87939. #6:68
  87940. if (args && (args[1] == "to"))
  87941. args = listdelete(args, 1);
  87942. endif
  87943. subject = {};
  87944. for a in (args)
  87945. if (((i = index(a, "=")) > 3) && (index("subject", a[1..i - 1]) == 1))
  87946. args = setremove(args, a);
  87947. a[1..i] = "";
  87948. subject = {a};
  87949. endif
  87950. endfor
  87951. $mail_editor:invoke(args, verb, @subject);
  87952. .
  87953. #6:69
  87954. "@answer <msg> [on *<recipient>] [<flags>...]";
  87955. set_task_perms(who = (valid(caller_perms()) ? caller_perms() | player));
  87956. if (p = this:parse_mailread_cmd(verb, args, "", "on", 1))
  87957. if ($seq_utils:size(p[2]) != 1)
  87958. player:notify("You can only answer *one* message at a time.");
  87959. elseif (LIST != typeof(flags_replytos = $mail_editor:check_answer_flags(@p[4])))
  87960. player:notify_lines({tostr("Usage:  ", verb, " [message-# [on <recipient>]] [flags...]"), "where flags include any of:", "  all        reply to everyone", "  sender     reply to sender only", "  include    include the original message in your reply", "  noinclude  don't include the original in your reply"});
  87961. else
  87962. this:set_current_folder(p[1]);
  87963. $mail_editor:invoke(2, verb, p[1]:messages_in_seq(p[2])[1][2], @flags_replytos);
  87964. endif
  87965. endif
  87966. .
  87967. #6:70
  87968. "@forward <msg> [on *<recipient>] to <recipient> [<recipient>...]";
  87969. set_task_perms(valid(caller_perms()) ? caller_perms() | player);
  87970. if (!(p = this:parse_mailread_cmd(verb, args, "", "on", 1)))
  87971. "...lose...";
  87972. return;
  87973. elseif ($seq_utils:size(sequence = p[2]) != 1)
  87974. player:notify("You can only forward *one* message at a time.");
  87975. return;
  87976. elseif ((length(p[4]) < 2) || (p[4][1] != "to"))
  87977. player:notify(tostr("Usage:  ", verb, " [<message>] [on <folder>] to <recip>..."));
  87978. return;
  87979. endif
  87980. recips = {};
  87981. for rs in (listdelete(p[4], 1))
  87982. if ($mail_agent:match_failed(r = $mail_agent:match_recipient(rs), rs))
  87983. return;
  87984. endif
  87985. recips = {@recips, r};
  87986. endfor
  87987. this:set_current_folder(folder = p[1]);
  87988. m = folder:messages_in_seq(sequence)[1];
  87989. msgnum = m[1];
  87990. msgtxt = m[2];
  87991. from = msgtxt[2];
  87992. if (msgtxt[4] != " ")
  87993. subject = tostr("[", from, ":  ", msgtxt[4], "]");
  87994. elseif ((h = ("" in msgtxt)) && (h < length(msgtxt)))
  87995. subject = tostr("[", from, ":  `", msgtxt[h + 1][1..min(20, length(msgtxt[h + 1]))], "']");
  87996. else
  87997. subject = tostr("[", from, "]");
  87998. endif
  87999. result = $mail_agent:send_message(player, recips, subject, $mail_agent:to_text(@msgtxt));
  88000. if (!result)
  88001. player:notify(tostr(result));
  88002. elseif (result[1])
  88003. player:notify(tostr("Message ", msgnum, @(folder == this) ? {} | {" on ", $mail_agent:name(folder)}, " @forwarded to ", $mail_agent:name_list(@listdelete(result, 1)), "."));
  88004. else
  88005. player:notify("Message not sent.");
  88006. endif
  88007. .
  88008. #6:71
  88009. $mail_editor:invoke($gripe_recipients, "@gripe", "@gripe: " + argstr);
  88010. .
  88011. #6:72
  88012. subject = tostr($string_utils:capitalize(verb[2..length(verb)]), ":  ", (loc = this.location).name, "(", loc, ")");
  88013. if (this != player)
  88014. return E_PERM;
  88015. elseif (argstr)
  88016. result = $mail_agent:send_message(this, {loc.owner}, subject, argstr);
  88017. if (result && result[1])
  88018. player:notify(tostr("Your ", verb, " sent to ", $mail_agent:name_list(@listdelete(result, 1)), ".  Input is appreciated, as always."));
  88019. else
  88020. player:notify(tostr("Huh?  This room's owner (", loc.owner, ") is invalid?  Tell a wizard..."));
  88021. endif
  88022. return;
  88023. elseif (!($object_utils:isa(loc, $room) && loc.free_entry))
  88024. player:notify_lines({tostr("You need to make it a one-liner, i.e., `", verb, " something or other'."), "This room may not let you back in if you go to the Mail Room."});
  88025. elseif ($object_utils:isa(loc, $generic_editor))
  88026. player:notify_lines({tostr("You need to make it a one-liner, i.e., `", verb, " something or other'."), "Sending you to the Mail Room from an editor is usually a bad idea."});
  88027. else
  88028. $mail_editor:invoke({tostr(loc.owner)}, verb, subject);
  88029. endif
  88030. if (verb == "@bug")
  88031. player:notify("For a @bug report, be sure to mention exactly what it was you typed to trigger the error...");
  88032. endif
  88033. .
  88034. #6:73
  88035. "@skip [*<folder/mailing_list>...]";
  88036. "  sets your last-read time for the given lists to now, indicating your";
  88037. "  disinterest in any new messages that might have appeared recently.";
  88038. set_task_perms(player);
  88039. current_folder = this:current_folder();
  88040. for a in (args || {0})
  88041. if (a ? $mail_agent:match_failed(folder = $mail_agent:match_recipient(a), a) | (folder = this:current_folder()))
  88042. "...bogus folder name, done...  No, try anyway.";
  88043. if (this:kill_current_message(this:my_match_object(a)))
  88044. player:notify("Invalid folder, but found it subscribed anyway.  Removed.");
  88045. endif
  88046. else
  88047. lseq = folder:length_all_msgs();
  88048. unread = ((n = this:get_current_message(folder)) ? folder:length_date_gt(n[2]) | lseq);
  88049. this:set_current_message(folder, lseq && folder:messages_in_seq({lseq, lseq + 1})[1][1], time());
  88050. player:notify(tostr(unread ? tostr("Ignoring ", unread) | "No", " unread message", (unread != 1) ? "s" | "", " on ", $mail_agent:name(folder)));
  88051. if (current_folder == folder)
  88052. this:set_current_folder(this);
  88053. endif
  88054. endif
  88055. endfor
  88056. .
  88057. #6:74
  88058. "@subscribe *<folder/mailing_list>";
  88059. "  causes you to be notified when new mail arrives on this list";
  88060. "@subscribe";
  88061. "   just lists available mailing lists.";
  88062. set_task_perms(player);
  88063. if (!dobjstr)
  88064. ml = $list_utils:slice(player.current_message[3..length(player.current_message)]);
  88065. for c in ({@$mail_agent.contents, @this.mail_lists})
  88066. $command_utils:suspend_if_needed(0);
  88067. if ((c:is_usable_by(player) || c:is_readable_by(player)) && ((verb != "@unsubscribed") || (!(c in ml))))
  88068. c:look_self();
  88069. endif
  88070. endfor
  88071. player:notify(tostr("-------- end of ", verb, " -------"));
  88072. return;
  88073. elseif ($mail_agent:match_failed(folder = $mail_agent:match_recipient(dobjstr), dobjstr))
  88074. return;
  88075. elseif (folder == this)
  88076. player:notify("You don't need to @subscribe to yourself");
  88077. return;
  88078. elseif ($object_utils:isa(folder, $mail_recipient) ? !folder:is_readable_by(this) | (!$perm_utils:controls(this, folder)))
  88079. player:notify("That mailing list is not readable by you.");
  88080. return;
  88081. endif
  88082. this:make_current_message(folder);
  88083. if ($object_utils:isa(folder, $mail_recipient))
  88084. folder:add_notify(this);
  88085. endif
  88086. len = folder:length_all_msgs();
  88087. player:notify(tostr($mail_agent:name(folder), " has ", len, " message", (len == 1) ? "" | "s"));
  88088. this:set_current_folder(folder);
  88089. .
  88090. #6:75
  88091. set_task_perms((caller == this) ? this.owner | caller_perms());
  88092. new_cm = (head = {});
  88093. for n in (this.current_message)
  88094. if (typeof(n) != LIST)
  88095. head = {@head, n};
  88096. elseif ($object_utils:isa(folder = n[1], $mail_recipient) && folder:is_readable_by(this))
  88097. "...set current msg to be the last one you could possibly have read.";
  88098. if (n[3] < folder.last_msg_date)
  88099. i = folder:length_date_le(n[3]);
  88100. n[2] = (i && folder:messages_in_seq(i)[1]);
  88101. endif
  88102. new_cm = listappend(new_cm, n, $list_utils:iassoc_sorted(n[3], new_cm, 3));
  88103. endif
  88104. endfor
  88105. this.current_message = {@head, @$list_utils:reverse(new_cm)};
  88106. this:set_current_folder(this);
  88107. .
  88108. #6:76
  88109. set_task_perms((caller == this) ? this.owner | caller_perms());
  88110. which = {};
  88111. cm = this.current_message;
  88112. cm[1..2] = ((verb == "@rn") ? {{this, @cm[1..2]}} | {});
  88113. all = (verb == "@subscribed");
  88114. for n in (cm)
  88115. rcpt = n[1];
  88116. if ($mail_agent:is_recipient(rcpt))
  88117. if ((nmsgs = n[1]:length_date_gt(n[3])) || all)
  88118. which = {@which, {n[1], nmsgs}};
  88119. endif
  88120. else
  88121. player:notify(tostr("Bogus recipient ", rcpt, " removed from .current_message."));
  88122. this.current_message = setremove(this.current_message, n);
  88123. endif
  88124. $command_utils:suspend_if_needed(0);
  88125. endfor
  88126. if (which)
  88127. player:notify((verb == "@subscribed") ? "You are subscribed to the following lists:" | "There is new activity on the following lists:");
  88128. for w in (which)
  88129. name = ((w[1] == this) ? " me" | $mail_agent:name(w[1]));
  88130. player:notify(tostr($string_utils:left("    " + name, 40), " ", w[2], " new message", (w[2] == 1) ? "" | "s"));
  88131. endfor
  88132. elseif (verb == "@rn")
  88133. player:notify("No new activity on any of your lists.");
  88134. elseif (verb == "@subscribed")
  88135. player:notify("You aren't subscribed to any mailing lists.");
  88136. endif
  88137. return which;
  88138. .
  88139. #6:77
  88140. ":mail_option(name)";
  88141. "Returns the value of the specified mail option";
  88142. if ((caller in {this, $mail_editor, $mail_agent}) || $perm_utils:controls(caller_perms(), this))
  88143. return $mail_options:get(this.mail_options, args[1]);
  88144. else
  88145. return E_PERM;
  88146. endif
  88147. .
  88148. #6:78
  88149. ":display_option(name) => returns the value of the specified @display option";
  88150. if ((caller == this) || $perm_utils:controls(caller_perms(), this))
  88151. return $display_options:get(this.display_options, args[1]);
  88152. else
  88153. return E_PERM;
  88154. endif
  88155. .
  88156. #6:79
  88157. ":edit_option(name) => returns the value of the specified edit option";
  88158. if ((caller == this) || ($object_utils:isa(caller, $generic_editor) || $perm_utils:controls(caller_perms(), this)))
  88159. return $edit_options:get(this.edit_options, args[1]);
  88160. else
  88161. return E_PERM;
  88162. endif
  88163. .
  88164. #6:80
  88165. ":list_option(name) => returns the value of the specified @list option";
  88166. if ((caller == this) || $perm_utils:controls(caller_perms(), this))
  88167. return $list_options:get(this.list_options, args[1]);
  88168. else
  88169. return E_PERM;
  88170. endif
  88171. .
  88172. #6:81
  88173. ":set_edit_option(oname,value)";
  88174. ":set_display_option(oname,value)";
  88175. ":set_mail_option(oname,value)";
  88176. "Changes the value of the named option.";
  88177. "Returns a string error if something goes wrong.";
  88178. if (!((caller == this) || $perm_utils:controls(caller_perms(), this)))
  88179. return tostr(E_PERM);
  88180. endif
  88181. "...this is kludgy, but it saves me from writing the same verb 3 times.";
  88182. "...there's got to be a better way to do this...";
  88183. verb[1..4] = "";
  88184. foo_options = (verb + "s");
  88185. "...";
  88186. if (typeof(s = #0.(foo_options):set(this.(foo_options), @args)) == STR)
  88187. return s;
  88188. elseif (s == this.(foo_options))
  88189. return 0;
  88190. else
  88191. this.(foo_options) = s;
  88192. return 1;
  88193. endif
  88194. .
  88195. #6:82
  88196. "@<what>-option <option> [is] <value>   sets <option> to <value>";
  88197. "@<what>-option <option>=<value>        sets <option> to <value>";
  88198. "@<what>-option +<option>     sets <option>   (usually equiv. to <option>=1";
  88199. "@<what>-option -<option>     resets <option> (equiv. to <option>=0)";
  88200. "@<what>-option !<option>     resets <option> (equiv. to <option>=0)";
  88201. "@<what>-option <option>      displays value of <option>";
  88202. set_task_perms(player);
  88203. what = {"mail", "edit", "display"}[index("med", verb[2])];
  88204. options = (what + "_options");
  88205. option_pkg = #0.(options);
  88206. set_option = (("set_" + what) + "_option");
  88207. if (!args)
  88208. player:notify_lines({("Current " + what) + " options:", "", @option_pkg:show(this.(options), option_pkg.names)});
  88209. return;
  88210. elseif (typeof(presult = option_pkg:parse(args)) == STR)
  88211. player:notify(presult);
  88212. return;
  88213. else
  88214. if (length(presult) > 1)
  88215. if (typeof(sresult = this:(set_option)(@presult)) == STR)
  88216. player:notify(sresult);
  88217. return;
  88218. elseif (!sresult)
  88219. player:notify("No change.");
  88220. return;
  88221. endif
  88222. endif
  88223. player:notify_lines(option_pkg:show(this.(options), presult[1]));
  88224. endif
  88225. .
  88226. #6:83
  88227. "set_name(newname) attempts to change this.name to newname";
  88228. "  => E_PERM   if you don't own this";
  88229. "  => E_INVARG if the name is already taken or prohibited for some reason";
  88230. "  => E_NACC   if the player database is not taking new names right now.";
  88231. "  => E_ARGS   if the name is too long (controlled by $login.max_player_name)";
  88232. if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
  88233. return E_PERM;
  88234. elseif (!is_player(this))
  88235. "we don't worry about the names of player classes.";
  88236. set_task_perms(caller_perms());
  88237. return pass(@args);
  88238. elseif ($player_db.frozen)
  88239. return E_NACC;
  88240. elseif (length(name = args[1]) > $login.max_player_name)
  88241. return E_ARGS;
  88242. elseif (!($player_db:available(name) in {this, 1}))
  88243. return E_INVARG;
  88244. else
  88245. old = this.name;
  88246. this.name = name;
  88247. if ((name != old) && (!(old in this.aliases)))
  88248. $player_db:delete(old);
  88249. endif
  88250. $player_db:insert(name, this);
  88251. return 1;
  88252. endif
  88253. .
  88254. #6:84
  88255. "set_aliases(alias_list)";
  88256. "For changing player aliases, we check to make sure that none of the aliases match existing player names/aliases.  Aliases containing spaces are not entered in the $player_db and so are not subject to this restriction ($string_utils:match_player will not match on them, however, so they only match if used in the immediate room, e.g., with match_object() or somesuch).";
  88257. "Also we make sure that the .name is included in the .alias list.  In any situation where .name and .aliases are both being changed, do the name change first.";
  88258. "  => E_PERM   if you don't own this";
  88259. "  => E_NACC   if the player database is not taking new aliases right now.";
  88260. "  => E_TYPE   if alias_list is not a list";
  88261. "  => E_INVARG if any element of alias_list is not a string";
  88262. if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
  88263. return E_PERM;
  88264. elseif (!is_player(this))
  88265. "we don't worry about the names of player classes.";
  88266. return pass(@args);
  88267. elseif ($player_db.frozen)
  88268. return E_NACC;
  88269. elseif (typeof(aliases = args[1]) != LIST)
  88270. return E_TYPE;
  88271. elseif ((length(aliases) > 30) && (length(aliases) > length(this.aliases)))
  88272. return E_INVARG;
  88273. else
  88274. for a in (aliases)
  88275. if (typeof(a) != STR)
  88276. return E_INVARG;
  88277. endif
  88278. if ((!index(a, " ")) && (!($player_db:available(a) in {this, 1})))
  88279. aliases = setremove(aliases, a);
  88280. endif
  88281. endfor
  88282. aliases = setadd(aliases, this.name);
  88283. old = this.aliases;
  88284. this.aliases = aliases;
  88285. for a in (old)
  88286. if (!(a in aliases))
  88287. $player_db:delete2(a, this);
  88288. endif
  88289. endfor
  88290. for a in (aliases)
  88291. if (!index(a, " "))
  88292. $player_db:insert(a, this);
  88293. endif
  88294. endfor
  88295. return 1;
  88296. endif
  88297. .
  88298. #6:85
  88299. if ((player != caller) || (player != this))
  88300. return;
  88301. endif
  88302. set_task_perms(player);
  88303. spec = $code_utils:parse_verbref(dobjstr);
  88304. if (spec)
  88305. object = this:my_match_object(spec[1]);
  88306. if (!$command_utils:object_match_failed(object, spec[1]))
  88307. vname = spec[2];
  88308. info = verb_info(object, vname);
  88309. if (info == E_VERBNF)
  88310. player:notify("That object does not define that verb.");
  88311. elseif (typeof(info) == ERR)
  88312. player:notify(tostr(info));
  88313. else
  88314. result = set_verb_info(object, vname, listset(info, iobjstr, 3));
  88315. if (typeof(result) == ERR)
  88316. player:notify(tostr(result));
  88317. else
  88318. player:notify("Verb name changed.");
  88319. endif
  88320. endif
  88321. endif
  88322. else
  88323. object = this:my_match_object(dobjstr);
  88324. if (!$command_utils:object_match_failed(object, dobjstr))
  88325. old_name = object.name;
  88326. old_aliases = object.aliases;
  88327. if (e = $building_utils:set_names(object, iobjstr))
  88328. if (strcmp(object.name, old_name) == 0)
  88329. name_message = tostr("Name of ", object, " (", old_name, ") is unchanged");
  88330. else
  88331. name_message = tostr("Name of ", object, " changed to \"", object.name, "\"");
  88332. endif
  88333. aliases = $string_utils:from_value(object.aliases, 1);
  88334. if (object.aliases == old_aliases)
  88335. alias_message = tostr(".  Aliases are unchanged (", aliases, ").");
  88336. else
  88337. alias_message = tostr(", with aliases ", aliases, ".");
  88338. endif
  88339. player:notify(name_message + alias_message);
  88340. elseif (e == E_INVARG)
  88341. player:notify("That particular name change not allowed (see help @rename).");
  88342. elseif (e == E_NACC)
  88343. player:notify("Oops.  You can't update that name right now; try again in a few minutes.");
  88344. elseif (e == E_ARGS)
  88345. player:notify(tostr("Sorry, name too long.  Maximum number of characters in a name:  ", $login.max_player_name));
  88346. else
  88347. player:notify(tostr(e));
  88348. endif
  88349. endif
  88350. endif
  88351. .
  88352. #6:86
  88353. "Syntax: @addalias <alias>[,...,<alias>] to <object>";
  88354. "        @addalias <alias>[,...,<alias>] to <object>:<verb>";
  88355. "";
  88356. "The first form is used to add aliases to an object's list of aliases.  You can separate multiple aliases with commas.  The aliases will be checked against the object's current aliases and all aliases not already in the object's list of aliases will be added.";
  88357. "";
  88358. "Example:";
  88359. "Muchkin wants to add new aliases to Rover the Wonder Dog:";
  88360. "  @addalias Dog,Wonder Dog to Rover";
  88361. "Since Rover the Wonder Dog already has the alias \"Dog\" but does not have the alias \"Wonder Dog\", Munchkin sees:";
  88362. "  Rover the Wonder Dog(#4237) already has the alias Dog.";
  88363. "  Alias Wonder Dog added to Rover the Wonder Dog(#4237).";
  88364. "";
  88365. "If the object is a player, spaces will also be assumed to be separations between aliases and each alias will be checked against the Player Name Database to make sure no one else is using it. Any already used aliases will be identified.";
  88366. "";
  88367. "Example:";
  88368. "Munchkin wants to add his nicknames to his own list of aliases:";
  88369. "  @addalias Foobar Davey to me";
  88370. "@Addalias recognizes that Munchkin is trying to add an alias to a valid player and checks the aliases against the Player Name Database.  Unfortunately, DaveTheMan is already using the alias \"Davey\" so Munchkin sees:";
  88371. "  DaveTheMan(#5432) is already using the alias Davey";
  88372. "  Alias Foobar added to Munchkin(#1523).";
  88373. "";
  88374. "The second form of the @addalias command is for use by programmers, to add aliases to a verb they own.  All commas and spaces are assumed to be separations between aliases.";
  88375. if (player != this)
  88376. return;
  88377. endif
  88378. set_task_perms(player);
  88379. spec = $code_utils:parse_verbref(iobjstr);
  88380. if (spec)
  88381. object = player:my_match_object(spec[1]);
  88382. if (!$command_utils:object_match_failed(object, spec[1]))
  88383. vname = spec[2];
  88384. info = verb_info(object, vname);
  88385. if (info == E_VERBNF)
  88386. player:notify("That object does not define that verb.");
  88387. elseif (typeof(info) == ERR)
  88388. player:notify(tostr(info));
  88389. else
  88390. old_aliases = $string_utils:explode(info[3]);
  88391. used = {};
  88392. for alias in (new_aliases = $list_utils:remove_duplicates($string_utils:explode(strsub(dobjstr, ",", " "))))
  88393. if (alias in old_aliases)
  88394. used = {@used, alias};
  88395. new_aliases = setremove(new_aliases, alias);
  88396. endif
  88397. endfor
  88398. if (used)
  88399. player:notify(tostr(object.name, "(", object, "):", vname, " already has the alias", (length(used) > 1) ? "es" | "", " ", $string_utils:english_list(used), "."));
  88400. endif
  88401. if (new_aliases)
  88402. info = listset(info, aliases = $string_utils:from_list({@old_aliases, @new_aliases}, " "), 3);
  88403. result = set_verb_info(object, vname, info);
  88404. if (typeof(result) == ERR)
  88405. player:notify(tostr(result));
  88406. else
  88407. player:notify(tostr("Alias", (length(new_aliases) > 1) ? "es" | "", " ", $string_utils:english_list(new_aliases), " added to verb ", object.name, "(", object, "):", vname));
  88408. player:notify(tostr("Verbname is now ", object.name, "(", object, "):\"", aliases, "\""));
  88409. endif
  88410. endif
  88411. endif
  88412. endif
  88413. else
  88414. object = player:my_match_object(iobjstr);
  88415. if (!$command_utils:object_match_failed(object, iobjstr))
  88416. old_aliases = object.aliases;
  88417. used = {};
  88418. for alias in (new_aliases = $list_utils:remove_duplicates($list_utils:map_arg($string_utils, "trim", $string_utils:explode(is_player(object) ? strsub(dobjstr, " ", ",") | dobjstr, ","))))
  88419. if (alias in old_aliases)
  88420. used = {@used, alias};
  88421. new_aliases = setremove(new_aliases, alias);
  88422. elseif (is_player(object) && valid(someone = $player_db:find_exact(alias)))
  88423. player:notify(tostr(someone.name, "(", someone, ") is already using the alias ", alias, "."));
  88424. new_aliases = setremove(new_aliases, alias);
  88425. endif
  88426. endfor
  88427. if (used)
  88428. player:notify(tostr(object.name, "(", object, ") already has the alias", (length(used) > 1) ? "es" | "", " ", $string_utils:english_list(used), "."));
  88429. endif
  88430. if (new_aliases)
  88431. if ((e = object:set_aliases(aliases = {@old_aliases, @new_aliases})) && (object.aliases == {@old_aliases, @new_aliases}))
  88432. player:notify(tostr("Alias", (length(new_aliases) > 1) ? "es" | "", " ", $string_utils:english_list(new_aliases), " added to ", object.name, "(", object, ")."));
  88433. player:notify(tostr("Aliases for ", object.name, "(", object, ") are now ", $string_utils:from_value(aliases, 1)));
  88434. elseif (e || (e == E_INVARG))
  88435. player:notify("That particular name change not allowed (see help @rename or help @addalias).");
  88436. elseif (e == E_NACC)
  88437. player:notify("Oops.  You can't update that object's aliases right now; try again in a few minutes.");
  88438. else
  88439. player:notify(tostr(e));
  88440. endif
  88441. endif
  88442. endif
  88443. endif
  88444. .
  88445. #6:87
  88446. "Syntax: @rmalias <alias>[,...,<alias>] from <object>";
  88447. "        @rmalias <alias>[,...,<alias>] from <object>:<verb>";
  88448. "";
  88449. "The first form is used to remove aliases from an object.  If the object is a valid player, space and commas will be assumed to be separations between unwanted aliases.  Otherwise, only commas will be assumed to be separations.";
  88450. "[5/10/93 Nosredna: flushed above is_player feature";
  88451. "Note that @rmalias will not affect the object's name, only its aliases.";
  88452. "";
  88453. "The second form is for use by programmers, to remove aliases from a verb they own.  All spaces and commas are assumed to be separations between unwanted aliases.";
  88454. if (player != this)
  88455. return;
  88456. endif
  88457. set_task_perms(player);
  88458. spec = $code_utils:parse_verbref(iobjstr);
  88459. if (spec)
  88460. object = player:my_match_object(spec[1]);
  88461. if (!$command_utils:object_match_failed(object, spec[1]))
  88462. vname = spec[2];
  88463. info = verb_info(object, vname);
  88464. if (info == E_VERBNF)
  88465. player:notify("That object does not define that verb.");
  88466. elseif (typeof(info) == ERR)
  88467. player:notify(tostr(info));
  88468. else
  88469. old_aliases = $string_utils:explode(info[3]);
  88470. not_used = {};
  88471. for alias in (bad_aliases = $list_utils:remove_duplicates($string_utils:explode(strsub(dobjstr, ",", " "))))
  88472. if (!(alias in old_aliases))
  88473. not_used = {@not_used, alias};
  88474. bad_aliases = setremove(bad_aliases, alias);
  88475. else
  88476. old_aliases = setremove(old_aliases, alias);
  88477. endif
  88478. endfor
  88479. if (not_used)
  88480. player:notify(tostr(object.name, "(", object, "):", vname, " does not have the alias", (length(not_used) > 1) ? "es" | "", " ", $string_utils:english_list(not_used), "."));
  88481. endif
  88482. if (bad_aliases && old_aliases)
  88483. info = listset(info, aliases = $string_utils:from_list(old_aliases, " "), 3);
  88484. result = set_verb_info(object, vname, info);
  88485. if (typeof(result) == ERR)
  88486. player:notify(tostr(result));
  88487. else
  88488. player:notify(tostr("Alias", (length(bad_aliases) > 1) ? "es" | "", " ", $string_utils:english_list(bad_aliases), " removed from verb ", object.name, "(", object, "):", vname));
  88489. player:notify(tostr("Verbname is now ", object.name, "(", object, "):\"", aliases, "\""));
  88490. endif
  88491. elseif (!old_aliases)
  88492. player:notify("You have to leave a verb with at least one alias.");
  88493. endif
  88494. endif
  88495. endif
  88496. else
  88497. object = player:my_match_object(iobjstr);
  88498. if (!$command_utils:object_match_failed(object, iobjstr))
  88499. old_aliases = object.aliases;
  88500. not_used = {};
  88501. for alias in (bad_aliases = $list_utils:remove_duplicates($list_utils:map_arg($string_utils, "trim", $string_utils:explode(dobjstr, ","))))
  88502. "removed is_player(object) ? strsub(dobjstr, \" \", \",\") | --Nosredna";
  88503. if (!(alias in old_aliases))
  88504. not_used = {@not_used, alias};
  88505. bad_aliases = setremove(bad_aliases, alias);
  88506. else
  88507. old_aliases = setremove(old_aliases, alias);
  88508. endif
  88509. endfor
  88510. if (not_used)
  88511. player:notify(tostr(object.name, "(", object, ") does not have the alias", (length(not_used) > 1) ? "es" | "", " ", $string_utils:english_list(not_used), "."));
  88512. endif
  88513. if (bad_aliases)
  88514. if (e = object:set_aliases(old_aliases))
  88515. player:notify(tostr("Alias", (length(bad_aliases) > 1) ? "es" | "", " ", $string_utils:english_list(bad_aliases), " removed from ", object.name, "(", object, ")."));
  88516. player:notify(tostr("Aliases for ", object.name, "(", object, ") are now ", $string_utils:from_value(old_aliases, 1)));
  88517. elseif (e == E_INVARG)
  88518. player:notify("That particular name change not allowed (see help @rename or help @rmalias).");
  88519. elseif (e == E_NACC)
  88520. player:notify("Oops.  You can't update that object's aliases right now; try again in a few minutes.");
  88521. else
  88522. player:notify(tostr(e));
  88523. endif
  88524. endif
  88525. endif
  88526. endif
  88527. .
  88528. #6:88
  88529. set_task_perms(player);
  88530. dobj = player:my_match_object(dobjstr);
  88531. if ($command_utils:object_match_failed(dobj, dobjstr))
  88532. "...lose...";
  88533. elseif (e = dobj:set_description(iobjstr))
  88534. player:notify("Description set.");
  88535. else
  88536. player:notify(tostr(e));
  88537. endif
  88538. .
  88539. #6:89
  88540. set_task_perms(player);
  88541. if (dobjstr == "")
  88542. player:notify(tostr("Usage:  ", verb, " <object>"));
  88543. return;
  88544. endif
  88545. dobj = player:my_match_object(dobjstr);
  88546. if ($command_utils:object_match_failed(dobj, dobjstr))
  88547. return;
  88548. endif
  88549. found_one = 0;
  88550. props = $object_utils:all_properties(dobj);
  88551. if (typeof(props) == ERR)
  88552. player:notify("You can't read the messages on that.");
  88553. return;
  88554. endif
  88555. for pname in (props)
  88556. len = length(pname);
  88557. if ((len > 4) && (pname[len - 3..len] == "_msg"))
  88558. found_one = 1;
  88559. msg = dobj.(pname);
  88560. if (msg == E_PERM)
  88561. value = "isn't readable by you.";
  88562. elseif (!msg)
  88563. value = "isn't set.";
  88564. elseif (typeof(msg) != STR)
  88565. value = "is corrupted! **";
  88566. else
  88567. value = ("is " + $string_utils:print(msg));
  88568. endif
  88569. player:notify(tostr("@", pname[1..len - 4], " ", dobjstr, " ", value));
  88570. endif
  88571. endfor
  88572. if (!found_one)
  88573. player:notify("That object doesn't have any messages to set.");
  88574. endif
  88575. .
  88576. #6:90
  88577. $note_editor:invoke(dobjstr, verb);
  88578. .
  88579. #6:91
  88580. if (typeof(player.password) != STR)
  88581. if (length(args) != 1)
  88582. return player:notify(tostr("Usage:  ", verb, " <new-password>"));
  88583. else
  88584. new_password = args[1];
  88585. endif
  88586. elseif (length(args) != 2)
  88587. player:notify(tostr("Usage:  ", verb, " <old-password> <new-password>"));
  88588. return;
  88589. elseif (player.password != crypt(tostr(args[1]), player.password))
  88590. player:notify("That's not your old password.");
  88591. return;
  88592. else
  88593. new_password = args[2];
  88594. endif
  88595. player.password = crypt(tostr(new_password));
  88596. player:notify("New password set.");
  88597. .
  88598. #6:92
  88599. "@last-c           reports when and from where you last connected.";
  88600. "@last-c all       adds the 10 most recent places you connected from.";
  88601. "@last-c confunc   is like `@last-c' but is silent on first login.";
  88602. opts = {"all", "confunc"};
  88603. i = 0;
  88604. if (caller != this)
  88605. return E_PERM;
  88606. elseif (args && ((length(args) > 1) || (!(i = $string_utils:find_prefix(args[1], opts)))))
  88607. this:notify(tostr("Usage:  ", verb, " [all]"));
  88608. return;
  88609. endif
  88610. opt_all = (i && (opts[i] == "all"));
  88611. opt_confunc = (i && (opts[i] == "confunc"));
  88612. if (!(prev = this.previous_connection))
  88613. this:notify("Something was broken when you logged in; tell a wizard.");
  88614. elseif (prev[1] == 0)
  88615. opt_confunc || this:notify("Your previous connection was before we started keeping track.");
  88616. elseif (prev[1] > time())
  88617. this:notify("This is your first time connected.");
  88618. else
  88619. this:notify(tostr("Last connected ", ctime(prev[1]), " from ", prev[2]));
  88620. if (opt_all)
  88621. this:notify("Previous connections have been from the following sites:");
  88622. for l in (this.all_connect_places)
  88623. this:notify("   " + l);
  88624. endfor
  88625. endif
  88626. endif
  88627. .
  88628. #6:93
  88629. "set_gender(newgender) attempts to change this.gender to newgender";
  88630. "  => E_PERM   if you don't own this or aren't its parent";
  88631. "  => Other return values as from $gender_utils:set.";
  88632. if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
  88633. return E_PERM;
  88634. else
  88635. result = $gender_utils:set(this, args[1]);
  88636. this.gender = ((typeof(result) == STR) ? result | args[1]);
  88637. return result;
  88638. endif
  88639. .
  88640. #6:94
  88641. set_task_perms(valid(caller_perms()) ? caller_perms() | player);
  88642. if (!args)
  88643. player:notify(tostr("Your gender is currently ", this.gender, "."));
  88644. player:notify($string_utils:pronoun_sub("Your pronouns:  %s,%o,%p,%q,%r,%S,%O,%P,%Q,%R"));
  88645. player:notify(tostr("Available genders:  ", $string_utils:english_list($gender_utils.genders, "", " or ")));
  88646. else
  88647. result = this:set_gender(args[1]);
  88648. quote = ((result == E_NONE) ? "\"" | "");
  88649. player:notify(tostr("Gender set to ", quote, this.gender, quote, "."));
  88650. if (typeof(result) != ERR)
  88651. player:notify($string_utils:pronoun_sub("Your pronouns:  %s,%o,%p,%q,%r,%S,%O,%P,%Q,%R"));
  88652. elseif (result != E_NONE)
  88653. player:notify(tostr("Couldn't set pronouns:  ", result));
  88654. else
  88655. player:notify("Pronouns unchanged.");
  88656. endif
  88657. endif
  88658. .
  88659. #6:95
  88660. "set_brief(value)";
  88661. "set_brief(value, anything)";
  88662. "If <anything> is given, add value to the current value; otherwise, just set the value.";
  88663. if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
  88664. return E_PERM;
  88665. else
  88666. if (length(args) == 1)
  88667. this.brief = args[1];
  88668. else
  88669. this.brief = (this.brief + args[1]);
  88670. endif
  88671. endif
  88672. .
  88673. #6:96
  88674. "@mode <mode>";
  88675. "Current modes are brief and verbose.";
  88676. "General verb for setting player `modes'.";
  88677. "Modes are coded right here in the verb.";
  88678. if (caller != this)
  88679. player:tell("You can't set someone else's modes.");
  88680. return E_PERM;
  88681. endif
  88682. modes = {"brief", "verbose"};
  88683. mode = modes[$string_utils:find_prefix(dobjstr, modes)];
  88684. if (!mode)
  88685. player:tell("Unknown mode \"", dobjstr, "\".  Known modes:");
  88686. for mode in (modes)
  88687. player:tell("  ", mode);
  88688. endfor
  88689. return 0;
  88690. elseif (mode == "brief")
  88691. this:set_brief(1);
  88692. elseif (mode == "verbose")
  88693. this:set_brief(0);
  88694. endif
  88695. player:tell($string_utils:capitalize(mode), " mode set.");
  88696. return 1;
  88697. .
  88698. #6:97
  88699. "This verb should probably go away once 'examine' is in place.";
  88700. if (dobjstr == "")
  88701. player:notify(tostr("Usage:  ", verb, " <object>"));
  88702. return;
  88703. endif
  88704. what = $string_utils:match_object(dobjstr, player.location);
  88705. if ($command_utils:object_match_failed(what, dobjstr))
  88706. return;
  88707. endif
  88708. player:notify(tostr(what.name, " (", what, ") is owned by ", valid(what.owner) ? what.owner.name | "a recycled player", " (", what.owner, ")."));
  88709. player:notify(tostr("Aliases:  ", $string_utils:english_list(what.aliases)));
  88710. desc = what:description();
  88711. if (desc)
  88712. player:notify_lines(desc);
  88713. else
  88714. player:notify("(No description set.)");
  88715. endif
  88716. if ($perm_utils:controls(player, what))
  88717. player:notify(tostr("Key:  ", $lock_utils:unparse_key(what.key)));
  88718. endif
  88719. contents = what.contents;
  88720. if (contents)
  88721. player:notify("Contents:");
  88722. for item in (contents)
  88723. player:notify(tostr("  ", item.name, " (", item, ")"));
  88724. endfor
  88725. endif
  88726. "Use dobjstr, not shortest alias.";
  88727. name = dobjstr;
  88728. "name = what.name;";
  88729. "if (typeof(what.aliases) == LIST && what.aliases != {})";
  88730. "for alias in (what.aliases)";
  88731. "if (length(alias) <= length(name))";
  88732. "name = alias;";
  88733. "endif";
  88734. "endfor";
  88735. "endif";
  88736. vrbs = {};
  88737. commands_ok = (what in {player, player.location});
  88738. dull_classes = {$root_class, $room, $player, $prog};
  88739. what = what;
  88740. printed_working_msg = 0;
  88741. while (what != $nothing)
  88742. if ($command_utils:running_out_of_time())
  88743. if (!printed_working_msg)
  88744. player:notify("Working on list of obvious verbs...");
  88745. printed_working_msg = 1;
  88746. endif
  88747. suspend(0);
  88748. endif
  88749. if (!(what in dull_classes))
  88750. for i in [0..length(verbs(what)) - 1]
  88751. if ($command_utils:running_out_of_time())
  88752. if (!printed_working_msg)
  88753. player:notify("Working on list of obvious verbs...");
  88754. printed_working_msg = 1;
  88755. endif
  88756. suspend(0);
  88757. endif
  88758. info = verb_info(what, tostr(i));
  88759. syntax = verb_args(what, tostr(i));
  88760. if ((index(info[2], "r") && ((syntax[2..3] != {"none", "this"}) && (commands_ok || ("this" in syntax)))) && verb_code(what, tostr(i)))
  88761. dobj = syntax[1];
  88762. prep = syntax[2];
  88763. iobj = syntax[3];
  88764. if (syntax == {"any", "any", "any"})
  88765. prep = "none";
  88766. endif
  88767. if (prep != "none")
  88768. for x in ($string_utils:explode(prep, "/"))
  88769. if (length(x) <= length(prep))
  88770. prep = x;
  88771. endif
  88772. endfor
  88773. endif
  88774. "This is the correct way to handle verbs ending in *";
  88775. vname = info[3];
  88776. while (i = index(vname, "* "))
  88777. vname = tostr(vname[1..i - 1], "<anything>", vname[i + 1..length(vname)]);
  88778. endwhile
  88779. if (vname[i = length(vname)] == "*")
  88780. vname = (vname[1..i - 1] + "<anything>");
  88781. endif
  88782. vname = strsub(vname, " ", "/");
  88783. rest = "";
  88784. if (prep != "none")
  88785. rest = (" " + ((prep == "any") ? "<anything>" | prep));
  88786. if (iobj != "none")
  88787. rest = tostr(rest, " ", (iobj == "this") ? name | "<anything>");
  88788. endif
  88789. endif
  88790. if (dobj != "none")
  88791. rest = tostr(" ", (dobj == "this") ? name | "<anything>", rest);
  88792. endif
  88793. vrbs = setadd(vrbs, ("  " + vname) + rest);
  88794. endif
  88795. endfor
  88796. endif
  88797. what = parent(what);
  88798. endwhile
  88799. if (vrbs)
  88800. player:notify("Obvious Verbs:");
  88801. player:notify_lines(vrbs);
  88802. printed_working_msg && player:notify("(End of list.)");
  88803. elseif (printed_working_msg)
  88804. player:notify("No obvious verbs found.");
  88805. endif
  88806. .
  88807. #6:98
  88808. set_task_perms(player);
  88809. if (!dobjstr)
  88810. player:notify(tostr("Usage:  ", verb, " <object>"));
  88811. return E_INVARG;
  88812. endif
  88813. what = player.location:match_object(dobjstr);
  88814. if ($command_utils:object_match_failed(what, dobjstr))
  88815. return;
  88816. endif
  88817. what:do_examine(player);
  88818. .
  88819. #6:99
  88820. "Add a feature to this player's features list.  Caller must be this or have suitable permissions (this or wizardly).";
  88821. "If this is a nonprogrammer, then ask feature if it is feature_ok (that is, if it has a verb :feature_ok which returns a true value, or a property .feature_ok which is true).";
  88822. "After adding feature, call feature:feature_add(this).";
  88823. "Returns true if successful, E_INVARG if not a valid object, and E_PERM if !feature_ok or if caller doesn't have permission.";
  88824. if ((caller == this) || $perm_utils:controls(caller_perms(), this))
  88825. feature = args[1];
  88826. if ((typeof(feature) != OBJ) || (!valid(feature)))
  88827. return E_INVARG;
  88828. "Not a valid object.";
  88829. endif
  88830. if ($code_utils:verb_or_property(feature, "feature_ok", this))
  88831. "The object is willing to be a feature.";
  88832. if (typeof(this.features) == LIST)
  88833. "If list, we can simply setadd the feature.";
  88834. this.features = setadd(this.features, feature);
  88835. else
  88836. "If not, we erase the old value and create a new list.";
  88837. this.features = {feature};
  88838. endif
  88839. "Tell the feature it's just been added.";
  88840. feature:feature_add(this);
  88841. return 1;
  88842. "We're done.";
  88843. else
  88844. return E_PERM;
  88845. "Feature isn't feature_ok.";
  88846. endif
  88847. else
  88848. return E_PERM;
  88849. "Caller doesn't have permission.";
  88850. endif
  88851. .
  88852. #6:100
  88853. "Remove a feature from this player's features list.  Caller must be this, or have permissions of this, a wizard, or feature.owner.";
  88854. "Returns true if successful, E_PERM if caller didn't have permission.";
  88855. feature = args[1];
  88856. if (((caller == this) || $perm_utils:controls(caller_perms(), this)) || (caller_perms() == feature.owner))
  88857. if (typeof(this.features) == LIST)
  88858. "If this is a list, we can just setremove...";
  88859. this.features = setremove(this.features, feature);
  88860. "Otherwise, we leave it alone.";
  88861. endif
  88862. "Let the feature know it's been removed.";
  88863. feature:feature_remove(this);
  88864. return 1;
  88865. "We're done.";
  88866. else
  88867. return E_PERM;
  88868. "Caller didn't have permission.";
  88869. endif
  88870. .
  88871. #6:101
  88872. "Usage:  @add-feature <feature object>";
  88873. "Add an object to your features list.";
  88874. set_task_perms(player);
  88875. if (dobjstr)
  88876. if (!$command_utils:object_match_failed(dobj, dobjstr))
  88877. if (dobj in player.features)
  88878. player:tell(dobjstr, " is already one of your features.");
  88879. elseif (player:add_feature(dobj))
  88880. player:tell(dobj, " (", dobj.name, ") added as a feature.");
  88881. else
  88882. player:tell("You can't seem to add ", dobj, " (", dobj.name, ") to your features list.");
  88883. endif
  88884. endif
  88885. else
  88886. player:tell("Usage:  @add-feature <object>");
  88887. endif
  88888. .
  88889. #6:102
  88890. "Usage:  @remove-feature <feature object>";
  88891. "Remove an object from your .features list.";
  88892. set_task_perms(player);
  88893. if (dobjstr)
  88894. features = player.features;
  88895. if (!valid(dobj))
  88896. dobj = $string_utils:match(dobjstr, features, "name", features, "aliases");
  88897. endif
  88898. if (!$command_utils:object_match_failed(dobj, dobjstr))
  88899. if (dobj in features)
  88900. player:remove_feature(dobj);
  88901. player:tell(dobj, " (", dobj.name, ") removed from your features list.");
  88902. else
  88903. player:tell(dobjstr, " is not one of your features.");
  88904. endif
  88905. endif
  88906. else
  88907. player:tell("Usage:  @remove-feature <object>");
  88908. endif
  88909. .
  88910. #6:103
  88911. "Usage:  @features [<name>] for <player>";
  88912. "List the feature objects matching <name> used by <player>.";
  88913. if (!iobjstr)
  88914. player:tell("Usage: @features [<name>] for <player>");
  88915. return;
  88916. elseif ($command_utils:player_match_failed(whose = $string_utils:match_player(iobjstr), iobjstr))
  88917. return;
  88918. endif
  88919. features = {};
  88920. for feature in (whose.features)
  88921. if (!valid(feature))
  88922. this:remove_feature(feature);
  88923. elseif ((!dobjstr) || ((dobjstr in feature.aliases) || ((pref = $string_utils:find_prefix(dobjstr, feature.aliases)) || (pref == $ambiguous_match))))
  88924. features = listappend(features, feature);
  88925. endif
  88926. endfor
  88927. if (features)
  88928. len = (max(length("Feature"), length(tostr(max_object()))) + 1);
  88929. player:tell($string_utils:left("Feature", len), "Name");
  88930. player:tell($string_utils:left("-------", len), "----");
  88931. for feature in (features)
  88932. player:tell($string_utils:left(tostr(feature), len), feature.name);
  88933. endfor
  88934. player:tell($string_utils:left("-------", len), "----");
  88935. cstr = (((tostr(length(features)) + " feature") + ((length(features) > 1) ? "s" | "")) + " found");
  88936. if (whose != this)
  88937. cstr = (((((cstr + " on ") + whose.name) + " (") + tostr(whose)) + ")");
  88938. endif
  88939. if (dobjstr)
  88940. cstr = (((cstr + " matching \"") + dobjstr) + "\"");
  88941. endif
  88942. cstr = (cstr + ".");
  88943. player:tell(cstr);
  88944. elseif (dobjstr)
  88945. player:tell("No features found on ", whose.name, " (", whose, ") matching \"", dobjstr, "\".");
  88946. else
  88947. player:tell("No features found on ", whose.name, " (", whose, ").");
  88948. endif
  88949. .
  88950. #6:104
  88951. "Usage:  @features [<name>]";
  88952. "List the feature objects matching <name> used by player.";
  88953. iobjstr = player.name;
  88954. iobj = player;
  88955. this:("@features")();
  88956. .
  88957. #6:105
  88958. stats = memory_usage();
  88959. if (!stats)
  88960. player:notify("Sorry, but no memory-usage statistics are available for this server.");
  88961. return;
  88962. endif
  88963. su = $string_utils;
  88964. player:notify("Block Size   # In Use    # Free    Bytes In Use   Bytes Free");
  88965. player:notify("----------   --------   --------   ------------   ----------");
  88966. nused = (nfree = (bytesused = (bytesfree = 0)));
  88967. kilo = 1024;
  88968. meg = (kilo * kilo);
  88969. for x in (stats)
  88970. if (x[2..3] != {0, 0})
  88971. bsize = x[1];
  88972. if ((bsize % meg) == 0)
  88973. bsize = tostr(bsize / meg, " M");
  88974. elseif ((bsize % kilo) == 0)
  88975. bsize = tostr(bsize / kilo, " K");
  88976. endif
  88977. bused = (x[1] * x[2]);
  88978. bfree = (x[1] * x[3]);
  88979. player:notify(tostr(su:left(bsize, 10), "   ", su:right(su:group_number(x[2]), 8), "   ", su:right(su:group_number(x[3]), 8), "   ", su:right(su:group_number(bused), 12), "   ", su:right(su:group_number(bfree), 10)));
  88980. nused = (nused + x[2]);
  88981. nfree = (nfree + x[3]);
  88982. bytesused = (bytesused + bused);
  88983. bytesfree = (bytesfree + bfree);
  88984. endif
  88985. endfor
  88986. player:notify("");
  88987. player:notify(tostr(su:left("Totals:", 10), "   ", su:right(su:group_number(nused), 8), "   ", su:right(su:group_number(nfree), 8), "   ", su:right(su:group_number(bytesused), 12), "   ", su:right(su:group_number(bytesfree), 10)));
  88988. player:notify("");
  88989. player:notify(tostr("Total Memory Size: ", su:group_number(bytesused + bytesfree), " bytes."));
  88990. .
  88991. #6:106
  88992. player:notify(tostr("The MOO is currently running version ", server_version(), " of the LambdaMOO server code."));
  88993. .
  88994. #6:107
  88995. player:notify(tostr("The server has been up for ", $time_utils:english_time(time() - $last_restart_time), "."));
  88996. .
  88997. #6:108
  88998. boot_player(player);
  88999. "-- argh, let the player decide; #3:disfunc() takes care of this --Rog";
  89000. "player:moveto(player.home)";
  89001. .
  89002. #6:109
  89003. return this == args[1];
  89004. .
  89005. #6:110
  89006. "return true if player is active. This verb is !d";
  89007. return typeof(idle_seconds(this)) != ERR;
  89008. .
  89009. #6:111
  89010. if (args[1] == #-1)
  89011. return E_INVARG;
  89012. this:notify("You are now in #-1, The Void.  Type `home' to get back.");
  89013. endif
  89014. set_task_perms(caller_perms());
  89015. pass(@args);
  89016. .
  89017. #6:112
  89018. return this.location:(verb)(@args);
  89019. "temporarily let player:announce be noisy to player";
  89020. if (verb == "announce_all_but")
  89021. if (this in args[1])
  89022. return;
  89023. endif
  89024. args = args[2..length(args)];
  89025. endif
  89026. this:tell("(from within you) ", @args);
  89027. .
  89028. #6:113
  89029. "Return a true value if this needs linewrapping.";
  89030. "default is true if .linelen > 0";
  89031. return this.linelen > 0;
  89032. .
  89033. #6:114
  89034. "Usage:  @set-note-{string | text} {#xx | #xx.pname}";
  89035. "        ...lines of text...";
  89036. "        .";
  89037. "";
  89038. "For use by clients' local editors, to save new text for a note or object property.  See $note_editor:local_editing_info() for details.";
  89039. set_task_perms(player);
  89040. text = $command_utils:read_lines(1);
  89041. if ((verb == "@set-note-string") && (length(text) <= 1))
  89042. text = (text ? text[1] | "");
  89043. endif
  89044. if (spec = $code_utils:parse_propref(argstr))
  89045. o = toobj(spec[1]);
  89046. p = spec[2];
  89047. e = (o.(p) = text);
  89048. if (e != text)
  89049. player:tell("Error: ", e);
  89050. else
  89051. player:tell("Set ", p, " property of ", o.name, " (", o, ").");
  89052. endif
  89053. elseif (typeof(note = $code_utils:toobj(argstr)) == OBJ)
  89054. e = note:set_text(text);
  89055. if (typeof(e) == ERR)
  89056. player:tell("Error: ", e);
  89057. else
  89058. player:tell("Set text of ", note.name, " (", note, ").");
  89059. endif
  89060. else
  89061. player:tell("Error: Malformed argument to ", verb, ": ", argstr);
  89062. endif
  89063. .
  89064. #6:115
  89065. "Copied from Generic Player Class With Additional Features of Dubious Utility (#7069):verb_sub by ur-Rog (#6349) Tue Nov 10 15:03:38 1992 PST";
  89066. text = args[1];
  89067. if (a = $list_utils:assoc(text, this.verb_subs))
  89068. return a[2];
  89069. else
  89070. return $gender_utils:get_conj(text, this);
  89071. endif
  89072. .
  89073. #6:116
  89074. if ($perm_utils:controls(caller_perms(), this))
  89075. return this.(verb);
  89076. else
  89077. return E_PERM;
  89078. endif
  89079. .
  89080. #6:117
  89081. lines = args[1];
  89082. if (typeof(lines) != LIST)
  89083. lines = {lines};
  89084. endif
  89085. if (this.gaglist || this.paranoid)
  89086. "Check the above first, default case, to save ticks.  Paranoid gaggers are cost an extra three or so ticks by this, probably a net savings.";
  89087. if (this:gag_p())
  89088. return;
  89089. endif
  89090. if (this.paranoid == 2)
  89091. z = this:whodunnit({@callers(), {player, "", player}}, {this, $no_one}, {})[3];
  89092. lines = {((("[start text by " + z.name) + " (") + tostr(z)) + ")]", @lines, ((("[end text by " + z.name) + " (") + tostr(z)) + ")]"};
  89093. elseif (this.paranoid == 1)
  89094. this.responsible = {@this.responsible, {{@callers(), {player, "<cmd-line>", player}}, lines}};
  89095. if (((len = length(this.responsible)) * 2) > (this.lines * 3))
  89096. this.responsible = this.responsible[(len - this.lines) + 1..len];
  89097. endif
  89098. else
  89099. this.responsible = {};
  89100. endif
  89101. endif
  89102. "don't gather stats for now: $list_utils:check_nonstring_tell_lines(lines)";
  89103. this:notify_lines($list_utils:map_builtin(lines, "tostr"));
  89104. .
  89105. #6:118
  89106. "Copied from generic room (#3):@lastlog by Haakon (#2) Wed Dec 30 13:30:02 1992 PST";
  89107. if (dobjstr != "")
  89108. dobj = $string_utils:match_player(dobjstr);
  89109. if (!valid(dobj))
  89110. player:tell("Who?");
  89111. return;
  89112. endif
  89113. folks = {dobj};
  89114. else
  89115. folks = players();
  89116. endif
  89117. day = (week = (month = (ever = (never = {}))));
  89118. a_day = ((24 * 60) * 60);
  89119. a_week = (7 * a_day);
  89120. a_month = (30 * a_day);
  89121. now = time();
  89122. for x in (folks)
  89123. when = x.last_connect_time;
  89124. how_long = (now - when);
  89125. if ((when == 0) || (when > now))
  89126. never = {@never, x};
  89127. elseif (how_long < a_day)
  89128. day = {@day, x};
  89129. elseif (how_long < a_week)
  89130. week = {@week, x};
  89131. elseif (how_long < a_month)
  89132. month = {@month, x};
  89133. else
  89134. ever = {@ever, x};
  89135. endif
  89136. endfor
  89137. for entry in ({{day, "the last day"}, {week, "the last week"}, {month, "the last 30 days"}, {ever, "recorded history"}})
  89138. if (entry[1])
  89139. player:tell("Players who have connected within ", entry[2], ":");
  89140. for x in (entry[1])
  89141. player:tell("  ", x.name, " last connected ", ctime(x.last_connect_time), ".");
  89142. endfor
  89143. endif
  89144. endfor
  89145. if (never)
  89146. player:tell("Players who have never connected:");
  89147. player:tell("  ", $string_utils:english_list($list_utils:map_prop(never, "name")));
  89148. endif
  89149. .
  89150. #6:119
  89151. "Set linelength.  Linelength must be an integer >= 10.";
  89152. "If wrap is currently off (i.e. linelength is less than 0), maintains sign.  That is, this function *takes* an absolute value, and coerces the sign to be appropriate.";
  89153. "If you want to override the dwimming of wrap, pass in a second argument.";
  89154. "returns E_PERM if not allowed, E_INVARG if linelength is too low, otherwise the linelength.";
  89155. if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
  89156. return E_PERM;
  89157. elseif (abs(len = args[1]) < 10)
  89158. return E_INVARG;
  89159. elseif (length(args) > 1)
  89160. this.linelen = len;
  89161. else
  89162. "DWIM here.";
  89163. this.linelen = ((this.linelen > 0) ? len | (-len));
  89164. return len;
  89165. endif
  89166. .
  89167. #6:120
  89168. "Set pagelength. Must be an integer >= 5, or 0 to turn pagelength off.";
  89169. "Returns E_PERM if you shouldn't be doing this, E_INVARG if it's too low, otherwise, what it got set to.";
  89170. if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
  89171. return E_PERM;
  89172. elseif (((len = args[1]) < 5) && (len != 0))
  89173. return E_INVARG;
  89174. else
  89175. return this.pagelen = len;
  89176. endif
  89177. .
  89178. #6:121
  89179. "set_home(newhome) attempts to change this.home to newhome";
  89180. "E_TYPE   if newhome doesn't have a callable :accept_for_abode verb.";
  89181. "E_INVARG if newhome won't accept you as a resident.";
  89182. "E_PERM   if you don't own this and aren't its parent.";
  89183. "1        if it works.";
  89184. newhome = args[1];
  89185. if ((caller == this) || $perm_utils:controls(caller_perms(), this))
  89186. if ($object_utils:has_callable_verb(newhome, "accept_for_abode"))
  89187. if (newhome:accept_for_abode(this))
  89188. return (typeof(e = (this.home = args[1])) != ERR) || e;
  89189. else
  89190. return E_INVARG;
  89191. endif
  89192. else
  89193. return E_TYPE;
  89194. endif
  89195. else
  89196. return E_PERM;
  89197. endif
  89198. .
  89199. #6:122
  89200. "@unsubscribe [*<folder/mailing_list> ...]";
  89201. "entirely removes the record of your current message for the named folders,";
  89202. "indicating your disinterest in anything that might appear there in the future.";
  89203. set_task_perms(player);
  89204. unsubscribed = {};
  89205. current_folder = this:current_folder();
  89206. for a in (args || {0})
  89207. if (a ? $mail_agent:match_failed(folder = $mail_agent:match_recipient(a), a) | (folder = current_folder))
  89208. "...bogus folder name, done...  No, try anyway.";
  89209. if (this:kill_current_message(this:my_match_object(a)))
  89210. player:notify("Invalid folder, but found it subscribed anyway.  Removed.");
  89211. endif
  89212. elseif (folder == this)
  89213. player:notify(tostr("You can't ", verb, " yourself."));
  89214. else
  89215. if (!this:kill_current_message(folder))
  89216. player:notify(tostr("You weren't subscribed to ", $mail_agent:name(folder)));
  89217. if ($object_utils:isa(folder, $mail_recipient))
  89218. result = folder:delete_notify(this);
  89219. if ((typeof(result) == LIST) && (result[1] == this))
  89220. player:notify("Removed you from the mail notifications list.");
  89221. endif
  89222. endif
  89223. else
  89224. unsubscribed = {@unsubscribed, folder};
  89225. if ($object_utils:isa(folder, $mail_recipient))
  89226. folder:delete_notify(this);
  89227. endif
  89228. endif
  89229. endif
  89230. endfor
  89231. if (unsubscribed)
  89232. player:notify(tostr("Forgetting about ", $string_utils:english_list($list_utils:map_arg($mail_agent, "name", unsubscribed))));
  89233. if (current_folder in unsubscribed)
  89234. this:set_current_folder(this);
  89235. endif
  89236. endif
  89237. .
  89238. #6:123
  89239. if (player != this)
  89240. return player:notify(tostr(E_PERM));
  89241. endif
  89242. who = this;
  89243. if ($object_utils:isa(this, $guest))
  89244. who:notify("Sorry, guests should use the '@request' command to request a character.");
  89245. return;
  89246. endif
  89247. connection = $string_utils:connection_hostname(connection_name(who));
  89248. email = iobjstr;
  89249. if (reason = $wiz_utils:check_reregistration(this.name, email, connection))
  89250. if (reason[1] == "-")
  89251. if (!$command_utils:yes_or_no(reason[2..length(reason)] + ". Automatic registration not allowed. Ask to be registered at this address anyway?"))
  89252. who:notify("Okay.");
  89253. return;
  89254. endif
  89255. else
  89256. return who:notify(tostr(reason, " Please try again."));
  89257. endif
  89258. endif
  89259. if ($network.active && (!reason))
  89260. if (!$command_utils:yes_or_no(tostr("If you continue, your password will be changed, the new password mailed to `", email, "'. Do you want to continue?")))
  89261. return who:notify("Registration terminated.");
  89262. endif
  89263. password = $wiz_utils:random_password(5);
  89264. old = (who.email_address || "[ unregistered ]");
  89265. who:notify(tostr("Registering you, and changing your password and mailing new one to ", email, "."));
  89266. result = $network:sendmail(email, tostr("Your ", $network.MOO_Name, " character, ", who.name), "Reply-to: " + $login.registration_address, @$generic_editor:fill_string(tostr("Your ", $network.MOO_name, " character, ", $string_utils:nn(who), " has been registered to this email address (", email, "), and a new password assigned.  The new password is `", password, "'. Please keep your password secure. You can change your password with the @password command."), 75));
  89267. if (result != 0)
  89268. who:notify(tostr("Mail sending did not work: ", reason, ". Reregistration terminated."));
  89269. return;
  89270. endif
  89271. who:notify(tostr("Mail with your new password forwarded. If you do not get it, send regular email to ", $login.registration_address, " with your character name."));
  89272. $mail_agent:send_message($new_player_log.autoregistration_player, $new_player_log, "reg " + $string_utils:nn(this), {email, tostr("formerly ", old)});
  89273. $registration_db:add(this, email, "Reregistered at " + ctime());
  89274. this.email_address = email;
  89275. who.password = crypt(password);
  89276. else
  89277. who:notify("No automatic reregistration: your request will be forwarded.");
  89278. $mail_agent:send_message(this, $registration_db.registrar, "Registration request", {((("Reregistration request from " + $string_utils:nn(who)) + " connected via ") + connection) + ":", "", (("@register " + who.name) + " ") + email, "@new-password " + who.name});
  89279. endif
  89280. .
  89281. #6:124
  89282. ":ctime([NUM time]) => STR as the function.";
  89283. "May be hacked by players and player-classes to reflect differences in time-zone.";
  89284. return ctime(@args);
  89285. .
  89286. #6:125
  89287. oplayer = $player_db:find(dobjstr);
  89288. if (oplayer == $ambiguous_match)
  89289. player:tell("Sorry, that name isn't unique.");
  89290. elseif (oplayer == $failed_match)
  89291. player:tell("Sorry, I couldn't find that player.");
  89292. else
  89293. player:moveto(oplayer.location);
  89294. endif
  89295. .
  89296. #6:126
  89297. if (is_player(dobj))
  89298. dobj:tell("#$#beep");
  89299. player:tell("You beeped ", dobj.name);
  89300. if (dobj != player)
  89301. dobj:tell(player.name, " beeps you...");
  89302. endif
  89303. endif
  89304. .
  89305. #6:127
  89306. if (is_player(dobj))
  89307. dobj:tell("#$#Yield");
  89308. endif
  89309. .
  89310. #6:128
  89311. if (is_player(dobj))
  89312. dobj:tell("#$#alert stop \"", iobjstr, "\"");
  89313. player:tell("You sent a stop alert to ", dobj.name);
  89314. if (dobj != player)
  89315. dobj:tell(player.name, " has sent you a stop alert....");
  89316. endif
  89317. endif
  89318. .
  89319. #6:129
  89320. if (is_player(dobj))
  89321. dobj:tell("#$#alert note \"", iobjstr, "\"");
  89322. player:tell("You sent a note alert to ", dobj.name);
  89323. if (dobj != player)
  89324. dobj:tell(player.name, " has sent you a note alert....");
  89325. endif
  89326. endif
  89327. .
  89328. #6:130
  89329. if (is_player(dobj))
  89330. dobj:tell("#$#alert caution \"", iobjstr, "\"");
  89331. player:tell("You sent a caution alert to ", dobj.name);
  89332. if (dobj != player)
  89333. dobj:tell(player.name, " has sent you a caution alert....");
  89334. endif
  89335. endif
  89336. .
  89337. #6:131
  89338. if (is_player(dobj))
  89339. dobj:tell("#$#alert oops \"", iobjstr, "\"");
  89340. player:tell("You sent an alert to ", dobj.name);
  89341. if (dobj != player)
  89342. dobj:tell(player.name, " has sent you an alert....");
  89343. endif
  89344. endif
  89345. .
  89346. #6:132
  89347. if (is_player(iobj))
  89348. iobj:tell("#$#speak \"", dobjstr, "\"");
  89349. endif
  89350. .
  89351. #6:133
  89352. if (is_player(dobj))
  89353. dobj:tell("#$#whistle");
  89354. player:tell("You whistled at ", dobj.name);
  89355. if (dobj != player)
  89356. dobj:tell(player.name, " whistles at you....");
  89357. endif
  89358. endif
  89359. .
  89360. #7:0
  89361. this:move(player);
  89362. .
  89363. #7:1
  89364. what = args[1];
  89365. "if (what.location != this.source)";
  89366. "  player:tell(\"You can't go that way.\")";
  89367. "  return";
  89368. "endif";
  89369. unlocked = this:is_unlocked_for(what);
  89370. if (unlocked)
  89371. this.dest:bless_for_entry(what);
  89372. endif
  89373. if (unlocked && this.dest:accept(what))
  89374. start = what.location;
  89375. if (msg = this:leave_msg(what))
  89376. what:tell_lines(msg);
  89377. endif
  89378. what:moveto(this.dest);
  89379. if (what.location != start)
  89380. "Don't print oleave messages if WHAT didn't actually go anywhere...";
  89381. msg = (this:oleave_msg(what) || this:defaulting_oleave_msg(what));
  89382. start:announce_all_but({what}, what:titlec(), " ", msg || "has left.");
  89383. endif
  89384. if (what.location == this.dest)
  89385. "Don't print arrive messages if WHAT didn't really end up there...";
  89386. if (msg = this:arrive_msg(what))
  89387. what:tell_lines(msg);
  89388. endif
  89389. msg = this:oarrive_msg(what);
  89390. what.location:announce_all_but({what}, what:titlec(), " ", msg || "has arrived.");
  89391. endif
  89392. else
  89393. if (msg = this:nogo_msg(what))
  89394. what:tell_lines(msg);
  89395. else
  89396. what:tell("You can't go that way.");
  89397. endif
  89398. if (msg = this:onogo_msg(what))
  89399. what.location:announce_all_but({what}, what:titlec(), " ", msg);
  89400. endif
  89401. endif
  89402. .
  89403. #7:2
  89404. if ((caller == this) || $perm_utils:controls(caller_perms(), this))
  89405. "... relies on -d...";
  89406. this.source:remove_exit(this);
  89407. this.dest:remove_entrance(this);
  89408. return pass(@args);
  89409. else
  89410. return E_PERM;
  89411. endif
  89412. .
  89413. #7:3
  89414. msg = this.(verb);
  89415. return msg ? $string_utils:pronoun_sub(msg, @args) | "";
  89416. .
  89417. #7:4
  89418. if ($perm_utils:controls(cp = caller_perms(), this) || (valid(this.source) && (this.source.owner == cp)))
  89419. return (typeof(e = (this.name = args[1])) != ERR) || e;
  89420. else
  89421. return E_PERM;
  89422. endif
  89423. .
  89424. #7:5
  89425. if ($perm_utils:controls(cp = caller_perms(), this) || (valid(this.source) && (this.source.owner == cp)))
  89426. if (typeof(e = (this.aliases = args[1])) == ERR)
  89427. return e;
  89428. else
  89429. return 1;
  89430. endif
  89431. else
  89432. return E_PERM;
  89433. endif
  89434. .
  89435. #7:6
  89436. "This is intended to be called only by exits, for announcing various oxxx messages.  First argument is room to announce in.  Second argument is as in $room:announce_all_but's first arg, who not to announce to.  Rest args are what to say.  If the final arg is a list, prepends all the other rest args to the first line and emits the lines separately.";
  89437. where = args[1];
  89438. whobut = args[2];
  89439. nargs = length(args);
  89440. last = args[nargs];
  89441. if (typeof(last) == LIST)
  89442. where:announce_all_but(whobut, @args[3..nargs - 1], last[1]);
  89443. for line in (last[2..length(last)])
  89444. where:announce_all_but(whobut, line);
  89445. endfor
  89446. else
  89447. where:announce_all_but(@args[3..nargs]);
  89448. endif
  89449. .
  89450. #7:7
  89451. for k in ({this.name, @this.aliases})
  89452. if (k in {"east", "west", "south", "north", "northeast", "southeast", "southwest", "northwest", "out", "up", "down", "nw", "sw", "ne", "se", "in"})
  89453. return ("goes " + k) + ".";
  89454. elseif (k in {"leave", "out", "exit"})
  89455. return "leaves";
  89456. endif
  89457. endfor
  89458. if ((index(this.name, "an ") == 1) || (index(this.name, "a ") == 1))
  89459. return ("leaves for " + this.name) + ".";
  89460. else
  89461. return ("leaves for the " + this.name) + ".";
  89462. endif
  89463. .
  89464. #7:8
  89465. if ((caller in {this, this.owner}) || $perm_utils:controls(caller_perms(), this))
  89466. return pass(@args);
  89467. else
  89468. return E_PERM;
  89469. endif
  89470. .
  89471. #7:9
  89472. "examine_key(examiner)";
  89473. "return a list of strings to be told to the player, indicating what the key on this type of object means, and what this object's key is set to.";
  89474. "the default will only tell the key to a wizard or this object's owner.";
  89475. who = args[1];
  89476. if (((caller == this) && $perm_utils:controls(who, this)) && (this.key != 0))
  89477. return {tostr(this:title(), " will only transport objects matching this key:"), tostr("  ", $lock_utils:unparse_key(this.key))};
  89478. endif
  89479. .
  89480. #8:0
  89481. if ((this.location != player) && (this.location != player.location))
  89482. player:tell("You can't get at ", this.name, ".");
  89483. elseif (dobj == $nothing)
  89484. player:tell("What do you want to put in ", this.name, "?");
  89485. elseif ($command_utils:object_match_failed(dobj, dobjstr))
  89486. elseif (!this.opened)
  89487. player:tell(this.name, " is closed.");
  89488. else
  89489. dobj:moveto(this);
  89490. if (dobj.location == this)
  89491. player:tell(this:put_msg());
  89492. if (msg = this:oput_msg())
  89493. player.location:announce(player.name, " ", msg);
  89494. endif
  89495. else
  89496. player:tell(this:put_fail_msg());
  89497. if (msg = this:oput_fail_msg())
  89498. player.location:announce(player.name, " ", msg);
  89499. endif
  89500. endif
  89501. endif
  89502. .
  89503. #8:1
  89504. if (!this.opened)
  89505. player:tell(this.name, " is not open.");
  89506. elseif (this.dark)
  89507. player:tell("You can't see into ", this.name, " to remove anything.");
  89508. elseif ((dobj = this:match_object(dobjstr)) == $nothing)
  89509. player:tell("What do you want to take from ", this.name, "?");
  89510. elseif ($command_utils:object_match_failed(dobj, dobjstr))
  89511. elseif (!(dobj in this:contents()))
  89512. player:tell(dobj.name, " isn't in ", this.name, ".");
  89513. else
  89514. dobj:moveto(player);
  89515. if (dobj.location == player)
  89516. player:tell(this:remove_msg());
  89517. if (msg = this:oremove_msg())
  89518. player.location:announce(player.name, " ", msg);
  89519. endif
  89520. else
  89521. dobj:moveto(this.location);
  89522. if (dobj.location == this.location)
  89523. player:tell(this:remove_msg());
  89524. if (msg = this:oremove_msg())
  89525. player.location:announce(player.name, " ", msg);
  89526. endif
  89527. player:tell("You can't pick up ", dobj.name, ", so it tumbles onto the floor.");
  89528. else
  89529. player:tell(this:remove_fail_msg());
  89530. if (msg = this:oremove_fail_msg())
  89531. player.location:announce(player.name, " ", msg);
  89532. endif
  89533. endif
  89534. endif
  89535. endif
  89536. .
  89537. #8:2
  89538. pass();
  89539. if (!this.dark)
  89540. this:tell_contents();
  89541. endif
  89542. .
  89543. #8:3
  89544. return !is_player(args[1]);
  89545. .
  89546. #8:4
  89547. if (this.opened)
  89548. player:tell("It's already open.");
  89549. "elseif (this:is_openable_by(player))";
  89550. elseif (this:is_openable_by(callers() ? caller_perms() | player))
  89551. this:set_opened(1);
  89552. player:tell(this:open_msg());
  89553. if (msg = this:oopen_msg())
  89554. player.location:announce(player.name, " ", msg);
  89555. endif
  89556. else
  89557. player:tell(this:open_fail_msg());
  89558. if (msg = this:oopen_fail_msg())
  89559. player.location:announce(player.name, " ", msg);
  89560. endif
  89561. endif
  89562. .
  89563. #8:5
  89564. set_task_perms(player);
  89565. key = $lock_utils:parse_keyexp(iobjstr, player);
  89566. if (typeof(key) == STR)
  89567. player:tell("That key expression is malformed:");
  89568. player:tell("  ", key);
  89569. else
  89570. res = (this.open_key = key);
  89571. if (typeof(res) == ERR)
  89572. player:tell(res, ".");
  89573. else
  89574. player:tell("Locked opening of ", this.name, " with this key:");
  89575. player:tell("  ", $lock_utils:unparse_key(key));
  89576. endif
  89577. endif
  89578. .
  89579. #8:6
  89580. return (this.open_key == 0) || $lock_utils:eval_key(this.open_key, args[1]);
  89581. .
  89582. #8:7
  89583. if (!this.opened)
  89584. player:tell("It's already closed.");
  89585. else
  89586. this:set_opened(0);
  89587. player:tell(this:close_msg());
  89588. if (msg = this:oclose_msg())
  89589. player.location:announce(player.name, " ", msg);
  89590. endif
  89591. endif
  89592. .
  89593. #8:8
  89594. set_task_perms(player);
  89595. res = (dobj.open_key = 0);
  89596. if (typeof(res) == ERR)
  89597. player:tell(res, ".");
  89598. else
  89599. player:tell("Unlocked ", dobj.name, " for opening.");
  89600. endif
  89601. .
  89602. #8:9
  89603. if (this.contents)
  89604. player:tell("Contents:");
  89605. for thing in (this.contents)
  89606. player:tell("  ", thing:title());
  89607. endfor
  89608. elseif (msg = this:empty_msg())
  89609. player:tell(msg);
  89610. endif
  89611. .
  89612. #8:10
  89613. if (!$perm_utils:controls(caller.owner, this))
  89614. return E_PERM;
  89615. else
  89616. this.opened = (opened = (!(!args[1])));
  89617. this.dark = (this.opaque > opened);
  89618. return opened;
  89619. endif
  89620. .
  89621. #8:11
  89622. if (!$perm_utils:controls(player, this))
  89623. player:tell("Can't set opacity of something you don't own.");
  89624. elseif ((iobjstr != "0") && (!tonum(iobjstr)))
  89625. player:tell("Opacity must be an integer (0, 1, 2).");
  89626. else
  89627. player:tell("Opacity changed:  Now " + {"transparent.", "opaque.", "a black hole."}[1 + this:set_opaque(tonum(iobjstr))]);
  89628. endif
  89629. .
  89630. #8:12
  89631. if (!$perm_utils:controls(caller.owner, this))
  89632. return E_PERM;
  89633. elseif (typeof(number = args[1]) != NUM)
  89634. return E_INVARG;
  89635. else
  89636. number = ((number < 0) ? 0 | ((number > 2) ? 2 | number));
  89637. this.dark = (number > this.opened);
  89638. return this.opaque = number;
  89639. endif
  89640. .
  89641. #8:13
  89642. return (msg = this.(verb)) ? $string_utils:pronoun_sub(msg) | "";
  89643. .
  89644. #9:0
  89645. if (!this:is_readable_by(valid(caller_perms()) ? caller_perms() | player))
  89646. player:tell("Sorry, but it seems to be written in some code that you can't read.");
  89647. else
  89648. this:look_self();
  89649. player:tell();
  89650. for line in (this:text())
  89651. player:tell(line);
  89652. endfor
  89653. player:tell();
  89654. player:tell("(You finish reading.)");
  89655. endif
  89656. .
  89657. #9:1
  89658. if (this:is_writable_by(valid(caller_perms()) ? caller_perms() | player))
  89659. this:set_text({});
  89660. player:tell("Note erased.");
  89661. else
  89662. player:tell("You can't erase this note.");
  89663. endif
  89664. .
  89665. #9:2
  89666. if (this:is_writable_by(valid(caller_perms()) ? caller_perms() | player))
  89667. this:set_text({@this.text, dobjstr});
  89668. player:tell("Line added to note.");
  89669. else
  89670. player:tell("You can't write on this note.");
  89671. endif
  89672. .
  89673. #9:3
  89674. if (!this:is_writable_by(player))
  89675. player:tell("You can't modify this note.");
  89676. elseif (!dobjstr)
  89677. player:tell("You must tell me which line to delete.");
  89678. else
  89679. line = tonum(dobjstr);
  89680. if (line < 0)
  89681. line = ((line + length(this.text)) + 1);
  89682. endif
  89683. if ((line <= 0) || (line > length(this.text)))
  89684. player:tell("Line out of range.");
  89685. else
  89686. this:set_text(listdelete(this.text, line));
  89687. player:tell("Line deleted.");
  89688. endif
  89689. endif
  89690. .
  89691. #9:4
  89692. set_task_perms(player);
  89693. key = $lock_utils:parse_keyexp(iobjstr, player);
  89694. if (typeof(key) == STR)
  89695. player:tell("That key expression is malformed:");
  89696. player:tell("  ", key);
  89697. else
  89698. res = (this.encryption_key = key);
  89699. if (typeof(res) == ERR)
  89700. player:tell(res, ".");
  89701. else
  89702. player:tell("Encrypted ", this.name, " with this key:");
  89703. player:tell("  ", $lock_utils:unparse_key(key));
  89704. endif
  89705. endif
  89706. .
  89707. #9:5
  89708. set_task_perms(player);
  89709. res = (dobj.encryption_key = 0);
  89710. if (typeof(res) == ERR)
  89711. player:tell(res, ".");
  89712. else
  89713. player:tell("Decrypted ", dobj.name, ".");
  89714. endif
  89715. .
  89716. #9:6
  89717. cp = caller_perms();
  89718. if ($perm_utils:controls(cp, this) || this:is_readable_by(cp))
  89719. return this.text;
  89720. else
  89721. return E_PERM;
  89722. endif
  89723. .
  89724. #9:7
  89725. key = this.encryption_key;
  89726. return (!key) || $lock_utils:eval_key(key, args[1]);
  89727. .
  89728. #9:8
  89729. cp = caller_perms();
  89730. newtext = args[1];
  89731. if ($perm_utils:controls(cp, this) || this:is_writable_by(cp))
  89732. if (typeof(newtext) == LIST)
  89733. this.text = newtext;
  89734. else
  89735. return E_TYPE;
  89736. endif
  89737. else
  89738. return E_PERM;
  89739. endif
  89740. .
  89741. #9:9
  89742. who = args[1];
  89743. wr = this.writers;
  89744. if ($perm_utils:controls(who, this))
  89745. return 1;
  89746. elseif (typeof(wr) == LIST)
  89747. return who in wr;
  89748. else
  89749. return wr;
  89750. endif
  89751. .
  89752. #9:10
  89753. "Usage:  mailme <note>";
  89754. "  uses $network to sends the text of this note to your REAL internet email address.";
  89755. if (!this:is_readable_by(player))
  89756. player:tell("Sorry, but it seems to be written in some code that you can't read.");
  89757. elseif (!player.email_address)
  89758. player:tell("Sorry, you don't have a registered email address.");
  89759. return;
  89760. elseif (!$network.active)
  89761. player:tell("Sorry, internet mail is disabled.");
  89762. elseif (!(text = this:text()))
  89763. player:tell($string_utils:pronoun_sub("%T is empty--there wouldn't be any point to mailing it."));
  89764. return;
  89765. endif
  89766. player:tell("Mailing ", this:title(), " to ", player.email_address, ".");
  89767. player:tell("... ", length(text), " lines ...");
  89768. suspend(0);
  89769. $network:sendmail(player.email_address, this:titlec(), @text);
  89770. .
  89771. #10:0
  89772. raw = ctime(this.last_write_time);
  89773. "         111111111122222";
  89774. "123456789012345678901234";
  89775. "Fri Nov 30 14:31:21 1990";
  89776. date = ((raw[1..10] + ",") + raw[20..24]);
  89777. return strsub(this.description, "%d", date);
  89778. .
  89779. #10:1
  89780. pass(@args);
  89781. pos = (player in this.readers);
  89782. if (pos)
  89783. this.readtimes[pos] = time();
  89784. elseif (!$object_utils:isa(player, $guest))
  89785. this.readers = {@this.readers, player};
  89786. this.readtimes = {@this.readtimes, time()};
  89787. endif
  89788. .
  89789. #10:2
  89790. who = caller;
  89791. pos = (who in this.readers);
  89792. if (pos)
  89793. if (this.readtimes[pos] < this.last_write_time)
  89794. this:announce_new_edition(who);
  89795. endif
  89796. else
  89797. who:notify("Don't forget to take a look at the newspaper.  Type 'news' to see it.");
  89798. endif
  89799. .
  89800. #10:3
  89801. if ($perm_utils:controls(valid(caller_perms()) ? caller_perms() | player, this))
  89802. this.last_write_time = time();
  89803. for p in (connected_players())
  89804. this:announce_new_edition(p);
  89805. endfor
  89806. if (callers() == {})
  89807. player:notify("The newspaper has been marked as newly-edited.");
  89808. endif
  89809. else
  89810. player:notify("Permission denied.");
  89811. endif
  89812. .
  89813. #10:4
  89814. if (caller_perms().wizard)
  89815. pass();
  89816. this:set_text({"There's no news unless you write it."});
  89817. this.description = "It's the latest issue of the MOO Herald-Examiner, dated %d.";
  89818. this.take_failed_msg = "Realizing that the newspaper is to be shared among all of the players, you change your mind about picking it up.";
  89819. this.readtimes = (this.readers = (this.writers = {}));
  89820. else
  89821. return E_PERM;
  89822. endif
  89823. .
  89824. #10:5
  89825. if (caller == this)
  89826. args[1]:notify("There's a new edition of the newspaper.  Type 'news' to see it.");
  89827. endif
  89828. .
  89829. #10:6
  89830. if (!$perm_utils:controls(player, this))
  89831. player:tell("Sorry, you can't hack on the newspaper.");
  89832. else
  89833. original = length(this.readers);
  89834. newplayers = {};
  89835. newtimes = {};
  89836. index = 0;
  89837. for p in (this.readers)
  89838. index = (index + 1);
  89839. if (valid(p) && is_player(p))
  89840. newplayers = {@newplayers, p};
  89841. newtimes = {@newtimes, this.readtimes[index]};
  89842. endif
  89843. $command_utils:suspend_if_needed(0);
  89844. endfor
  89845. this.readers = newplayers;
  89846. this.readtimes = newtimes;
  89847. player:tell("Done.  Removed ", original - length(this.readtimes), " bogus readers.");
  89848. endif
  89849. .
  89850. #10:7
  89851. if (this:is_writable_by(caller_perms()))
  89852. this.last_write_time = time();
  89853. return pass(@args);
  89854. else
  89855. return E_PERM;
  89856. endif
  89857. .
  89858. #11:0
  89859. junk = {};
  89860. while (1)
  89861. for x in (junk)
  89862. $command_utils:suspend_if_needed(0);
  89863. if (x in this.contents)
  89864. "This is old junk that's still around five minutes later.  Clean it up.";
  89865. if (!valid(x.owner))
  89866. move(x, $nothing);
  89867. #2:tell(">**> Cleaned up orphan object `", x.name, "' (", x, "), owned by ", x.owner, ", to #-1.");
  89868. elseif (!$object_utils:contains(x, x.owner))
  89869. move(x, x.owner);
  89870. x.owner:tell("You shouldn't leave junk in ", this.name, "; ", x.name, " (", x, ") has been moved to your inventory.");
  89871. #2:tell(">**> Cleaned up `", x.name, "' (", x, "), owned by `", x.owner.name, "' (", x.owner, "), to ", x.owner, ".");
  89872. endif
  89873. endif
  89874. endfor
  89875. junk = {};
  89876. for x in (this.contents)
  89877. if ((seconds_left() < 2) || (ticks_left() < 1000))
  89878. suspend(0);
  89879. endif
  89880. if (!is_player(x))
  89881. junk = {@junk, x};
  89882. endif
  89883. endfor
  89884. suspend(5 * 60);
  89885. endwhile
  89886. .
  89887. #11:1
  89888. who = args[1];
  89889. if (who.home == this)
  89890. move(who, $limbo);
  89891. this:announce("You hear a quiet popping sound; ", who.name, " has disconnected.");
  89892. else
  89893. pass(who);
  89894. endif
  89895. .
  89896. #11:2
  89897. who = args[1];
  89898. if ($limbo:accept(who))
  89899. move(who, $limbo);
  89900. else
  89901. pass(who);
  89902. endif
  89903. .
  89904. #11:3
  89905. m = pass(@args);
  89906. if (m == $failed_match)
  89907. "... it might be a player off in the body bag...";
  89908. m = $string_utils:match_player(args[1]);
  89909. if (valid(m) && (!(m.location in {this, this.body_bag})))
  89910. return $failed_match;
  89911. endif
  89912. endif
  89913. return m;
  89914. .
  89915. #11:4
  89916. if (!caller_perms().wizard)
  89917. return E_PERM;
  89918. endif
  89919. for v in ({"turn", "open"})
  89920. delete_verb($player_start, v);
  89921. endfor
  89922. for p in ({"out"})
  89923. delete_property($player_start, p);
  89924. endfor
  89925. for p in ($object_utils:all_properties($room))
  89926. $player_start.(p) = $room.(p);
  89927. endfor
  89928. $player_start.name = "The First Room";
  89929. $player_start.aliases = {};
  89930. $player_start.description = "This is all there is right now.";
  89931. $player_start.exits = ($player_start.entrances = {});
  89932. .
  89933. #12:0
  89934. if (caller != #0)
  89935. return E_PERM;
  89936. else
  89937. clist = {};
  89938. for i in [0..length(verbs(this)) - 1]
  89939. if ((verb_args(this, tostr(i)) == {"any", "none", "any"}) && index((info = verb_info(this, tostr(i)))[2], "x"))
  89940. vname = $string_utils:explode(info[3])[1];
  89941. star = index(vname + "*", "*");
  89942. clist = {@clist, $string_utils:uppercase(vname[1..star - 1]) + strsub(vname[star..length(vname)], "*", "")};
  89943. endif
  89944. endfor
  89945. notify(player, "I don't understand that.  Valid commands at this point are");
  89946. notify(player, "   " + $string_utils:english_list(setremove(clist, "?"), "", " or "));
  89947. return 0;
  89948. endif
  89949. .
  89950. #12:1
  89951. if (caller != #0)
  89952. return E_PERM;
  89953. else
  89954. msg = this.welcome_message;
  89955. for line in ((typeof(msg) == LIST) ? msg | {msg})
  89956. if (typeof(line) == STR)
  89957. notify(player, line);
  89958. endif
  89959. endfor
  89960. this:check_player_db();
  89961. this:check_for_shutdown();
  89962. return 0;
  89963. endif
  89964. .
  89965. #12:2
  89966. masked = ($login.who_masks_wizards ? $wiz_utils:connected_wizards() | {});
  89967. if (caller != #0)
  89968. return E_PERM;
  89969. elseif (!args)
  89970. $code_utils:show_who_listing($set_utils:difference(connected_players(), masked)) || this:notify("No one logged in.");
  89971. else
  89972. plyrs = listdelete($command_utils:player_match_result($string_utils:match_player(args), args), 1);
  89973. $code_utils:show_who_listing(plyrs, $set_utils:intersection(plyrs, masked));
  89974. endif
  89975. return 0;
  89976. .
  89977. #12:3
  89978. you_lose_msg = "Either that player does not exist, or has a different password.";
  89979. if (caller != #0)
  89980. return E_PERM;
  89981. "...caller isn't :do_login_command...";
  89982. elseif (!(length(args) in {1, 2}))
  89983. notify(player, tostr("Usage:  ", verb, " <existing-player-name> <password>"));
  89984. elseif (!valid(candidate = (orig_candidate = this:_match_player(name = strsub(args[1], " ", "_")))))
  89985. notify(player, you_lose_msg);
  89986. "...unknown player...";
  89987. elseif ((typeof(candidate.password) == STR) && ((length(candidate.password) < 2) || (crypt({@args, ""}[2], candidate.password[1..2]) != candidate.password)))
  89988. notify(player, you_lose_msg);
  89989. "...bad password...";
  89990. server_log(tostr("FAILED CONNECT: ", args[1], " (", candidate, ") on ", connection_name(player), ($string_utils:connection_hostname(connection_name(player)) in candidate.all_connect_places) ? "" | "******"));
  89991. elseif ((parent(candidate) == $guest) && (!valid(candidate = candidate:defer())))
  89992. notify(player, (candidate == #-2) ? "Sorry, guest characters are not allowed from your site." | "Sorry, all of our guest characters are in use right now.");
  89993. else
  89994. if (candidate != orig_candidate)
  89995. notify(player, tostr("Okay,... ", name, " is in use.  Logging you in as `", candidate.name, "'"));
  89996. endif
  89997. this:record_connection(candidate);
  89998. return candidate;
  89999. endif
  90000. return 0;
  90001. .
  90002. #12:4
  90003. if (caller != #0)
  90004. return E_PERM;
  90005. "... caller isn't :do_login_command()...";
  90006. elseif (!this:player_creation_enabled(player))
  90007. notify(player, this:registration_string());
  90008. "... we've disabled player creation ...";
  90009. elseif (length(args) != 2)
  90010. notify(player, tostr("Usage:  ", verb, " <new-player-name> <new-password>"));
  90011. elseif ($player_db.frozen)
  90012. notify(player, "Sorry, can't create any new players right now.  Try again in a few minutes.");
  90013. elseif ((!(name = args[1])) || (name == "<>"))
  90014. notify(player, "You can't have a blank name!");
  90015. if (name)
  90016. notify(player, "Also, don't use angle brackets (<>).");
  90017. endif
  90018. elseif ((name[1] == "<") && (name[length(name)] == ">"))
  90019. notify(player, "Try that again but without the angle brackets, e.g.,");
  90020. notify(player, tostr(" ", verb, " ", name[2..length(name) - 1], " ", strsub(strsub(args[2], "<", ""), ">", "")));
  90021. notify(player, "This goes for other commands as well.");
  90022. elseif (index(name, " "))
  90023. notify(player, "Sorry, no spaces are allowed in player names.  Use dashes or underscores.");
  90024. "... lots of routines depend on there not being spaces in player names...";
  90025. elseif ((!$player_db:available(name)) || (this:_match_player(name) != $failed_match))
  90026. notify(player, "Sorry, that name is not available.  Please choose another.");
  90027. "... note the :_match_player call is not strictly necessary...";
  90028. "... it is merely there to handle the case that $player_db gets corrupted.";
  90029. elseif (!(password = args[2]))
  90030. notify(player, "You must set a password for your player.");
  90031. else
  90032. new = create($player_class, $nothing);
  90033. set_player_flag(new, 1);
  90034. new.name = name;
  90035. new.aliases = {name};
  90036. new.programmer = $player_class.programmer;
  90037. new.password = crypt(password);
  90038. new.last_connect_time = $maxint;
  90039. "Last disconnect time is creation time, until they login.";
  90040. new.last_disconnect_time = time();
  90041. "make sure the owership quota isn't clear!";
  90042. new.ownership_quota = new.ownership_quota;
  90043. this:record_connection(new);
  90044. move(new, $player_start);
  90045. $player_db:insert(name, new);
  90046. return new;
  90047. endif
  90048. return 0;
  90049. .
  90050. #12:5
  90051. if (caller != #0)
  90052. return E_PERM;
  90053. else
  90054. boot_player(player);
  90055. return 0;
  90056. endif
  90057. .
  90058. #12:6
  90059. if (caller != #0)
  90060. return E_PERM;
  90061. else
  90062. notify(player, tostr("The server has been up for ", $time_utils:english_time(time() - $last_restart_time), "."));
  90063. return 0;
  90064. endif
  90065. .
  90066. #12:7
  90067. if (caller != #0)
  90068. return E_PERM;
  90069. else
  90070. notify(player, tostr("The MOO is currently running version ", server_version(), " of the LambdaMOO server code."));
  90071. return 0;
  90072. endif
  90073. .
  90074. #12:8
  90075. ":parse_command(@args) => {verb, args}";
  90076. "Given the args from #0:do_login_command,";
  90077. "  returns the actual $login verb to call and the args to use.";
  90078. "Commands available to not-logged-in users should be located on this object and given the verb_args \"any none any\"";
  90079. if (caller != #0)
  90080. return E_PERM;
  90081. endif
  90082. if (!args)
  90083. return {this.blank_command, @args};
  90084. elseif ((verb = args[1]) && ((verb_args(this, verb) == {"any", "none", "any"}) && index(verb_info(this, verb)[2], "x")))
  90085. return args;
  90086. else
  90087. return {this.bogus_command, @args};
  90088. endif
  90089. .
  90090. #12:9
  90091. when = ($shutdown_time - time());
  90092. if (when >= 0)
  90093. line = "***************************************************************************";
  90094. notify(player, "");
  90095. notify(player, "");
  90096. notify(player, line);
  90097. notify(player, line);
  90098. notify(player, "****");
  90099. notify(player, ("****  WARNING:  The server will be going down in about " + $string_utils:from_seconds(when)) + ".");
  90100. for piece in ($generic_editor:fill_string($shutdown_message, 60))
  90101. notify(player, "****            " + piece);
  90102. endfor
  90103. notify(player, "****");
  90104. notify(player, line);
  90105. notify(player, line);
  90106. notify(player, "");
  90107. notify(player, "");
  90108. endif
  90109. .
  90110. #12:10
  90111. if ($player_db.frozen)
  90112. line = "***************************************************************************";
  90113. notify(player, "");
  90114. notify(player, line);
  90115. notify(player, "***");
  90116. for piece in ($generic_editor:fill_string("The character-name matcher is currently being reloaded.  This means your character name might not be recognized even though it still exists.  Don't panic.  You can either wait for the reload to finish or you can connect using your object number if you remember it (e.g., `connect #1234 yourpassword').", 65))
  90117. notify(player, "***       " + piece);
  90118. endfor
  90119. if (this:player_creation_enabled(player))
  90120. notify(player, "***       This also means that character creation is disabled.");
  90121. endif
  90122. notify(player, "***");
  90123. notify(player, line);
  90124. notify(player, "");
  90125. endif
  90126. .
  90127. #12:11
  90128. ":_match_player(name)";
  90129. "This is the matching routine used by @connect.";
  90130. "returns either a valid player corresponding to name or $failed_match.";
  90131. name = args[1];
  90132. if (valid(candidate = $string_utils:literal_object(name)) && is_player(candidate))
  90133. return candidate;
  90134. endif
  90135. ".....uncomment this to trust $player_db and have `connect' recognize aliases";
  90136. if (valid(candidate = $player_db:find_exact(name)) && is_player(candidate))
  90137. return candidate;
  90138. endif
  90139. ".....uncomment this if $player_db gets hosed and you want by-name login";
  90140. ". for candidate in (players())";
  90141. ".   if (candidate.name == name)";
  90142. ".     return candidate; ";
  90143. ".   endif ";
  90144. ". endfor ";
  90145. ".....";
  90146. return $failed_match;
  90147. .
  90148. #12:12
  90149. set_task_perms(caller_perms());
  90150. notify(player, args[1]);
  90151. .
  90152. #12:13
  90153. "keeps bad things from happening if someone brings this object into a room and talks to it.";
  90154. return 0;
  90155. .
  90156. #12:14
  90157. "Accepts a player object.  If player creation is enabled for that player object, then return true.  Otherwise, return false.";
  90158. "Default implementation checks the player's connecting host via $login:blacklisted to decide.";
  90159. if (caller_perms().wizard)
  90160. return this.create_enabled && (!this:blacklisted($string_utils:connection_hostname(connection_name(args[1]))));
  90161. else
  90162. return E_PERM;
  90163. endif
  90164. .
  90165. #12:15
  90166. return $string_utils:subst(this.(verb), {{"%e", this.registration_address}, {"%%", "%"}});
  90167. .
  90168. #12:16
  90169. if (caller_perms().wizard)
  90170. pass();
  90171. this.bogus_command = "?";
  90172. this.blank_command = "help";
  90173. this.create_enabled = 1;
  90174. this.registration_address = "";
  90175. this.registration_string = "Character creation is disabled.";
  90176. this.newt_registration_string = "Your character is temporarily hosed.";
  90177. this.welcome_message = {"Welcome to the LambdaCore database.", "", "Type 'connect wizard' to log in.", "", "You will probably want to change this text, which is stored in $login.welcome_message."};
  90178. this.redlist = (this.blacklist = (this.graylist = (this.spooflist = {{}, {}})));
  90179. this.ignored = {};
  90180. this.who_masks_wizards = 0;
  90181. if ("monitor" in properties(this))
  90182. delete_property(this, "monitor");
  90183. endif
  90184. if ("monitor" in verbs(this))
  90185. delete_verb(this, "monitor");
  90186. endif
  90187. if ("special_action" in verbs(this))
  90188. set_verb_code(this, "special_action", {});
  90189. endif
  90190. endif
  90191. .
  90192. #12:17
  90193. .
  90194. #12:18
  90195. ":blacklisted(hostname) => is hostname on the .blacklist";
  90196. ":graylisted(hostname)  => is hostname on the .graylist";
  90197. ":redlisted(hostname)   => is hostname on the .redlist";
  90198. sitelist = this.(this:listname(verb));
  90199. if (!caller_perms().wizard)
  90200. return E_PERM;
  90201. elseif (((hostname = args[1]) in sitelist[1]) || (hostname in sitelist[2]))
  90202. return 1;
  90203. elseif ($site_db:domain_literal(hostname))
  90204. for lit in (sitelist[1])
  90205. if ((index(hostname, lit) == 1) && ((hostname + ".")[length(lit) + 1] == "."))
  90206. return 1;
  90207. endif
  90208. endfor
  90209. else
  90210. for dom in (sitelist[2])
  90211. if (index(dom, "*"))
  90212. "...we have a wildcard; let :match_string deal with it...";
  90213. if ($string_utils:match_string(hostname, dom))
  90214. return 1;
  90215. endif
  90216. else
  90217. "...tail of hostname ...";
  90218. if ((r = rindex(hostname, dom)) && ((("." + hostname)[r] == ".") && (((r - 1) + length(dom)) == length(hostname))))
  90219. return 1;
  90220. endif
  90221. endif
  90222. endfor
  90223. endif
  90224. return 0;
  90225. .
  90226. #12:19
  90227. if (!caller_perms().wizard)
  90228. return E_PERM;
  90229. endif
  90230. where = args[1];
  90231. lname = this:listname(verb);
  90232. which = (1 + (!$site_db:domain_literal(where)));
  90233. this.(lname)[which] = setadd(this.(lname)[which], where);
  90234. return 1;
  90235. .
  90236. #12:20
  90237. if (!caller_perms().wizard)
  90238. return E_PERM;
  90239. endif
  90240. where = args[1];
  90241. lname = this:listname(verb);
  90242. which = (1 + (!$site_db:domain_literal(where)));
  90243. if (where in this.(lname)[which])
  90244. this.(lname)[which] = setremove(this.(lname)[which], where);
  90245. return 1;
  90246. else
  90247. return E_INVARG;
  90248. endif
  90249. .
  90250. #12:21
  90251. return {"???", "blacklist", "graylist", "redlist", "spooflist"}[1 + index("bgrs", (args[1] || "?")[1])];
  90252. .
  90253. #12:22
  90254. ":record_connection(plyr) update plyr's connection information";
  90255. "to reflect impending login.";
  90256. if (!caller_perms().wizard)
  90257. return E_PERM;
  90258. else
  90259. plyr = args[1];
  90260. plyr.first_connect_time = min(time(), plyr.first_connect_time);
  90261. plyr.previous_connection = {plyr.last_connect_time, $string_utils:connection_hostname(plyr.last_connect_place)};
  90262. plyr.last_connect_time = time();
  90263. plyr.last_connect_place = (cn = connection_name(player));
  90264. chost = $string_utils:connection_hostname(cn);
  90265. acp = setremove(plyr.all_connect_places, chost);
  90266. plyr.all_connect_places = {chost, @acp[1..min(length(acp), 15)]};
  90267. if (parent(plyr) != $guest)
  90268. $site_db:add(plyr, chost);
  90269. endif
  90270. endif
  90271. .
  90272. #12:23
  90273. if (caller != #0)
  90274. return E_PERM;
  90275. elseif (!args)
  90276. $code_utils:show_who_listing(connected_players()) || this:notify("No one logged in.");
  90277. else
  90278. plyrs = listdelete($command_utils:player_match_result($string_utils:match_player(args), args), 1);
  90279. $code_utils:show_who_listing(plyrs);
  90280. endif
  90281. return 0;
  90282. .
  90283. #12:24
  90284. ":spooflisted(hostname) => is hostname on the .spooflist";
  90285. "The return value, if true, is actually a domain (or site) name.";
  90286. sitelist = this.(this:listname(verb));
  90287. if (!caller_perms().wizard)
  90288. return E_PERM;
  90289. elseif (((hostname = args[1]) in sitelist[1]) || (hostname in sitelist[2]))
  90290. return hostname;
  90291. elseif ($site_db:domain_literal(hostname))
  90292. for lit in (sitelist[1])
  90293. if ((index(hostname, lit) == 1) && ((hostname + ".")[length(lit) + 1] == "."))
  90294. return lit;
  90295. endif
  90296. endfor
  90297. else
  90298. for dom in (sitelist[2])
  90299. if (index(dom, "*"))
  90300. "...we have a wildcard; let :match_string deal with it...";
  90301. if ($string_utils:match_string(hostname, dom))
  90302. return dom;
  90303. endif
  90304. else
  90305. "...tail of hostname ...";
  90306. if ((r = rindex(hostname, dom)) && ((("." + hostname)[r] == ".") && (((r - 1) + length(dom)) == length(hostname))))
  90307. return dom;
  90308. endif
  90309. endif
  90310. endfor
  90311. endif
  90312. return 0;
  90313. .
  90314. #12:25
  90315. if (caller != #0)
  90316. return E_PERM;
  90317. else
  90318. candidate = this:_match_player($network:parse_address(connection_name(player))[1]);
  90319. if (!valid(candidate))
  90320. msg = this.welcome_message;
  90321. for line in ((typeof(msg) == LIST) ? msg | {msg})
  90322. if (typeof(line) == STR)
  90323. notify(player, line);
  90324. endif
  90325. endfor
  90326. this:check_player_db();
  90327. this:check_for_shutdown();
  90328. return 0;
  90329. else
  90330. this:record_connection(candidate);
  90331. return candidate;
  90332. endif
  90333. endif
  90334. .
  90335. #13:0
  90336. "{last_huh}  @<msg_name> <object> is [<text>]";
  90337. "If <text> is given calls <object>:set_message(<msg_name>,<text>),";
  90338. "otherwise prints the value of the specified message property";
  90339. set_task_perms(caller_perms());
  90340. nargs = length(args);
  90341. pos = ("is" in args);
  90342. if (pos == 1)
  90343. player:notify(tostr("Usage:  ", verb, " <object> is <message>"));
  90344. return;
  90345. endif
  90346. dobjstr = $string_utils:from_list(args[1..pos - 1], " ");
  90347. message = $string_utils:from_list(args[pos + 1..nargs], " ");
  90348. msg_name = verb[2..length(verb)];
  90349. dobj = player:my_match_object(dobjstr);
  90350. if ($command_utils:object_match_failed(dobj, dobjstr))
  90351. "... oh well ...";
  90352. elseif (pos == nargs)
  90353. if (E_PROPNF == (get = dobj.(msg_name + "_msg")))
  90354. player:notify(tostr(dobj.name, " (", dobj, ") has no \"", msg_name, "\" message."));
  90355. elseif (typeof(get) == ERR)
  90356. player:notify(tostr(get));
  90357. elseif (!get)
  90358. player:notify("Message is not set.");
  90359. else
  90360. player:notify(tostr("The \"", msg_name, "\" message of ", dobj.name, " (", dobj, "):"));
  90361. player:notify(tostr(get));
  90362. endif
  90363. else
  90364. set = dobj:set_message(msg_name, message);
  90365. if (set)
  90366. if (typeof(set) == STR)
  90367. player:notify(set);
  90368. else
  90369. player:notify(tostr("You set the \"", msg_name, "\" message of ", dobj.name, " (", dobj, ")."));
  90370. endif
  90371. elseif (set == E_PROPNF)
  90372. player:notify(tostr(dobj.name, " (", dobj, ") has no \"", msg_name, "\" message to set."));
  90373. elseif (typeof(set) == ERR)
  90374. player:notify(tostr(set));
  90375. else
  90376. player:notify(tostr("You clear the \"", msg_name, "\" message of ", dobj.name, " (", dobj, ")."));
  90377. endif
  90378. endif
  90379. .
  90380. #13:1
  90381. "{last_huh}  give any to any";
  90382. "a give \"verb\" that works for non-$things.";
  90383. set_task_perms(caller_perms());
  90384. if (((verb == "give") && (dobjstr == "up")) && (!prepstr))
  90385. player:tell("Try this instead: @quit");
  90386. elseif (dobj == $nothing)
  90387. player:tell("What do you want to give?");
  90388. elseif (iobj == $nothing)
  90389. player:tell("To whom/what do you want to give it?");
  90390. elseif ($command_utils:object_match_failed(dobj, dobjstr) || $command_utils:object_match_failed(iobj, iobjstr))
  90391. "...lose...";
  90392. elseif (dobj.location != player)
  90393. player:tell("You don't have that!");
  90394. elseif (iobj.location != player.location)
  90395. player:tell("I don't see ", iobj.name, " here.");
  90396. else
  90397. dobj:moveto(iobj);
  90398. if (dobj.location == iobj)
  90399. player:tell("You give ", dobj:title(), " to ", iobj.name, ".");
  90400. iobj:tell(player.name, " gives you ", dobj:title(), ".");
  90401. else
  90402. player:tell("Either that doesn't want to be given away or ", iobj.name, " doesn't want it.");
  90403. endif
  90404. endif
  90405. .
  90406. #13:2
  90407. "{last_huh}  get/take any";
  90408. "a take \"verb\" that works for non-$things.";
  90409. set_task_perms(caller_perms());
  90410. if (dobj == $nothing)
  90411. player:tell(verb, " what?");
  90412. elseif ($command_utils:object_match_failed(dobj, dobjstr))
  90413. "...lose...";
  90414. elseif (dobj.location == player)
  90415. player:tell("You already have that!");
  90416. elseif (dobj.location != player.location)
  90417. player:tell("I don't see that here.");
  90418. else
  90419. dobj:moveto(player);
  90420. if (dobj.location == player)
  90421. player:tell("Taken.");
  90422. player.location:announce(player.name, " takes ", dobj.name, ".");
  90423. else
  90424. player:tell("You can't pick that up.");
  90425. endif
  90426. endif
  90427. .
  90428. #13:3
  90429. "{last_huh}  drop/throw any";
  90430. "a drop \"verb\" that works for non-$things.";
  90431. set_task_perms(caller_perms());
  90432. if (dobj == $nothing)
  90433. player:tell(verb, " what?");
  90434. elseif ($command_utils:object_match_failed(dobj, dobjstr))
  90435. "...lose...";
  90436. elseif (dobj.location != player)
  90437. player:tell("You don't have that.");
  90438. elseif (!player.location:accept(dobj))
  90439. player:tell("You can't drop that here.");
  90440. else
  90441. dobj:moveto(player.location);
  90442. if (dobj.location == player.location)
  90443. player:tell_lines((verb[1] == "d") ? "Dropped." | "Thrown.");
  90444. player.location:announce(player.name, (verb[1] == "d") ? " dropped " | " threw away ", dobj.name, ".");
  90445. else
  90446. player:tell_lines("You can't seem to drop that here.");
  90447. endif
  90448. endif
  90449. .
  90450. #14:0
  90451. ":enter(who,islogin,time,site)";
  90452. "adds an entry to the connection log for a given guest (caller).";
  90453. if ($object_utils:isa(caller, $guest))
  90454. $guest_log.connections = {{caller, @args}, @$guest_log.connections[1..min(99, length($guest_log.connections))]};
  90455. else
  90456. return E_PERM;
  90457. endif
  90458. .
  90459. #14:1
  90460. set_task_perms(caller_perms());
  90461. howmany = min({@args, 0}[1] || $maxint, length($guest_log.connections));
  90462. if (!caller_perms().wizard)
  90463. player:notify("Sorry.");
  90464. else
  90465. current = {};
  90466. listing = {};
  90467. last = 0;
  90468. for c in ($guest_log.connections[1..howmany])
  90469. if (c[2])
  90470. "...login...";
  90471. if (a = $list_utils:assoc(c[1], current))
  90472. listing[a[2]][3] = c[3];
  90473. current = setremove(current, a);
  90474. else
  90475. listing = {@listing, {c[1], c[4], c[3], -idle_seconds(c[1])}};
  90476. last = (last + 1);
  90477. endif
  90478. else
  90479. "...logout...";
  90480. listing = {@listing, {c[1], c[4], 0, c[3]}};
  90481. last = (last + 1);
  90482. if (i = $list_utils:iassoc(c[1], current))
  90483. current[i][2] = last;
  90484. else
  90485. current = {@current, {c[1], last}};
  90486. endif
  90487. endif
  90488. endfor
  90489. su = $string_utils;
  90490. player:notify(su:left(su:left(su:left("Guest", 20) + "Connected", 36) + "Idle/Disconn.", 52) + "From");
  90491. player:notify(su:left(su:left(su:left("-----", 20) + "---------", 36) + "-------------", 52) + "----");
  90492. for l in (listing)
  90493. on = (l[3] ? (ct = ctime(l[3]))[1..3] + ct[9..19] | "earlier");
  90494. off = ((l[4] > 0) ? (ct = ctime(l[4]))[1..3] + ct[9..19] | ("  " + $string_utils:from_seconds(-l[4])));
  90495. player:notify(su:left(su:left(su:right(tostr(strsub(l[1].name, "uest", "."), " (", l[1], ")  "), 20) + on, 36) + off, 52) + l[2]);
  90496. endfor
  90497. endif
  90498. .
  90499. #14:2
  90500. if (caller_perms().wizard)
  90501. pass(@args);
  90502. this.connections = {};
  90503. endif
  90504. .
  90505. #15:0
  90506. ":length(tree) => number of leaves in tree.";
  90507. return args[1] ? args[1][2] | 0;
  90508. .
  90509. #15:1
  90510. ":find_nth(tree,n) => nth leaf of tree.  Assumes n in [1..tree[2]]";
  90511. return this:_find_nth(caller, @args);
  90512. .
  90513. #15:2
  90514. ":_find_ord(tree,n,comp) ";
  90515. " => index of rightmost leaf for which :(comp)(n,:_ord(leaf)) is false.";
  90516. "returns 0 if true for all leaves.";
  90517. return args[1] ? this:_find_ord(caller, @args) | 0;
  90518. .
  90519. #15:3
  90520. ":set_nth(tree,n,value) => tree";
  90521. "modifies tree so that nth leaf == value";
  90522. if (((n = args[2]) < 1) || ((!(tree = args[1])) || (tree[2] < n)))
  90523. return E_RANGE;
  90524. else
  90525. this:_set_nth(caller, @args);
  90526. return (n != 1) ? tree | listset(tree, caller:_ord(args[3]), 3);
  90527. endif
  90528. .
  90529. #15:4
  90530. ":kill(tree[,leafverb]) deletes tree and _kills all of the nodes that it uses.";
  90531. "if leafverb is given, caller:leafverb is called on all leaves in tree.";
  90532. if (tree = args[1])
  90533. lverb = {@args, ""}[2];
  90534. this:_skill(caller, (typeof(tree) == LIST) ? tree[1] | tree, lverb);
  90535. endif
  90536. "... otherwise nothing to do...";
  90537. .
  90538. #15:5
  90539. ":insert_after(tree,subtree,n)";
  90540. ":insert_before(tree,subtree,n)";
  90541. "  inserts subtree after (before) the nth leaf of tree,";
  90542. "  returning the resulting tree.";
  90543. subtree = args[2];
  90544. if (tree = args[1])
  90545. if (subtree)
  90546. where = (args[3] - (verb == "insert_before"));
  90547. if (where <= 0)
  90548. return this:_merge(caller, subtree, tree);
  90549. elseif (where >= tree[2])
  90550. return this:_merge(caller, tree, subtree);
  90551. else
  90552. s = this:_split(caller, caller:_get(tree[1])[1], where, tree);
  90553. return this:_merge(caller, this:_merge(caller, s[1], subtree), s[2]);
  90554. endif
  90555. else
  90556. return tree;
  90557. endif
  90558. else
  90559. return subtree;
  90560. endif
  90561. .
  90562. #15:6
  90563. ":extract_range(tree,first,last) => {newtree,extraction}";
  90564. return this:_extract(caller, @args);
  90565. .
  90566. #15:7
  90567. ":delete_range(tree,first,last[,leafkill]) => newtree";
  90568. extract = this:_extract(caller, @args);
  90569. if (die = extract[2])
  90570. this:_skill(caller, die[1], {@args, ""}[4]);
  90571. endif
  90572. return extract[1];
  90573. .
  90574. #15:8
  90575. ":keep_range(tree,first,last[,leafkill]) => range";
  90576. extract = this:_extract(caller, @args);
  90577. if (die = extract[1])
  90578. this:_skill(caller, die[1], {@args, ""}[4]);
  90579. endif
  90580. return extract[2];
  90581. .
  90582. #15:9
  90583. ":insert_last(tree,insert) => newtree";
  90584. "insert a new leaf to be inserted at the righthand end of the tree";
  90585. tree = args[1];
  90586. insert = args[2];
  90587. if (!tree)
  90588. return {caller:_make(0, {insert}), 1, caller:_ord(insert)};
  90589. endif
  90590. hgt = caller:_get(tree[1]);
  90591. rspine = {{tree, plen = length(kids = hgt[2])}};
  90592. for i in [1..hgt[1]]
  90593. parent = kids[plen];
  90594. kids = caller:_get(parent[1])[2];
  90595. plen = length(kids);
  90596. rspine = {{parent, plen}, @rspine};
  90597. endfor
  90598. iord = caller:_ord(insert);
  90599. for h in [1..length(rspine)]
  90600. "... tree is the plen'th (rightmost) child of parent...";
  90601. if (rspine[h][2] < this.maxfanout)
  90602. parent = rspine[h][1];
  90603. hgp = caller:_get(parent[1]);
  90604. caller:_put(parent[1], @listset(hgp, {@hgp[2], insert}, 2));
  90605. for p in (rspine[h + 1..length(rspine)])
  90606. rkid = listset(parent, parent[2] + 1, 2);
  90607. parent = p[1];
  90608. hgp = caller:_get(parent[1]);
  90609. caller:_put(parent[1], @listset(hgp, listset(hgp[2], rkid, p[2]), 2));
  90610. endfor
  90611. return listset(tree, tree[2] + 1, 2);
  90612. endif
  90613. insert = {caller:_make(h - 1, {insert}), 1, iord};
  90614. endfor
  90615. return {caller:_make(length(rspine), {tree, insert}), tree[2] + 1, tree[3]};
  90616. .
  90617. #15:10
  90618. ":start(tree,first,last) => {list of leaf nodes, @handle}";
  90619. "handle is of the form {{node,next,size}...}";
  90620. if (tree = args[1])
  90621. before = max(0, args[2] - 1);
  90622. howmany = (min(args[3], tree[2]) - before);
  90623. if (howmany <= 0)
  90624. return {};
  90625. else
  90626. spine = {};
  90627. for h in [1..caller:_get(tree[1])[1]]
  90628. ik = this:_listfind_nth(kids = caller:_get(tree[1])[2], before);
  90629. newh = (kids[ik[1]][2] - ik[2]);
  90630. if (newh < howmany)
  90631. spine = {{tree[1], ik[1] + 1, howmany - newh}, @spine};
  90632. howmany = newh;
  90633. endif
  90634. tree = kids[ik[1]];
  90635. before = ik[2];
  90636. endfor
  90637. return {caller:_get(tree[1])[2][before + 1..before + howmany], @spine};
  90638. endif
  90639. else
  90640. return {};
  90641. endif
  90642. .
  90643. #15:11
  90644. ":next(@handle) => {list of more leaf nodes, @newhandle}";
  90645. if (args)
  90646. spine = listdelete(args, 1);
  90647. node = args[1][1];
  90648. n = args[1][2];
  90649. size = args[1][3];
  90650. for h in [1..caller:_get(node)[1]]
  90651. nnode = caller:_get(node)[2][n];
  90652. if (size > nnode[2])
  90653. spine = {{node, n + 1, size - nnode[2]}, @spine};
  90654. size = nnode[2];
  90655. endif
  90656. n = 1;
  90657. node = nnode[1];
  90658. endfor
  90659. return {caller:_get(node)[2][n..size], @spine};
  90660. else
  90661. return {};
  90662. endif
  90663. .
  90664. #15:12
  90665. ":_find_nth(home,tree,n) => nth leaf of tree.";
  90666. "...Assumes n in [1..tree[2]]";
  90667. if (caller != this)
  90668. return E_PERM;
  90669. endif
  90670. home = args[1];
  90671. tree = args[2];
  90672. n = args[3];
  90673. if ((p = home:_get(tree[1]))[1])
  90674. for k in (p[2])
  90675. if (n > k[2])
  90676. n = (n - k[2]);
  90677. else
  90678. return this:_find_nth(home, k, n);
  90679. endif
  90680. endfor
  90681. return E_RANGE;
  90682. else
  90683. return p[2][n];
  90684. endif
  90685. .
  90686. #15:13
  90687. ":_find_ord(home,tree,n,comp) ";
  90688. " => index of rightmost leaf for which :(comp)(n,:_ord(leaf)) is false.";
  90689. "returns 0 if true for all leaves.";
  90690. if (caller != this)
  90691. return E_PERM;
  90692. endif
  90693. home = args[1];
  90694. tree = args[2];
  90695. n = args[3];
  90696. comp = args[4];
  90697. if ((p = home:_get(tree[1]))[1])
  90698. sz = tree[2];
  90699. for i in [-length(p[2])..-1]
  90700. k = p[2][-i];
  90701. sz = (sz - k[2]);
  90702. if (!home:(comp)(n, k[3]))
  90703. return sz + this:_find_ord(home, k, n, comp);
  90704. endif
  90705. endfor
  90706. return 0;
  90707. else
  90708. for i in [1..r = length(p[2])]
  90709. if (home:(comp)(n, home:_ord(p[2][i])))
  90710. return i - 1;
  90711. endif
  90712. endfor
  90713. return r;
  90714. endif
  90715. .
  90716. #15:14
  90717. ":_set_nth(home,tree,n,value) => tree[n] = value";
  90718. "Assumes n in [1..tree[2]]";
  90719. if (caller != this)
  90720. return E_PERM;
  90721. endif
  90722. home = args[1];
  90723. tree = args[2];
  90724. n = args[3];
  90725. value = args[4];
  90726. if ((p = home:_get(tree[1]))[1])
  90727. ik = this:_listfind_nth(p[2], n - 1);
  90728. this:_set_nth(home, p[2][ik[1]], ik[2] + 1, value);
  90729. if (!ik[2])
  90730. p[2][ik[1]][3] = home:_ord(value);
  90731. home:_put(tree[1], @p);
  90732. endif
  90733. else
  90734. p[2][n] = value;
  90735. home:_put(tree[1], @p);
  90736. endif
  90737. .
  90738. #15:15
  90739. ":_skill(home,node,leafverb)";
  90740. "home:_kill's node and all descendants, home:(leafverb)'s all leaves";
  90741. if (caller != this)
  90742. return E_PERM;
  90743. endif
  90744. home = args[1];
  90745. hgn = (home:_get(node = args[2]) || {0, {}});
  90746. lverb = args[3];
  90747. if (hgn[1])
  90748. for kid in (hgn[2])
  90749. this:_skill(home, kid[1], lverb);
  90750. endfor
  90751. elseif (lverb)
  90752. for kid in (hgn[2])
  90753. home:(lverb)(kid);
  90754. endfor
  90755. endif
  90756. home:_kill(node);
  90757. .
  90758. #15:16
  90759. ":_extract(home,tree,first,last) => {newtree,extraction}";
  90760. if (caller != this)
  90761. return E_PERM;
  90762. endif
  90763. home = args[1];
  90764. if (!(tree = args[2]))
  90765. return {{}, {}};
  90766. endif
  90767. before = max(0, args[3] - 1);
  90768. end = min(tree[2], args[4]);
  90769. if ((end <= 0) || (before >= end))
  90770. return {tree, {}};
  90771. endif
  90772. height = home:_get(tree[1])[1];
  90773. if (end < tree[2])
  90774. r = this:_split(home, height, end, tree);
  90775. if (before)
  90776. l = this:_split(home, height, before, r[1]);
  90777. extract = l[2];
  90778. newtree = this:_merge(home, l[1], r[2]);
  90779. else
  90780. extract = r[1];
  90781. newtree = r[2];
  90782. endif
  90783. elseif (before)
  90784. l = this:_split(home, height, before, tree);
  90785. extract = l[2];
  90786. newtree = l[1];
  90787. else
  90788. return {{}, tree};
  90789. endif
  90790. return {this:_scrunch(home, newtree), this:_scrunch(home, extract)};
  90791. .
  90792. #15:17
  90793. "_merge(home,ltree,rtree) => newtree";
  90794. "assumes ltree and rtree to be nonempty.";
  90795. if (caller != this)
  90796. return E_PERM;
  90797. endif
  90798. home = args[1];
  90799. lnode = args[2];
  90800. rnode = args[3];
  90801. lh = home:_get(lnode[1])[1];
  90802. rh = home:_get(rnode[1])[1];
  90803. if (lh > rh)
  90804. return this:_rmerge(home, lnode, rnode);
  90805. endif
  90806. for h in [lh + 1..rh]
  90807. lnode[1] = home:_make(h, {lnode});
  90808. endfor
  90809. m = this:_smerge(home, rh, lnode, rnode);
  90810. return (length(m) <= 1) ? m[1] | {home:_make(rh + 1, m), m[1][2] + m[2][2], m[1][3]};
  90811. .
  90812. #15:18
  90813. "_smerge(home, height, ltree, rtree) =>{ltree[,rtree]}";
  90814. "assumes ltree and rtree are at the given height.";
  90815. "merges the trees if the combined number of children is <= maxfanout";
  90816. "otherwise returns two trees where ltree is guaranteed minfanout children and rtree is guaranteed the minimum of minfanout and however many children it started with.";
  90817. if (caller != this)
  90818. return E_PERM;
  90819. endif
  90820. home = args[1];
  90821. height = args[2];
  90822. ltree = args[3];
  90823. rtree = args[4];
  90824. llen = length(lkids = home:_get(ltree[1])[2]);
  90825. rlen = length(rkids = home:_get(rtree[1])[2]);
  90826. if (height)
  90827. m = this:_smerge(home, height - 1, lkids[llen], rkids[1]);
  90828. mlen = length(mkids = {@listdelete(lkids, llen), @m, @listdelete(rkids, 1)});
  90829. if (mlen <= this.maxfanout)
  90830. home:_put(ltree[1], height, mkids);
  90831. home:_kill(rtree[1]);
  90832. ltree[2] = (ltree[2] + rtree[2]);
  90833. return {ltree};
  90834. else
  90835. S = max(llen - 1, (mlen + 1) / 2);
  90836. home:_put(ltree[1], height, mkids[1..S]);
  90837. home:_put(rtree[1], height, mkids[S + 1..length(mkids)]);
  90838. xfer = (-lkids[llen][2]);
  90839. for k in (mkids[llen..S])
  90840. xfer = (xfer + k[2]);
  90841. endfor
  90842. ltree[2] = (ltree[2] + xfer);
  90843. rtree[2] = (rtree[2] - xfer);
  90844. rtree[3] = mkids[S + 1][3];
  90845. return {ltree, rtree};
  90846. endif
  90847. elseif ((llen * 2) >= this.maxfanout)
  90848. return {ltree, rtree};
  90849. elseif (this.maxfanout < (llen + rlen))
  90850. T = (((rlen - llen) + 1) / 2);
  90851. home:_put(ltree[1], 0, {@lkids, @rkids[1..T]});
  90852. home:_put(rtree[1], 0, rkids[T + 1..rlen]);
  90853. ltree[2] = (ltree[2] + T);
  90854. rtree[2] = (rtree[2] - T);
  90855. rtree[3] = home:_ord(rkids[T + 1]);
  90856. return {ltree, rtree};
  90857. else
  90858. home:_put(ltree[1], 0, {@lkids, @rkids});
  90859. home:_kill(rtree[1]);
  90860. ltree[2] = (ltree[2] + rtree[2]);
  90861. return {ltree};
  90862. endif
  90863. .
  90864. #15:19
  90865. "_split(home, height,lmax,ltree[,@rtrees]}) => {ltree,[mtree,]@rtrees}";
  90866. "ltree is split after the lmax'th leaf, the righthand portion grafted onto the leftmost of the rtrees, if possible.  Otherwise we create a new tree mtree, stealing from rtrees[1] if necessary.";
  90867. "Assumes 1<=lmax<ltree[2]";
  90868. if (caller != this)
  90869. return E_PERM;
  90870. endif
  90871. home = args[1];
  90872. height = args[2];
  90873. lmax = args[3];
  90874. ltree = args[4];
  90875. rtrees = args[5..length(args)];
  90876. llen = length(lkids = home:_get(ltree[1])[2]);
  90877. rlen = length(rkids = (rtrees ? home:_get(rtrees[1][1])[2] | {}));
  90878. if (height)
  90879. ik = this:_listfind_nth(lkids, lmax);
  90880. if (ik[2])
  90881. llast = ik[1];
  90882. m = this:_split(home, height - 1, ik[2], lkids[llast], @lkids[llast + 1..llen], @rkids);
  90883. lkids[llast] = m[1];
  90884. mkids = listdelete(m, 1);
  90885. else
  90886. llast = (ik[1] - 1);
  90887. mkids = {@lkids[ik[1]..llen], @rkids};
  90888. endif
  90889. home:_put(ltree[1], height, lkids[1..llast]);
  90890. mlen = length(mkids);
  90891. if ((((mlen - rlen) * 2) >= this.maxfanout) || (!rtrees))
  90892. "...residue left over from splitting ltree can stand by itself...";
  90893. return {listset(ltree, lmax, 2), {home:_make(height, mkids[1..mlen - rlen]), ltree[2] - lmax, mkids[1][3]}, @rtrees};
  90894. elseif (mlen <= this.maxfanout)
  90895. "...residue left over from splitting ltree fits in rtrees[1]...";
  90896. home:_put(rtrees[1][1], height, mkids);
  90897. rtrees[1][2] = ((ltree[2] - lmax) + rtrees[1][2]);
  90898. rtrees[1][3] = mkids[1][3];
  90899. return {listset(ltree, lmax, 2), @rtrees};
  90900. else
  90901. "...need to steal from rtrees[1]...";
  90902. if (llast < llen)
  90903. msize = (ltree[2] - lmax);
  90904. R = ((mlen - rlen) + 1);
  90905. else
  90906. msize = 0;
  90907. R = 1;
  90908. endif
  90909. for k in (mkids[R..mlen / 2])
  90910. msize = (msize + k[2]);
  90911. endfor
  90912. home:_put(rtrees[1][1], height, mkids[(mlen / 2) + 1..mlen]);
  90913. rtrees[1][2] = ((rtrees[1][2] + ltree[2]) - (lmax + msize));
  90914. rtrees[1][3] = mkids[(mlen / 2) + 1][3];
  90915. return {listset(ltree, lmax, 2), {home:_make(height, mkids[1..mlen / 2]), msize, mkids[1][3]}, @rtrees};
  90916. endif
  90917. else
  90918. home:_put(ltree[1], 0, lkids[1..lmax]);
  90919. if ((((llen - lmax) * 2) >= this.maxfanout) || (!rtrees))
  90920. "...residue left over from splitting ltree can stand by itself...";
  90921. return {listset(ltree, lmax, 2), {home:_make(0, lkids[lmax + 1..llen]), llen - lmax, home:_ord(lkids[lmax + 1])}, @rtrees};
  90922. elseif ((mlen = ((rlen + llen) - lmax)) <= this.maxfanout)
  90923. "...residue left over from splitting ltree fits in rtrees[1]...";
  90924. home:_put(rtrees[1][1], 0, {@lkids[lmax + 1..llen], @rkids});
  90925. rtrees[1][2] = mlen;
  90926. rtrees[1][3] = home:_ord(lkids[lmax + 1]);
  90927. return {listset(ltree, lmax, 2), @rtrees};
  90928. else
  90929. "...need to steal from rtrees[1]...";
  90930. home:_put(rtrees[1][1], 0, rkids[(R = (((rlen - llen) + lmax) / 2)) + 1..rlen]);
  90931. rtrees[1][2] = ((mlen + 1) / 2);
  90932. rtrees[1][3] = home:_ord(rkids[R + 1]);
  90933. return {listset(ltree, lmax, 2), {home:_make(0, {@lkids[lmax + 1..llen], @rkids[1..R]}), mlen / 2, home:_ord(lkids[lmax + 1])}, @rtrees};
  90934. endif
  90935. endif
  90936. .
  90937. #15:20
  90938. ":_rmerge(home, tree, insertree) => newtree ";
  90939. "(newtree is tree with insertree appended to the right)";
  90940. "insertree is assumed to be of height < tree";
  90941. if (caller != this)
  90942. return E_PERM;
  90943. endif
  90944. home = args[1];
  90945. tree = args[2];
  90946. insert = args[3];
  90947. if (!tree)
  90948. return insert;
  90949. elseif (!insert)
  90950. return tree;
  90951. endif
  90952. iheight = home:_get(insert[1])[1];
  90953. rspine = {};
  90954. for i in [iheight + 1..home:_get(tree[1])[1]]
  90955. kids = home:_get(tree[1])[2];
  90956. tlen = length(kids);
  90957. rspine = {{tree, tlen}, @rspine};
  90958. tree = kids[tlen];
  90959. endfor
  90960. isize = insert[2];
  90961. m = this:_smerge(home, iheight, tree, insert);
  90962. for h in [1..length(rspine)]
  90963. plen = rspine[h][2];
  90964. parent = rspine[h][1];
  90965. hgp = home:_get(parent[1]);
  90966. if (((length(m) - 1) + plen) > this.maxfanout)
  90967. home:_put(parent[1], @listset(hgp, listset(hgp[2], m[1], plen), 2));
  90968. parent[2] = ((parent[2] + isize) - m[2][2]);
  90969. m = {parent, listset(m[2], home:_make(h + iheight, {m[2]}), 1)};
  90970. else
  90971. home:_put(parent[1], @listset(hgp, {@hgp[2][1..plen - 1], @m}, 2));
  90972. for p in (rspine[h + 1..length(rspine)])
  90973. parent[2] = (parent[2] + isize);
  90974. tree = parent;
  90975. parent = p[1];
  90976. hgp = home:_get(parent[1]);
  90977. home:_put(parent[1], @listset(hgp, listset(hgp[2], tree, p[2]), 2));
  90978. endfor
  90979. return listset(parent, parent[2] + isize, 2);
  90980. endif
  90981. endfor
  90982. return {home:_make((length(rspine) + iheight) + 1, m), m[1][2] + m[2][2], m[1][3]};
  90983. .
  90984. #15:21
  90985. ":_scrunch(home,tree) => newtree";
  90986. "decapitates single-child nodes from the top of the tree, returns new root.";
  90987. if (caller != this)
  90988. return E_PERM;
  90989. endif
  90990. if (tree = args[2])
  90991. home = args[1];
  90992. while ((n = home:_get(tree[1]))[1] && (length(n[2]) == 1))
  90993. home:_kill(tree[1]);
  90994. tree = n[2][1];
  90995. endwhile
  90996. endif
  90997. return tree;
  90998. .
  90999. #15:22
  91000. "_listfind_nth(nodelist,key) => {i,k} where i is the smallest i such that the sum of the first i elements of intlist is > key, and k==key - sum(first i-1 elements).";
  91001. "1 <= i <= length(intlist)+1";
  91002. lst = args[1];
  91003. key = args[2];
  91004. for i in [1..length(lst)]
  91005. key = (key - lst[i][2]);
  91006. if (0 > key)
  91007. return {i, key + lst[i][2]};
  91008. endif
  91009. endfor
  91010. return {length(lst) + 1, key};
  91011. .
  91012. #15:23
  91013. if (caller != this)
  91014. return E_PERM;
  91015. endif
  91016. .
  91017. #15:24
  91018. return $perm_utils:controls(caller_perms(), this) ? this:(args[1])(@listdelete(args, 1)) | E_PERM;
  91019. .
  91020. #16:0
  91021. gp = this._genprop;
  91022. ngp = "";
  91023. for i in [1..length(gp)]
  91024. if (gp[i] != "z")
  91025. ngp = ((ngp + "bcdefghijklmnopqrstuvwxyz"[index("abcdefghijklmnopqrstuvwxy", gp[i])]) + gp[i + 1..length(gp)]);
  91026. return " " + (this._genprop = ngp);
  91027. endif
  91028. ngp = (ngp + "a");
  91029. endfor
  91030. return " " + (this._genprop = (ngp + "a"));
  91031. .
  91032. #16:1
  91033. ":_make(...) => new node with value {...}";
  91034. if (!(caller in {this._mgr, this}))
  91035. return E_PERM;
  91036. endif
  91037. prop = this:_genprop();
  91038. add_property(this, prop, args, {this.mowner, ""});
  91039. return prop;
  91040. .
  91041. #16:2
  91042. ":_kill(node) destroys the given node.";
  91043. if (!(caller in {this, this._mgr}))
  91044. return E_PERM;
  91045. endif
  91046. delete_property(this, args[1]);
  91047. .
  91048. #16:3
  91049. return (caller == this._mgr) ? this.(args[1]) | E_PERM;
  91050. .
  91051. #16:4
  91052. return (caller == this._mgr) ? this.(args[1]) = listdelete(args, 1) | E_PERM;
  91053. .
  91054. #16:5
  91055. return args[1][2..3];
  91056. .
  91057. #16:6
  91058. ":_makemsg(ord,msg) => leafnode for msg";
  91059. "msg = $mail_agent:__convert_new(@args[2])";
  91060. msg = args[2];
  91061. if (caller != this)
  91062. return E_PERM;
  91063. elseif (h = ("" in msg))
  91064. return {this:_make(@msg[h + 1..length(msg)]), args[1], @msg[1..h - 1]};
  91065. else
  91066. return {0, args[1], @msg};
  91067. endif
  91068. .
  91069. #16:7
  91070. if (caller != this._mgr)
  91071. return E_PERM;
  91072. elseif (node = args[1][1])
  91073. this:_kill(node);
  91074. endif
  91075. .
  91076. #16:8
  91077. return args[2];
  91078. .
  91079. #16:9
  91080. return args[3];
  91081. .
  91082. #16:10
  91083. return args[3..length(args)];
  91084. .
  91085. #16:11
  91086. return {@args[3..length(args)], @args[1] ? {"", @this.(args[1])} | {}};
  91087. .
  91088. #16:12
  91089. return args[1] < args[2][1];
  91090. .
  91091. #16:13
  91092. return args[1] < args[2][2];
  91093. .
  91094. #16:14
  91095. if (!this:is_writable_by(caller_perms()))
  91096. return E_PERM;
  91097. else
  91098. new = this:new_message_num();
  91099. msgtree = this.messages;
  91100. for m in (args)
  91101. msgtree = this._mgr:insert_last(msgtree, this:_makemsg(new, m[2]));
  91102. new = (new + 1);
  91103. if ($command_utils:running_out_of_time())
  91104. this.messages = msgtree;
  91105. player:tell("... ", new);
  91106. suspend(0);
  91107. msgtree = this.messages;
  91108. new = this:new_message_num();
  91109. endif
  91110. endfor
  91111. this.messages = msgtree;
  91112. this.last_used_time = time();
  91113. return 1;
  91114. endif
  91115. .
  91116. #16:15
  91117. if (!this:is_writable_by(caller_perms()))
  91118. return E_PERM;
  91119. else
  91120. this.messages = this._mgr:insert_last(this.messages, msg = this:_makemsg(new = this:new_message_num(), args[1]));
  91121. this.last_msg_date = this:_message_date(@msg);
  91122. this.last_used_time = time();
  91123. return new;
  91124. endif
  91125. .
  91126. #16:16
  91127. if (!this:ok(caller, caller_perms()))
  91128. return E_PERM;
  91129. elseif (typeof(seq = args[1]) != LIST)
  91130. x = this._mgr:find_nth(this.messages, seq);
  91131. return {this:_message_num(@x), this:_message_text(@x)};
  91132. else
  91133. msgs = {};
  91134. while (seq)
  91135. handle = this._mgr:start(this.messages, seq[1], seq[2] - 1);
  91136. while (handle)
  91137. for x in (handle[1])
  91138. msgs = {@msgs, {this:_message_num(@x), this:_message_text(@x)}};
  91139. endfor
  91140. handle = this._mgr:next(@listdelete(handle, 1));
  91141. $command_utils:suspend_if_needed(0);
  91142. endwhile
  91143. seq = seq[3..length(seq)];
  91144. endwhile
  91145. return msgs;
  91146. endif
  91147. .
  91148. #16:17
  91149. ":display_seq_headers(msg_seq[,cur[,last_read_date]])";
  91150. "This is the default header display routine.";
  91151. "Prints a list of headers of messages on this to player.  msg_seq is the handle returned by this:parse_message_seq(...).  cur is the player's current message.  last_read_date is the date of the last of the already-read messages.";
  91152. if (!this:ok(caller, caller_perms()))
  91153. return E_PERM;
  91154. endif
  91155. getmsg = (this.summary_uses_body ? "_message_text" | "_message_hdr");
  91156. seq = args[1];
  91157. cur = {@args, 0}[2];
  91158. last_old = {@args, $maxint, $maxint}[3];
  91159. width = player:linelen();
  91160. while (seq)
  91161. handle = this._mgr:start(this.messages, seq[1], seq[2] - 1);
  91162. while (handle)
  91163. for x in (handle[1])
  91164. $command_utils:suspend_if_needed(0);
  91165. line = tostr($string_utils:right(x[2], 4, (cur == x[2]) ? ">" | " "), (x[3] > last_old) ? ":+ " | ":  ", this:msg_summary_line(@this:(getmsg)(@x)));
  91166. player:tell(line[1..min(width, length(line))]);
  91167. endfor
  91168. handle = this._mgr:next(@listdelete(handle, 1));
  91169. endwhile
  91170. seq = seq[3..length(seq)];
  91171. endwhile
  91172. player:tell("----+");
  91173. .
  91174. #16:18
  91175. ":display_seq_full(msg_seq[,preamble]) => {cur}";
  91176. "This is the default message display routine.";
  91177. "Prints the indicated messages on folder to player.  msg_seq is the handle returned by folder:parse_message_seq(...).  Returns the number of the final message in the sequence (to be the new current message number).";
  91178. if (!this:ok(caller, caller_perms()))
  91179. return E_PERM;
  91180. endif
  91181. seq = args[1];
  91182. preamble = {@args, ""}[2];
  91183. cur = (date = 0);
  91184. while (seq)
  91185. handle = this._mgr:start(this.messages, seq[1], seq[2] - 1);
  91186. while (handle)
  91187. for x in (handle[1])
  91188. cur = this:_message_num(@x);
  91189. date = this:_message_date(@x);
  91190. player:display_message(preamble ? strsub(preamble, "%d", tostr(cur)) | {}, player:msg_text(@this:_message_text(@x)));
  91191. endfor
  91192. handle = this._mgr:next(@listdelete(handle, 1));
  91193. $command_utils:suspend_if_needed(0);
  91194. endwhile
  91195. seq = seq[3..length(seq)];
  91196. endwhile
  91197. return {cur, date};
  91198. .
  91199. #16:19
  91200. if (!this:ok(caller, caller_perms()))
  91201. return E_PERM;
  91202. endif
  91203. len = 0;
  91204. getmsg = (this.summary_uses_body ? "_message_text" | "_message_hdr");
  91205. for s in (this.messages_going)
  91206. len = (len + s[2][2]);
  91207. handle = this._mgr:start(s[2], 1, s[2][2]);
  91208. while (handle)
  91209. for x in (handle[1])
  91210. player:tell($string_utils:right(this:_message_num(@x), 4), ":  ", this:msg_summary_line(@this:(getmsg)(@x)));
  91211. endfor
  91212. handle = this._mgr:next(@listdelete(handle, 1));
  91213. endwhile
  91214. endfor
  91215. if (len)
  91216. player:tell("----+");
  91217. endif
  91218. return len;
  91219. .
  91220. #16:20
  91221. if (!this:ok_write(caller, caller_perms()))
  91222. return E_PERM;
  91223. endif
  91224. msgtree = this.messages;
  91225. seq = {};
  91226. last = 0;
  91227. for s in (this.messages_going)
  91228. msgtree = this._mgr:insert_after(msgtree, s[2], last + s[1]);
  91229. seq = {@seq, (last + s[1]) + 1, (last = ((last + s[1]) + s[2][2])) + 1};
  91230. endfor
  91231. this.messages = msgtree;
  91232. this.messages_going = {};
  91233. this:_fix_last_msg_date();
  91234. return seq;
  91235. .
  91236. #16:21
  91237. if (!this:ok_write(caller, caller_perms()))
  91238. return E_PERM;
  91239. endif
  91240. len = 0;
  91241. for s in (this.messages_going)
  91242. len = (len + s[2][2]);
  91243. this._mgr:kill(s[2], "_killmsg");
  91244. endfor
  91245. this.messages_going = {};
  91246. return len;
  91247. .
  91248. #16:22
  91249. seq = args[1];
  91250. if (!(this:ok_write(caller, caller_perms()) || (this:ok(caller, caller_perms()) && (seq = this:own_messages_filter(caller_perms(), @args)))))
  91251. return E_PERM;
  91252. endif
  91253. msgtree = this.messages;
  91254. save = (nums = {});
  91255. onext = 1;
  91256. rmmed = 0;
  91257. for i in [1..length(seq) / 2]
  91258. if ($command_utils:suspend_if_needed(0))
  91259. player:tell("... rmm ", onext);
  91260. suspend(0);
  91261. endif
  91262. start = seq[(2 * i) - 1];
  91263. next = seq[2 * i];
  91264. x = this._mgr:extract_range(msgtree, start - rmmed, (next - 1) - rmmed);
  91265. msgtree = x[1];
  91266. zmsgs = x[2];
  91267. save = {@save, {start - onext, zmsgs}};
  91268. nums = {@nums, this:_message_num(@this._mgr:find_nth(zmsgs, 1)), this:_message_num(@this._mgr:find_nth(zmsgs, zmsgs[2])) + 1};
  91269. onext = next;
  91270. rmmed = ((rmmed + next) - start);
  91271. endfor
  91272. tmg = this.messages_going;
  91273. this.messages_going = save;
  91274. fork (0)
  91275. for s in (tmg)
  91276. this._mgr:kill(s[2], "_killmsg");
  91277. endfor
  91278. endfork
  91279. this.messages = msgtree;
  91280. this:_fix_last_msg_date();
  91281. return $seq_utils:tostr(nums);
  91282. .
  91283. #16:23
  91284. ":renumber([cur]) renumbers caller.messages, doing a suspend() if necessary.";
  91285. "  => {number of messages,new cur}.";
  91286. if (!this:ok_write(caller, caller_perms()))
  91287. return E_PERM;
  91288. endif
  91289. cur = {@args, 0}[1];
  91290. this:expunge_rmm();
  91291. "... blow away @rmm'ed messages since there's no way to tell what their new numbers should be...";
  91292. if (!(msgtree = this.messages))
  91293. return {0, 0};
  91294. endif
  91295. if (cur)
  91296. cur = (this._mgr:find_ord(msgtree, cur - 1, "_lt_msgnum") + 1);
  91297. endif
  91298. while (1)
  91299. "...find first out-of-sequence message...";
  91300. n = 1;
  91301. subtree = msgtree;
  91302. if (msgtree[3][1] == 1)
  91303. while ((node = this.(subtree[1]))[1])
  91304. "...subtree[3][1]==n...";
  91305. kids = node[2];
  91306. n = (n + subtree[2]);
  91307. i = length(kids);
  91308. while ((n = (n - kids[i][2])) != kids[i][3][1])
  91309. i = (i - 1);
  91310. endwhile
  91311. subtree = kids[i];
  91312. endwhile
  91313. leaves = node[2];
  91314. n = (((firstn = n) + length(leaves)) - 1);
  91315. while (n != leaves[(n - firstn) + 1][2])
  91316. n = (n - 1);
  91317. endwhile
  91318. n = (n + 1);
  91319. endif
  91320. "... n == first out-of-sequence ...";
  91321. "...renumber as many messages as we have time for...";
  91322. while ((n <= msgtree[2]) && (!$command_utils:running_out_of_time()))
  91323. msg = this._mgr:find_nth(msgtree, n);
  91324. msgtree = this._mgr:set_nth(msgtree, n, listset(msg, n, 2));
  91325. n = (n + 1);
  91326. endwhile
  91327. this.messages = msgtree;
  91328. if (n > msgtree[2])
  91329. return {n - 1, cur};
  91330. endif
  91331. player:tell("...(renumbering to ", n - 1, ")");
  91332. suspend(0);
  91333. "...start over... may have received new mail, rmm'ed stuff, etc...";
  91334. "...so who knows what's there now?...";
  91335. if (this.messages_going)
  91336. player:tell("Renumber aborted.");
  91337. return;
  91338. endif
  91339. msgtree = this.messages;
  91340. endwhile
  91341. .
  91342. #16:24
  91343. return this:ok(caller, caller_perms()) ? this.messages ? this.messages[2] | 0 | E_PERM;
  91344. .
  91345. #16:25
  91346. return this:ok(caller, caller_perms()) ? this._mgr:find_ord(this.messages, args[1], "_lt_msgnum") | E_PERM;
  91347. .
  91348. #16:26
  91349. return this:ok(caller, caller_perms()) ? this._mgr:find_ord(this.messages, args[1], "_lt_msgdate") | E_PERM;
  91350. .
  91351. #16:27
  91352. return this:ok(caller, caller_perms()) ? (i = this._mgr:find_ord(this.messages, args[1], "_lt_msgnum")) && ((this:_message_num(@this._mgr:find_nth(this.messages, i)) == args[1]) && i) | E_PERM;
  91353. .
  91354. #16:28
  91355. new = ((msgtree = this.messages) ? this:_message_num(@this._mgr:find_nth(msgtree, msgtree[2])) + 1 | 1);
  91356. if (rmsgs = this.messages_going)
  91357. lbrm = rmsgs[length(rmsgs)][2];
  91358. return max(new, this:_message_num(@this._mgr:find_nth(lbrm, lbrm[2])) + 1);
  91359. else
  91360. return new;
  91361. endif
  91362. .
  91363. #16:29
  91364. ":from_msg_seq(object or list)";
  91365. " => msg_seq of messages from any of these senders";
  91366. if (!this:ok(caller, caller_perms()))
  91367. return E_PERM;
  91368. elseif (!this.messages)
  91369. return {};
  91370. endif
  91371. if (typeof(plist = args[1]) != LIST)
  91372. plist = {plist};
  91373. endif
  91374. mask = {@args, {1, this.messages[2] + 1}}[2];
  91375. fseq = {};
  91376. for m in [1..length(mask) / 2]
  91377. handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1);
  91378. while (handle)
  91379. for msg in (handle[1])
  91380. fromline = msg[4];
  91381. if (toobj(fromline[rindex(fromline, "(") + 1..rindex(fromline, ")") - 1]) in plist)
  91382. fseq = $seq_utils:add(fseq, i, i);
  91383. endif
  91384. i = (i + 1);
  91385. $command_utils:suspend_if_needed(0);
  91386. endfor
  91387. handle = this._mgr:next(@listdelete(handle, 1));
  91388. endwhile
  91389. endfor
  91390. return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or "));
  91391. .
  91392. #16:30
  91393. ":%from_msg_seq(string or list of strings)";
  91394. " => msg_seq of messages with one of these strings in the from line";
  91395. if (!this:ok(caller, caller_perms()))
  91396. return E_PERM;
  91397. elseif (!this.messages)
  91398. return {};
  91399. endif
  91400. if (typeof(nlist = args[1]) != LIST)
  91401. nlist = {nlist};
  91402. endif
  91403. fseq = {};
  91404. mask = {@args, {1, this.messages[2] + 1}}[2];
  91405. for m in [1..length(mask) / 2]
  91406. handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1);
  91407. while (handle)
  91408. for msg in (handle[1])
  91409. fromline = (" " + msg[4]);
  91410. for n in (nlist)
  91411. if (index(fromline, n))
  91412. fseq = $seq_utils:add(fseq, i, i);
  91413. endif
  91414. endfor
  91415. i = (i + 1);
  91416. $command_utils:suspend_if_needed(0);
  91417. endfor
  91418. handle = this._mgr:next(@listdelete(handle, 1));
  91419. endwhile
  91420. endfor
  91421. return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg($string_utils, "print", nlist), "no one", " or "));
  91422. .
  91423. #16:31
  91424. ":to_msg_seq(object or list) => msg_seq of messages to those people";
  91425. if (!this:ok(caller, caller_perms()))
  91426. return E_PERM;
  91427. elseif (!this.messages)
  91428. return {};
  91429. endif
  91430. if (typeof(plist = args[1]) != LIST)
  91431. plist = {plist};
  91432. endif
  91433. seq = {};
  91434. mask = {@args, {1, this.messages[2] + 1}}[2];
  91435. for m in [1..length(mask) / 2]
  91436. handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1);
  91437. while (handle)
  91438. for msg in (handle[1])
  91439. toline = msg[5];
  91440. for r in ($mail_agent:parse_address_field(toline))
  91441. if (r in plist)
  91442. seq = $seq_utils:add(seq, i, i);
  91443. endif
  91444. endfor
  91445. i = (i + 1);
  91446. $command_utils:suspend_if_needed(0);
  91447. endfor
  91448. handle = this._mgr:next(@listdelete(handle, 1));
  91449. endwhile
  91450. endfor
  91451. return seq || ("%f %<has> no messages to " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or "));
  91452. .
  91453. #16:32
  91454. ":%to_msg_seq(string or list of strings)";
  91455. " => msg_seq of messages containing one of strings in the to line";
  91456. if (!this:ok(caller, caller_perms()))
  91457. return E_PERM;
  91458. elseif (!this.messages)
  91459. return {};
  91460. endif
  91461. if (typeof(nlist = args[1]) != LIST)
  91462. nlist = {nlist};
  91463. endif
  91464. seq = {};
  91465. mask = {@args, {1, this.messages[2] + 1}}[2];
  91466. for m in [1..length(mask) / 2]
  91467. handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1);
  91468. while (handle)
  91469. for msg in (handle[1])
  91470. toline = (" " + msg[5]);
  91471. for n in (nlist)
  91472. if (index(toline, n))
  91473. seq = $seq_utils:add(seq, i, i);
  91474. endif
  91475. endfor
  91476. i = (i + 1);
  91477. $command_utils:suspend_if_needed(0);
  91478. endfor
  91479. handle = this._mgr:next(@listdelete(handle, 1));
  91480. endwhile
  91481. endfor
  91482. return seq || ("%f %<has> no messages to " + $string_utils:english_list($list_utils:map_arg($string_utils, "print", nlist), "no one", " or "));
  91483. .
  91484. #16:33
  91485. ":subject_msg_seq(target) => msg_seq of messages with target in the Subject:";
  91486. if (!this:ok(caller, caller_perms()))
  91487. return E_PERM;
  91488. elseif (!this.messages)
  91489. return {};
  91490. endif
  91491. target = args[1];
  91492. seq = {};
  91493. mask = {@args, {1, this.messages[2] + 1}}[2];
  91494. for m in [1..length(mask) / 2]
  91495. handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1);
  91496. while (handle)
  91497. for msg in (handle[1])
  91498. if (((subject = msg[6]) != " ") && index(subject, target))
  91499. seq = $seq_utils:add(seq, i, i);
  91500. endif
  91501. i = (i + 1);
  91502. $command_utils:suspend_if_needed(0);
  91503. endfor
  91504. handle = this._mgr:next(@listdelete(handle, 1));
  91505. endwhile
  91506. endfor
  91507. return seq || (("%f %<has> no messages with subjects containing `" + target) + "'");
  91508. .
  91509. #16:34
  91510. ":body_msg_seq(target) => msg_seq of messages with target in the body";
  91511. if (!this:ok(caller, caller_perms()))
  91512. return E_PERM;
  91513. elseif (!this.messages)
  91514. return {};
  91515. endif
  91516. target = args[1];
  91517. seq = {};
  91518. mask = {@args, {1, this.messages[2] + 1}}[2];
  91519. for m in [1..length(mask) / 2]
  91520. handle = this._mgr:start(this.messages, i = mask[(2 * m) - 1], mask[2 * m] - 1);
  91521. while (handle)
  91522. for msg in (handle[1])
  91523. if (msg[1] && (body = this.(msg[1])))
  91524. l = length(body);
  91525. while ((!index(body[l], target)) && (l = (l - 1)))
  91526. $command_utils:suspend_if_needed(0);
  91527. endwhile
  91528. if (l)
  91529. seq = $seq_utils:add(seq, i, i);
  91530. endif
  91531. endif
  91532. i = (i + 1);
  91533. $command_utils:suspend_if_needed(0);
  91534. endfor
  91535. handle = this._mgr:next(@listdelete(handle, 1));
  91536. endwhile
  91537. endfor
  91538. return seq || tostr("%f %<has> no messages containing `", target, "' in the body.");
  91539. .
  91540. #16:35
  91541. return E_VERBNF;
  91542. .
  91543. #16:36
  91544. msgtree = this.messages;
  91545. this.last_msg_date = ((msgtree && this:_message_hdr(@this._mgr:find_nth(msgtree, msgtree[2]))[1]) || 0);
  91546. .
  91547. #16:37
  91548. if (!this:ok_write(caller, caller_perms()))
  91549. return E_PERM;
  91550. endif
  91551. doit = (args && args[1]);
  91552. msgtree = this.messages;
  91553. for n in [1..msgtree[2]]
  91554. msg = this._mgr:find_nth(msgtree, n);
  91555. msg = {@msg[1..2], @$mail_agent:__convert_new(@msg[3..length(msg)])};
  91556. if (doit)
  91557. msgtree = this._mgr:set_nth(msgtree, n, msg);
  91558. endif
  91559. if ($command_utils:running_out_of_time())
  91560. suspend(0);
  91561. if (this.messages != msgtree)
  91562. player:notify("urk.  someone played with this folder.");
  91563. return 0;
  91564. endif
  91565. endif
  91566. endfor
  91567. return 1;
  91568. .
  91569. #16:38
  91570. if (caller_perms().wizard)
  91571. pass();
  91572. this._mgr = $biglist;
  91573. this.mowner = $mail_recipient.owner;
  91574. endif
  91575. .
  91576. #16:39
  91577. if (this:ok(caller, caller_perms()))
  91578. date = args[1];
  91579. return (this.last_msg_date <= date) ? 0 | (this.messages[2] - this._mgr:find_ord(this.messages, args[1], "_lt_msgdate"));
  91580. else
  91581. return E_PERM;
  91582. endif
  91583. .
  91584. #17:0
  91585. what = args[1];
  91586. return is_player(what) && (!(what in connected_players()));
  91587. .
  91588. #17:1
  91589. who = args[1];
  91590. move(who, $player_start);
  91591. $player_start:announce_all_but({who}, who.name, " has connected.");
  91592. .
  91593. #17:2
  91594. return $player_start:who_location_msg(@args);
  91595. .
  91596. #18:0
  91597. return ((caller == this) || caller_perms().wizard) ? pass(@args) | E_PERM;
  91598. .
  91599. #18:1
  91600. ":add(player,email[,comment])";
  91601. if (!caller_perms().wizard)
  91602. return E_PERM;
  91603. endif
  91604. who = args[1];
  91605. email = args[2];
  91606. comment = args[3..length(args)];
  91607. l = this:find_exact(email);
  91608. if (l == $failed_match)
  91609. this:insert(email, {{who, @comment}});
  91610. elseif (i = $list_utils:iassoc(who, l))
  91611. this:insert(email, listset(l, {who, @comment}, i));
  91612. else
  91613. this:insert(email, {@l, {who, @comment}});
  91614. endif
  91615. .
  91616. #18:2
  91617. if (caller_perms().wizard)
  91618. pass();
  91619. this:clearall();
  91620. this.registrar = #2;
  91621. endif
  91622. .
  91623. #18:3
  91624. "suspicious(address)";
  91625. "Determine whether an address appears to be another player in disguise.";
  91626. "returns a list of similar addresses.";
  91627. "";
  91628. "at the moment,";
  91629. "  foo@bar.baz.bing.boo";
  91630. "is considered 'similar' to anything matching";
  91631. "  foo@*.bing.boo";
  91632. if (!caller_perms().wizard)
  91633. return E_PERM;
  91634. endif
  91635. parsed = $network:parse_address(address = args[1]);
  91636. userid = parsed[1];
  91637. site = parsed[2];
  91638. exact = ((!site) && this:find_exact(address));
  91639. if (!site)
  91640. site = $network.site;
  91641. endif
  91642. site = $network:local_domain(site);
  91643. sitelen = length(site);
  91644. others = this:find_all_keys(userid + "@");
  91645. for other in (others)
  91646. if (other[(length(other) - sitelen) + 1..length(other)] != site)
  91647. others = setremove(others, other);
  91648. endif
  91649. endfor
  91650. if (exact)
  91651. others = listinsert(others, address);
  91652. endif
  91653. return others;
  91654. .
  91655. #18:4
  91656. "suspicious_userid(userid)";
  91657. "Return yes if userid is root or postmaster or something like that.";
  91658. return args[1] in {"", "sysadmin", "root", "postmaster", "bin", "SYSTEM", "OPERATOR"};
  91659. "Thinking about ruling out hyphenated names, on the grounds that they're probably mailing lists.";
  91660. .
  91661. #19:0
  91662. ":display_seq_headers(msg_seq[,cur])";
  91663. if (!this:ok(caller, caller_perms()))
  91664. return E_PERM;
  91665. endif
  91666. player:tell("       WHEN    BY        WHO                 EMAIL-ADDRESS");
  91667. pass(@args);
  91668. .
  91669. #19:1
  91670. when = ctime(args[1])[5..10];
  91671. from = args[2];
  91672. by = $string_utils:left(from[1..index(from, " (") - 1], -9);
  91673. subject = args[4];
  91674. who = subject[1..(open = index(subject, " (")) - 1];
  91675. if ((close = rindex(subject, ")")) > open)
  91676. who = (who[1..min(9, length(who))] + subject[open..close]);
  91677. endif
  91678. who = $string_utils:left(who, 18);
  91679. line = args[("" in args) + 1];
  91680. email = line[1..index(line + " ", " ") - 1];
  91681. if (!index(email, "@"))
  91682. email = "??";
  91683. endif
  91684. return tostr(when, "  ", by, " ", who, "  ", email);
  91685. .
  91686. #19:2
  91687. if (caller_perms().wizard)
  91688. pass();
  91689. "this:rm_message_seq({1, 1 + this:length_all_msgs()})";
  91690. "this:expunge_rmm()";
  91691. for p in (properties(this))
  91692. $command_utils:suspend_if_needed(0);
  91693. if (p && (p[1] == " "))
  91694. delete_property(this, p);
  91695. endif
  91696. endfor
  91697. this.messages = (this.messages_going = {});
  91698. this._genprop = "";
  91699. this.mail_forward = {player, this};
  91700. this.mail_notify = {player};
  91701. for p in ({"moderator_forward", "writers", "readers", "expire_period", "last_used_time"})
  91702. this.(p) = $mail_recipient.(p);
  91703. endfor
  91704. this.moderated = 1;
  91705. else
  91706. return E_PERM;
  91707. endif
  91708. .
  91709. #19:3
  91710. "Copied from Generic Mail Recipient (#6419):is_usable_by by Rog (#4292) Tue Mar  2 10:02:32 1993 PST";
  91711. return (!this.moderated) || ((this:is_writable_by(who = args[1]) || (who in this.moderated)) || who.wizard);
  91712. .
  91713. #20:0
  91714. "space(len,fill) returns a string of length abs(len) consisting of copies of fill.  If len is negative, fill is anchored on the right instead of the left.";
  91715. n = args[1];
  91716. if (typeof(n) == STR)
  91717. n = length(n);
  91718. endif
  91719. if (" " != (fill = {@args, " "}[2]))
  91720. fill = (fill + fill);
  91721. fill = (fill + fill);
  91722. fill = (fill + fill);
  91723. elseif ((n = abs(n)) < 70)
  91724. return "                                                                      "[1..n];
  91725. else
  91726. fill = "                                                                      ";
  91727. endif
  91728. m = ((n - 1) / length(fill));
  91729. while (m)
  91730. fill = (fill + fill);
  91731. m = (m / 2);
  91732. endwhile
  91733. return (n > 0) ? fill[1..n] | fill[((f = length(fill)) + 1) + n..f];
  91734. .
  91735. #20:1
  91736. text = args[1];
  91737. len = args[2];
  91738. fill = (((length(args) >= 3) && args[3]) || " ");
  91739. abslen = abs(len);
  91740. out = tostr(text);
  91741. if (length(out) < abslen)
  91742. return out + this:space(length(out) - abslen, fill);
  91743. else
  91744. return (len > 0) ? out | out[1..abslen];
  91745. endif
  91746. .
  91747. #20:2
  91748. text = args[1];
  91749. len = args[2];
  91750. fill = (((length(args) >= 3) && args[3]) || " ");
  91751. abslen = abs(len);
  91752. out = tostr(text);
  91753. if (length(out) < abslen)
  91754. return this:space(abslen - length(out), fill) + out;
  91755. else
  91756. return (len > 0) ? out | out[1..abslen];
  91757. endif
  91758. .
  91759. #20:3
  91760. text = args[1];
  91761. len = args[2];
  91762. lfill = (((length(args) >= 3) && args[3]) || " ");
  91763. rfill = ((length(args) >= 4) ? args[4] | lfill);
  91764. out = tostr(text);
  91765. abslen = abs(len);
  91766. if (length(out) < abslen)
  91767. return (this:space((abslen - length(out)) / 2, lfill) + out) + this:space(((abslen - length(out)) + 1) / -2, rfill);
  91768. else
  91769. return (len > 0) ? out | out[1..abslen];
  91770. endif
  91771. .
  91772. #20:4
  91773. "columnize (items, n [, width]) - Turn a one-column list of items into an n-column list. 'width' is the last character position that may be occupied; it defaults to a standard screen width. Example: To tell the player a list of numbers in three columns, do 'player:tell_lines ($string_utils:columnize ({1, 2, 3, 4, 5, 6, 7}, 3));'.";
  91774. items = args[1];
  91775. n = args[2];
  91776. width = ((length(args) >= 3) ? args[3] | 79);
  91777. height = (((length(items) + n) - 1) / n);
  91778. items = {@items, @$list_utils:make((height * n) - length(items), "")};
  91779. colwidths = {};
  91780. for col in [1..n - 1]
  91781. colwidths = listappend(colwidths, 1 - (((width + 1) * col) / n));
  91782. endfor
  91783. result = {};
  91784. for row in [1..height]
  91785. line = tostr(items[row]);
  91786. for col in [1..n - 1]
  91787. line = tostr(this:left(line, colwidths[col]), " ", items[row + (col * height)]);
  91788. endfor
  91789. result = listappend(result, line[1..min(length(line), width)]);
  91790. endfor
  91791. return result;
  91792. .
  91793. #20:5
  91794. "$string_utils:from_list(list [, separator])";
  91795. "Return a string being the concatenation of the string representations of the elements of LIST, each pair separated by the string SEPARATOR, which defaults to the empty string.";
  91796. LIST = args[1];
  91797. if (length(args) <= 1)
  91798. return tostr(@LIST);
  91799. elseif (LIST)
  91800. separator = args[2];
  91801. result = tostr(LIST[1]);
  91802. for elt in (listdelete(LIST, 1))
  91803. result = tostr(result, separator, elt);
  91804. endfor
  91805. return result;
  91806. else
  91807. return "";
  91808. endif
  91809. .
  91810. #20:6
  91811. "Prints the argument (must be a list) as an english list, e.g. {1, 2, 3} is printed as \"1, 2, and 3\", and {1, 2} is printed as \"1 and 2\".";
  91812. "Optional arguments are treated as follows:";
  91813. "  Second argument is the string to use when the empty list is given.  The default is \"nothing\".";
  91814. "  Third argument is the string to use in place of \" and \".  A typical application might be to use \" or \" instead.";
  91815. "  Fourth argument is the string to use instead of a comma (and space).  Gary_Severn's deranged mind actually came up with an application for this.  You can ask him.";
  91816. "  Fifth argument is a string to use after the penultimate element before the \" and \".  The default is to have a comma without a space.";
  91817. things = args[1];
  91818. nthings = length(things);
  91819. if (length(args) > 1)
  91820. nothingstr = args[2];
  91821. else
  91822. nothingstr = "nothing";
  91823. endif
  91824. if (length(args) > 2)
  91825. andstr = args[3];
  91826. else
  91827. andstr = " and ";
  91828. endif
  91829. if (length(args) > 3)
  91830. commastr = args[4];
  91831. else
  91832. commastr = ", ";
  91833. endif
  91834. if (length(args) > 4)
  91835. finalcommastr = args[5];
  91836. else
  91837. finalcommastr = ",";
  91838. endif
  91839. if (nthings == 0)
  91840. return nothingstr;
  91841. elseif (nthings == 1)
  91842. return tostr(things[1]);
  91843. elseif (nthings == 2)
  91844. return tostr(things[1], andstr, things[2]);
  91845. else
  91846. ret = "";
  91847. for k in [1..nthings - 1]
  91848. if (k == (nthings - 1))
  91849. commastr = finalcommastr;
  91850. endif
  91851. ret = tostr(ret, things[k], commastr);
  91852. endfor
  91853. return tostr(ret, andstr, things[nthings]);
  91854. endif
  91855. .
  91856. #20:7
  91857. "Return a string of the names and object numbers of the objects in a list.";
  91858. line = "";
  91859. for item in (args[1])
  91860. if ((typeof(item) == OBJ) && valid(item))
  91861. line = ((((line + item.name) + "(") + tostr(item)) + ")   ");
  91862. endif
  91863. endfor
  91864. return $string_utils:trimr(line);
  91865. .
  91866. #20:8
  91867. minute = 60;
  91868. hour = (60 * minute);
  91869. day = (24 * hour);
  91870. secs = args[1];
  91871. if (secs > day)
  91872. count = (secs / day);
  91873. unit = "day";
  91874. article = "a";
  91875. elseif (secs > hour)
  91876. count = (secs / hour);
  91877. unit = "hour";
  91878. article = "an";
  91879. elseif (secs > minute)
  91880. count = (secs / minute);
  91881. unit = "minute";
  91882. article = "a";
  91883. else
  91884. count = secs;
  91885. unit = "second";
  91886. article = "a";
  91887. endif
  91888. if (count == 1)
  91889. time = tostr(article, " ", unit);
  91890. else
  91891. time = tostr(count, " ", unit, "s");
  91892. endif
  91893. return time;
  91894. .
  91895. #20:9
  91896. ":trim (string [, space]) -- remove leading and trailing spaces";
  91897. "";
  91898. "`space' should be a character (single-character string); it defaults to \" \".  Returns a copy of string with all leading and trailing copies of that character removed.  For example, $string_utils:trim(\"***foo***\", \"*\") => \"foo\".";
  91899. string = args[1];
  91900. space = {@args, " "}[2];
  91901. m = match(string, tostr("[^", space, "]%(.*[^", space, "]%)?%|$"));
  91902. return string[m[1]..m[2]];
  91903. .
  91904. #20:10
  91905. ":triml(string [, space]) -- remove leading spaces";
  91906. "";
  91907. "`space' should be a character (single-character string); it defaults to \" \".  Returns a copy of string with all leading copies of that character removed.  For example, $string_utils:triml(\"***foo***\", \"*\") => \"foo***\".";
  91908. string = args[1];
  91909. what = {@args, " "}[2];
  91910. return string[match(string, tostr("[^", what, "]%|$"))[1]..length(string)];
  91911. .
  91912. #20:11
  91913. ":trimr(string [, space]) -- remove trailing spaces";
  91914. "";
  91915. "`space' should be a character (single-character string); it defaults to \" \".  Returns a copy of string with all trailing copies of that character removed.  For example, $string_utils:trimr(\"***foo***\", \"*\") => \"***foo\".";
  91916. string = args[1];
  91917. what = {@args, " "}[2];
  91918. return string[1..rmatch(string, tostr("[^", what, "]%|^"))[2]];
  91919. .
  91920. #20:12
  91921. ":strip_chars(string,chars) => string with chars removed";
  91922. subject = args[1];
  91923. stripped = args[2];
  91924. for i in [1..length(stripped)]
  91925. subject = strsub(subject, stripped[i], "");
  91926. endfor
  91927. return subject;
  91928. .
  91929. #20:13
  91930. ":strip_all_but(string,keep) => string with chars not in `keep' removed.";
  91931. "`keep' is used in match() so if it includes ], ^, or -,";
  91932. "] should be first, ^ should be other from first, and - should be last.";
  91933. string = args[1];
  91934. wanted = (("[" + args[2]) + "]+");
  91935. output = "";
  91936. while (m = match(string, wanted))
  91937. output = (output + string[m[1]..m[2]]);
  91938. string = string[m[2] + 1..length(string)];
  91939. endwhile
  91940. return output;
  91941. .
  91942. #20:14
  91943. "lowercase(string) -- returns a lowercase version of the string.";
  91944. "uppercase(string) -- returns the uppercase version of the string.";
  91945. string = args[1];
  91946. from = (caps = "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
  91947. to = (lower = "abcdefghijklmnopqrstuvwxyz");
  91948. if (verb == "uppercase")
  91949. from = lower;
  91950. to = caps;
  91951. endif
  91952. for i in [1..26]
  91953. string = strsub(string, from[i], to[i], 1);
  91954. endfor
  91955. return string;
  91956. .
  91957. #20:15
  91958. "capitalizes its argument.";
  91959. if ((string = args[1]) && (i = index("abcdefghijklmnopqrstuvwxyz", string[1], 1)))
  91960. string[1] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[i];
  91961. endif
  91962. return string;
  91963. .
  91964. #20:16
  91965. string = args[1];
  91966. if (!string)
  91967. return $nothing;
  91968. elseif ((string[1] == "#") && (E_TYPE != (object = $code_utils:toobj(string))))
  91969. return object;
  91970. elseif ((string[1] == "$") && ($object_utils:has_property(#0, pn = string[2..length(string)]) && (typeof(object = #0.(pn)) == OBJ)))
  91971. return object;
  91972. else
  91973. return $failed_match;
  91974. endif
  91975. .
  91976. #20:17
  91977. "$string_utils:match(string [, obj-list, prop-name]*)";
  91978. "Each obj-list should be a list of objects or a single object, which is treated as if it were a list of that object.  Each prop-name should be string naming a property on every object in the corresponding obj-list.  The value of that property in each case should be either a string or a list of strings.";
  91979. "The argument string is matched against all of the strings in the property values.";
  91980. "If it exactly matches exactly one of them, the object containing that property is returned.  If it exactly matches more than one of them, $ambiguous_match is returned.";
  91981. "If there are no exact matches, then partial matches are considered, ones in which the given string is a prefix of some property string.  Again, if exactly one match is found, the object with that property is returned, and if there is more than one match, $ambiguous_match is returned.";
  91982. "Finally, if there are no exact or partial matches, then $failed_match is returned.";
  91983. subject = args[1];
  91984. if (subject == "")
  91985. return $nothing;
  91986. endif
  91987. no_exact_match = (no_partial_match = 1);
  91988. for i in [1..length(args) / 2]
  91989. prop_name = args[(2 * i) + 1];
  91990. for object in ((typeof(olist = args[2 * i]) == LIST) ? olist | {olist})
  91991. if (valid(object))
  91992. if (typeof(str_list = object.(prop_name)) != LIST)
  91993. str_list = {str_list};
  91994. endif
  91995. if (subject in str_list)
  91996. if (no_exact_match)
  91997. no_exact_match = object;
  91998. elseif (no_exact_match != object)
  91999. return $ambiguous_match;
  92000. endif
  92001. else
  92002. for string in (str_list)
  92003. if (index(string, subject) != 1)
  92004. elseif (no_partial_match)
  92005. no_partial_match = object;
  92006. elseif (no_partial_match != object)
  92007. no_partial_match = $ambiguous_match;
  92008. endif
  92009. endfor
  92010. endif
  92011. endif
  92012. endfor
  92013. endfor
  92014. return no_exact_match && (no_partial_match && $failed_match);
  92015. .
  92016. #20:18
  92017. "* wildcard matching. Returns a list of what the *s actually matched. Won't cath every match, if there are several ways to parse it.";
  92018. "Example: $string_utils:match_string(\"Jack waves to Jill\",\"* waves to *\") returns {\"Jack\", \"Jill\"}";
  92019. "Optional arguments: numbers are interpreted as case-sensitivity, strings as alternative wildcards.";
  92020. wild = "*";
  92021. case = (ret = {});
  92022. what = (args[1] + "&^%$");
  92023. targ = (args[2] + "&^%$");
  92024. for y in (args[3..length(args)])
  92025. if (typeof(y) == STR)
  92026. wild = y;
  92027. elseif (typeof(y) == NUM)
  92028. case = {y};
  92029. endif
  92030. endfor
  92031. while (targ != "")
  92032. if (z = index(targ, wild))
  92033. part = targ[1..z - 1];
  92034. else
  92035. z = length(targ);
  92036. part = targ;
  92037. endif
  92038. n = ((part == "") ? 1 | index(what, part, @case));
  92039. if (n)
  92040. ret = listappend(ret, what[1..n - 1]);
  92041. what = what[(z + n) - 1..length(what)];
  92042. targ = targ[z + 1..length(targ)];
  92043. else
  92044. return 0;
  92045. endif
  92046. endwhile
  92047. if (ret == {})
  92048. return what == "";
  92049. elseif (ret == {""})
  92050. return 1;
  92051. elseif (ret[1] == "")
  92052. return ret[2..length(ret)];
  92053. else
  92054. return 0;
  92055. endif
  92056. .
  92057. #20:19
  92058. ":match_object(string,location[,someone])";
  92059. "Returns the object matching the given string for someone, on the assumption that s/he is in the given location.  `someone' defaults to player.";
  92060. "This first tries :literal_object(string), \"me\"=>someone,\"here\"=>location, then player:match(string) and finally location:match(string) if location is valid.";
  92061. "This is the default algorithm for use by room :match_object() and player :my_match_object() verbs.  Player verbs that are calling this directly should probably be calling :my_match_object instead.";
  92062. string = args[1];
  92063. here = args[2];
  92064. who = {@args, player}[3];
  92065. if ($failed_match != (object = this:literal_object(string)))
  92066. return object;
  92067. elseif (string == "me")
  92068. return who;
  92069. elseif (string == "here")
  92070. return here;
  92071. elseif ((valid(pobject = who:match(string)) && (string in {@pobject.aliases, pobject.name})) || (!valid(here)))
  92072. "...exact match in player or room is bogus...";
  92073. return pobject;
  92074. elseif ((valid(hobject = here:match(string)) && (string in {@hobject.aliases, hobject.name})) || (pobject == $failed_match))
  92075. "...exact match in room or match in player failed completely...";
  92076. return hobject;
  92077. else
  92078. return pobject;
  92079. endif
  92080. .
  92081. #20:20
  92082. "match_player(name,name,...)      => {obj,obj,...}";
  92083. "match_player(name[,meobj])       => obj";
  92084. "match_player({name,...}[,meobj]) => {obj,...}";
  92085. "objs returned are either players, $failed_match, $ambiguous_match, or $nothing in the case of an empty string.";
  92086. "meobj (what to return for instances of `me') defaults to player; if given and isn't actually a player, `me' => $failed_match";
  92087. retstr = 0;
  92088. me = player;
  92089. if ((length(args) < 2) || (typeof(me = args[2]) == OBJ))
  92090. me = ((valid(me) && is_player(me)) ? me | $failed_match);
  92091. if (typeof(args[1]) == STR)
  92092. strings = {args[1]};
  92093. retstr = 1;
  92094. "return a string, not a list";
  92095. else
  92096. strings = args[1];
  92097. endif
  92098. else
  92099. strings = args;
  92100. me = player;
  92101. endif
  92102. found = {};
  92103. for astr in (strings)
  92104. if (!astr)
  92105. aobj = $nothing;
  92106. elseif (astr == "me")
  92107. aobj = me;
  92108. elseif (valid(aobj = $string_utils:literal_object(astr)) && is_player(aobj))
  92109. "astr is a valid literal object number of some player, so we are done.";
  92110. else
  92111. aobj = $player_db:find(astr);
  92112. endif
  92113. found = {@found, aobj};
  92114. endfor
  92115. return retstr ? found[1] | found;
  92116. .
  92117. #20:21
  92118. "Accepts any number of strings, attempts to match those strings first against objects in the room, and if no objects by those names exist, matches against player names (and \"#xxxx\" style strings regardless of location).  Returns a list of valid objects so found.";
  92119. "Unlike $string_utils:match_player, does not include in the list the failed and ambiguous matches; instead has built-in error messages for such objects.  This should probably be improved.  Volunteers?";
  92120. if (!args)
  92121. return;
  92122. endif
  92123. unknowns = {};
  92124. objs = {};
  92125. "We have to do something icky here.  Parallel walk the victims and args lists.  When it's a valid object, then it's a player.  If it's an invalid object, try to get an object match from the room.  If *that* fails, complain.";
  92126. for i in [1..length(args)]
  92127. if (valid(o = player.location:match_object(args[i])))
  92128. objs = {@objs, o};
  92129. else
  92130. unknowns = {@unknowns, args[i]};
  92131. endif
  92132. endfor
  92133. victims = $string_utils:match_player(unknowns);
  92134. for i in [1..length(victims)]
  92135. if (!valid(victims[i]))
  92136. player:tell("Could not find ", unknowns[i], " as either an object or a player.");
  92137. else
  92138. objs = {@objs, victims[i]};
  92139. endif
  92140. endfor
  92141. return objs;
  92142. .
  92143. #20:22
  92144. "find_prefix(prefix, string-list) => list index of something starting with prefix, or 0 or $ambiguous_match.";
  92145. subject = args[1];
  92146. choices = args[2];
  92147. answer = 0;
  92148. for i in [1..length(choices)]
  92149. if (index(choices[i], subject) == 1)
  92150. if (answer == 0)
  92151. answer = i;
  92152. else
  92153. answer = $ambiguous_match;
  92154. endif
  92155. endif
  92156. endfor
  92157. return answer;
  92158. .
  92159. #20:23
  92160. "index_delimited(string,target[,case_matters]) is just like the corresponding call to the builtin index() but instead only matches on occurences of target delimited by word boundaries (i.e., not preceded or followed by an alphanumeric)";
  92161. args[2] = (("%(%W%|^%)" + $string_utils:regexp_quote(args[2])) + "%(%W%|$%)");
  92162. return (m = match(@args)) ? m[3][1][2] + 1 | 0;
  92163. .
  92164. #20:24
  92165. "Usage:  is_numeric(string)";
  92166. "Is string numeric (composed of one or more digits possibly preceded by a minus sign)?";
  92167. "Return true or false";
  92168. return match(args[1], "^ *[-+]?[0-9]+ *$");
  92169. digits = "1234567890";
  92170. if (!(string = args[1]))
  92171. return 0;
  92172. endif
  92173. if (string[1] == "-")
  92174. string = string[2..length(string)];
  92175. endif
  92176. for i in [1..length(string)]
  92177. if (!index(digits, string[i]))
  92178. return 0;
  92179. endif
  92180. endfor
  92181. return 1;
  92182. .
  92183. #20:25
  92184. ":short_ordinal(1) => \"1st\",:short_ordinal(2) => \"2nd\",etc...";
  92185. string = tostr(n = args[1]);
  92186. n = (abs(n) % 100);
  92187. if (((n / 10) != 1) && ((n % 10) in {1, 2, 3}))
  92188. return string + {"st", "nd", "rd"}[n % 10];
  92189. else
  92190. return string + "th";
  92191. endif
  92192. .
  92193. #20:26
  92194. "$string_utils:group_number(n [, sep_char])";
  92195. "";
  92196. "Converts N to a string, inserting commas (or copies of SEP_CHAR, if given) every three digits, counting from the right.  For example, $string_utils:group_number(1234567890) returns the string \"1,234,567,890\".";
  92197. n = args[1];
  92198. comma = ((length(args) > 1) ? args[2] | ",");
  92199. result = "";
  92200. sign = ((n < 0) ? "-" | "");
  92201. n = tostr(abs(n));
  92202. while ((len = length(n)) > 3)
  92203. result = ((comma + n[len - 2..len]) + result);
  92204. n = n[1..len - 3];
  92205. endwhile
  92206. return (sign + n) + result;
  92207. .
  92208. #20:27
  92209. "$string_utils:english_number(n) -- convert the number N into English";
  92210. "";
  92211. "Produces a string containing the English phrase naming the given number.  For example, $string_utils:english_number(-1234) returns the string `negative one thousand two hundred thirty-four'.";
  92212. NUM = tonum(args[1]);
  92213. if (NUM == 0)
  92214. return "zero";
  92215. endif
  92216. labels = {"", " thousand", " million", " billion"};
  92217. numstr = "";
  92218. mod = abs(NUM);
  92219. for n in [1..4]
  92220. div = (mod % 1000);
  92221. if (div)
  92222. hun = (div / 100);
  92223. ten = (div % 100);
  92224. outstr = (this:english_tens(ten) + labels[n]);
  92225. if (hun)
  92226. outstr = (((this:english_ones(hun) + " hundred") + (ten ? " " | "")) + outstr);
  92227. endif
  92228. if (numstr)
  92229. numstr = ((outstr + " ") + numstr);
  92230. else
  92231. numstr = outstr;
  92232. endif
  92233. endif
  92234. mod = (mod / 1000);
  92235. endfor
  92236. return ((NUM < 0) ? "negative " | "") + numstr;
  92237. .
  92238. #20:28
  92239. "$string_utils:english_ordinal(n) -- convert the number N into an english ordinal (1 => \"first\", etc...)";
  92240. NUM = tonum(args[1]);
  92241. if (NUM == 0)
  92242. return "zeroth";
  92243. elseif (NUM % 100)
  92244. hundreds = ((abs(NUM) > 100) ? this:english_number((NUM / 100) * 100) + " " | ((NUM < 0) ? "negative " | ""));
  92245. NUM = (abs(NUM) % 100);
  92246. specials = {1, 2, 3, 5, 8, 9, 12, 20, 30, 40, 50, 60, 70, 80, 90};
  92247. ordinals = {"first", "second", "third", "fifth", "eighth", "ninth", "twelfth", "twentieth", "thirtieth", "fortieth", "fiftieth", "sixtieth", "seventieth", "eightieth", "ninetieth"};
  92248. if (i = (NUM in specials))
  92249. return hundreds + ordinals[i];
  92250. elseif ((NUM > 20) && (i = ((NUM % 10) in specials)))
  92251. return ((hundreds + this:english_tens((NUM / 10) * 10)) + "-") + ordinals[i];
  92252. else
  92253. return (hundreds + this:english_number(NUM)) + "th";
  92254. endif
  92255. else
  92256. return this:english_number(NUM) + "th";
  92257. endif
  92258. .
  92259. #20:29
  92260. NUM = args[1];
  92261. ones = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
  92262. return ones[NUM + 1];
  92263. .
  92264. #20:30
  92265. NUM = args[1];
  92266. teens = {"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"};
  92267. others = {"twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"};
  92268. if (NUM < 10)
  92269. return this:english_ones(NUM);
  92270. elseif (NUM < 20)
  92271. return teens[NUM - 9];
  92272. else
  92273. return (others[(NUM / 10) - 1] + ((NUM % 10) ? "-" | "")) + this:english_ones(NUM % 10);
  92274. endif
  92275. .
  92276. #20:31
  92277. "subst(string,{{redex1,repl1},{redex2,repl2},{redex3,repl3}...}[,case])";
  92278. "  => returns string with all instances of the strings redex<n> replaced respectively by the strings repl<n>.  If the optional argument `case' is given and nonzero, the search for instances of redex<n> is case sensitive.";
  92279. "  Substitutions are done in parallel, i.e., instances of redex<n> that appear in any of the replacement strings are ignored.  In the event that two redexes overlap, whichever is leftmost in `string' takes precedence.  For two redexes beginning at the same position, the longer one takes precedence.";
  92280. "";
  92281. "subst(\"hoahooaho\",{{\"ho\",\"XhooX\"},{\"hoo\",\"mama\"}}) => \"XhooXamamaaXhooX\"";
  92282. "subst(\"Cc: banana\",{{\"a\",\"b\"},{\"b\",\"c\"},{\"c\",\"a\"}},1) => \"Ca: cbnbnb\"";
  92283. if (typeof(ostr = args[1]) != STR)
  92284. return ostr;
  92285. endif
  92286. case = {@args, 0}[3];
  92287. len = length(ostr);
  92288. " - - - find the first instance of each substitution - -";
  92289. indices = {};
  92290. substs = {};
  92291. for s in (args[2])
  92292. if (i = index(ostr, s[1], case))
  92293. fi = ($list_utils:find_insert(indices, i = (i - len)) - 1);
  92294. while (fi && ((indices[fi] == i) && (length(substs[fi][1]) < length(s[1]))))
  92295. "...give preference to longer redexes...";
  92296. fi = (fi - 1);
  92297. endwhile
  92298. indices = listappend(indices, i, fi);
  92299. substs = listappend(substs, s, fi);
  92300. endif
  92301. endfor
  92302. "- - - - - perform substitutions - ";
  92303. nstr = "";
  92304. while (substs)
  92305. ind = (len + indices[1]);
  92306. sub = substs[1];
  92307. indices = listdelete(indices, 1);
  92308. substs = listdelete(substs, 1);
  92309. if (ind > 0)
  92310. nstr = ((nstr + ostr[1..ind - 1]) + sub[2]);
  92311. ostr = ostr[ind + length(sub[1])..len];
  92312. len = length(ostr);
  92313. endif
  92314. if (next = index(ostr, sub[1], case))
  92315. fi = ($list_utils:find_insert(indices, next = (next - len)) - 1);
  92316. while (fi && ((indices[fi] == next) && (length(substs[fi][1]) < length(sub[1]))))
  92317. "...give preference to longer redexes...";
  92318. fi = (fi - 1);
  92319. endwhile
  92320. indices = listappend(indices, next, fi);
  92321. substs = listappend(substs, sub, fi);
  92322. endif
  92323. endwhile
  92324. return nstr + ostr;
  92325. .
  92326. #20:32
  92327. "subst(string,{{redex1,repl1},{redex2,repl2},{redex3,repl3}...}[,case])";
  92328. "Just like :substitute() but it uses index_delimited() instead of index()";
  92329. if (typeof(ostr = args[1]) != STR)
  92330. return ostr;
  92331. endif
  92332. case = {@args, 0}[3];
  92333. len = length(ostr);
  92334. " - - - find the first instance of each substitution - -";
  92335. indices = {};
  92336. substs = {};
  92337. for s in (args[2])
  92338. if (i = this:index_delimited(ostr, s[1], case))
  92339. fi = ($list_utils:find_insert(indices, i = (i - len)) - 1);
  92340. while (fi && ((indices[fi] == i) && (length(substs[fi][1]) < length(s[1]))))
  92341. "...give preference to longer redexes...";
  92342. fi = (fi - 1);
  92343. endwhile
  92344. indices = listappend(indices, i, fi);
  92345. substs = listappend(substs, s, fi);
  92346. endif
  92347. endfor
  92348. "- - - - - perform substitutions - ";
  92349. nstr = "";
  92350. while (substs)
  92351. ind = (len + indices[1]);
  92352. sub = substs[1];
  92353. indices = listdelete(indices, 1);
  92354. substs = listdelete(substs, 1);
  92355. if (ind > 0)
  92356. nstr = ((nstr + ostr[1..ind - 1]) + sub[2]);
  92357. ostr = ostr[ind + length(sub[1])..len];
  92358. len = length(ostr);
  92359. endif
  92360. if (next = this:index_delimited(ostr, sub[1], case))
  92361. fi = ($list_utils:find_insert(indices, next = (next - len)) - 1);
  92362. while (fi && ((indices[fi] == next) && (length(substs[fi][1]) < length(sub[1]))))
  92363. "...give preference to longer redexes...";
  92364. fi = (fi - 1);
  92365. endwhile
  92366. indices = listappend(indices, next, fi);
  92367. substs = listappend(substs, sub, fi);
  92368. endif
  92369. endwhile
  92370. return nstr + ostr;
  92371. .
  92372. #20:33
  92373. "cap_property(what,prop[,ucase]) returns what.(prop) but capitalized if either ucase is true or the prop name specified is capitalized.";
  92374. "If prop is blank, returns what:title().";
  92375. "If prop is bogus or otherwise irretrievable, returns the error.";
  92376. "If capitalization is indicated, we return what.(prop+\"c\") if that exists, else we capitalize what.(prop) in the usual fashion.  There is a special exception for is_player(what)&&prop==\"name\" where we just return what.name if no .namec is provided --- ie., a player's .name is never capitalized in the usual fashion.";
  92377. "If args[1] is a list, calls itself on each element of the list and returns $string_utils:english_list(those results).";
  92378. set_task_perms(caller_perms());
  92379. if (typeof(what = args[1]) == LIST)
  92380. nargs = listdelete(args, 1);
  92381. result = {};
  92382. for who in (what)
  92383. result = {@result, this:_cap_property(who, @nargs)};
  92384. endfor
  92385. return $string_utils:english_list(result);
  92386. endif
  92387. prop = args[2];
  92388. ucase = ((prop && (strcmp(prop, "a") < 0)) || ((length(args) >= 3) && args[3]));
  92389. if (!prop)
  92390. return valid(what) ? ucase ? what:titlec() | what:title() | ((ucase ? "N" | "n") + "othing");
  92391. elseif ((!ucase) || (typeof(s = what.(prop + "c")) == ERR))
  92392. if (prop == "name")
  92393. s = (valid(what) ? what.name | "nothing");
  92394. ucase = (ucase && (!is_player(what)));
  92395. else
  92396. s = ($object_utils:has_property(what, prop) ? what.(prop) | $player.(prop));
  92397. endif
  92398. if ((((ucase && s) && (typeof(s) == STR)) && ((z = strcmp(s[1], "`")) < 27)) && (z > 0))
  92399. s = ("ABCDEFGHIJKLMNOPQRSTUVWXYZ"[z] + s[2..length(s)]);
  92400. endif
  92401. endif
  92402. return (typeof(s) == ERR) ? s | tostr(s);
  92403. .
  92404. #20:34
  92405. "Pronoun (and other things) substitution. See 'help pronouns' for details.";
  92406. "syntax:  $string_utils:pronoun_sub(text[,who[,thing[,location]]])";
  92407. "%s,%o,%p,%q,%r    => <who>'s pronouns.  <who> defaults to player.";
  92408. "%n,%d,%i,%t,%l,%% => <who>, dobj, iobj, <thing>, location and %";
  92409. "<thing> defaults to caller; <location> defaults to who.location";
  92410. "%S,%O,%P,%Q,%R, %N,%D,%I,%T,%L have corresponding capitalized substitutions.";
  92411. " %[#n], %[#d], ...  =>  <who>, dobj, etc.'s object number";
  92412. "%(foo) => <who>.foo and %(Foo) => <who>.foo capitalized. %[dfoo] => dobj.foo, etc..";
  92413. "%<foo> -> whatever <who> does when normal people foo. This is determined by calling :verb_sub() on the <who>.";
  92414. "%<d:foo> -> whatever <dobj> does when normal people foo.";
  92415. who = ((length(args) >= 2) ? args[2] | player);
  92416. thing = ((length(args) >= 3) ? args[3] | caller);
  92417. where = ((length(args) >= 4) ? args[4] | (valid(who) ? who.location | $nothing));
  92418. set_task_perms($no_one);
  92419. if (typeof(args[1]) == LIST)
  92420. plines = {};
  92421. for line in (args[1])
  92422. plines = {@plines, this:(verb)(line, who, thing, where)};
  92423. endfor
  92424. return plines;
  92425. endif
  92426. old = tostr(args[1]);
  92427. new = "";
  92428. objspec = "nditl";
  92429. objects = {who, (length(args) >= 5) ? args[5] | dobj, (length(args) >= 6) ? args[6] | iobj, thing, where};
  92430. prnspec = "sopqrSOPQR";
  92431. prprops = {"ps", "po", "pp", "pq", "pr", "Ps", "Po", "Pp", "Pq", "Pr"};
  92432. oldlen = length(old);
  92433. while ((prcnt = index(old, "%")) && (prcnt < oldlen))
  92434. s = old[k = (prcnt + 1)];
  92435. if ((s == "<") && (gt = index(old[k + 2..length(old)], ">")))
  92436. "handling %<verb> ";
  92437. gt = ((gt + k) + 1);
  92438. vb = old[k + 1..gt - 1];
  92439. vbs = who;
  92440. if ((length(vb) > 2) && (vb[2] == ":"))
  92441. " %<d:verb>";
  92442. vbs = objects[index(objspec, vb[1]) || 1];
  92443. vb = vb[3..length(vb)];
  92444. endif
  92445. vb = ($object_utils:has_verb(vbs, "verb_sub") ? vbs:verb_sub(vb) | this:(verb)(vb, vbs));
  92446. new = ((new + old[1..prcnt - 1]) + vb);
  92447. k = gt;
  92448. else
  92449. cp_args = {};
  92450. if (brace = index("([", s))
  92451. if (!(w = index(old[k + 1..oldlen], ")]"[brace])))
  92452. return new + old;
  92453. else
  92454. p = old[prcnt + 2..(k = (k + w)) - 1];
  92455. if (brace == 1)
  92456. "%(property)";
  92457. cp_args = {who, p};
  92458. elseif (p[1] == "#")
  92459. "%[#n] => object number";
  92460. s = ((o = index(objspec, p[2])) ? tostr(objects[o]) | (("[" + p) + "]"));
  92461. elseif (!(o = index(objspec, p[1])))
  92462. s = (("[" + p) + "]");
  92463. else
  92464. " %[dproperty] ";
  92465. cp_args = {objects[o], p[2..w - 1], strcmp(p[1], "a") < 0};
  92466. endif
  92467. endif
  92468. elseif (o = index(objspec, s))
  92469. cp_args = {objects[o], "", strcmp(s, "a") < 0};
  92470. elseif (w = index(prnspec, s, 1))
  92471. cp_args = {who, prprops[w]};
  92472. elseif (s == "#")
  92473. s = tostr(who);
  92474. elseif (s != "%")
  92475. s = ("%" + s);
  92476. endif
  92477. new = ((new + old[1..prcnt - 1]) + ((!cp_args) ? s | ((typeof(sub = $string_utils:_cap_property(@cp_args)) != ERR) ? sub | (("%(" + tostr(sub)) + ")"))));
  92478. endif
  92479. old = old[k + 1..oldlen];
  92480. oldlen = (oldlen - k);
  92481. endwhile
  92482. return new + old;
  92483. .
  92484. #20:35
  92485. "$string_utils:pronoun_sub_secure(string[,who[,thing[,location]]], default)";
  92486. "Do pronoun_sub on string with the arguments given (see help";
  92487. "string_utils:pronoun_sub for more information).  Return pronoun_subbed";
  92488. "<default> if the subbed string does not contain <who>.name (<who>";
  92489. "defaults to player).";
  92490. len = length(args);
  92491. who = ((len > 2) ? args[2] | player);
  92492. default = args[len];
  92493. result = this:pronoun_sub(@args[1..len - 1]);
  92494. return this:index_delimited(result, who.name) ? result | this:pronoun_sub(@{default, @args[2..len - 1]});
  92495. .
  92496. #20:36
  92497. " pronoun_quote(string) => quoted_string";
  92498. " pronoun_quote(list of strings) => list of quoted_strings";
  92499. " pronoun_quote(list of {key,string} pairs) => list of {key,quoted_string} pairs";
  92500. "";
  92501. "Here `quoted' means quoted in the sense of $string_utils:pronoun_sub, i.e., given a string X, the corresponding `quoted' string Y is such that pronoun_sub(Y) => X.  For example, pronoun_quote(\"--%Spam%--\") => \"--%%Spam%%--\".  This is for including literal text into a string that will eventually be pronoun_sub'ed, i.e., including it in such a way that the pronoun_sub will not expand anything in the included text.";
  92502. "";
  92503. "The 3rd form above (with {key,string} pairs) is for use with $string_utils:substitute().  If you have your own set of substitutions to be done in parallel with the pronoun substitutions, do";
  92504. "";
  92505. "  msg=$string_utils:substitute(msg,$string_utils:pronoun_quote(your_substs));";
  92506. "  msg=$string_utils:pronoun_sub(msg);";
  92507. if (typeof(what = args[1]) == STR)
  92508. return strsub(what, "%", "%%");
  92509. else
  92510. ret = {};
  92511. for w in (what)
  92512. if (typeof(w) == LIST)
  92513. ret = listappend(ret, listset(w, strsub(w[2], "%", "%%"), 2));
  92514. else
  92515. ret = listappend(ret, strsub(w, "%", "%%"));
  92516. endif
  92517. endfor
  92518. return ret;
  92519. endif
  92520. .
  92521. #20:37
  92522. "Pronoun (and other things) substitution. See 'help pronouns' for details.";
  92523. "syntax:  $string_utils:pronoun_sub(text[,who[,thing[,location]]])";
  92524. "%s,%o,%p,%q,%r    => <who>'s pronouns.  <who> defaults to player.";
  92525. "%n,%d,%i,%t,%l,%% => <who>, dobj, iobj, this, <who>.location and %";
  92526. "%S,%O,%P,%Q,%R, %N,%D,%I,%T,%L have corresponding capitalized substitutions.";
  92527. " %[#n], %[#d], ...  =>  <who>, dobj, etc.'s object number";
  92528. "%(foo) => <who>.foo and %(Foo) => <who>.foo capitalized. %[dfoo] => dobj.foo, etc..";
  92529. "%<foo> -> whatever <who> does when normal people foo. This is determined by calling :verb_sub() on the <who>.";
  92530. "%<d:foo> -> whatever <dobj> does when normal people foo.";
  92531. who = ((length(args) >= 2) ? args[2] | player);
  92532. thing = ((length(args) >= 3) ? args[3] | caller);
  92533. where = ((length(args) >= 4) ? args[4] | (valid(who) ? who.location | $nothing));
  92534. if (typeof(args[1]) == LIST)
  92535. plines = {};
  92536. for line in (args[1])
  92537. plines = {@plines, this:(verb)(line, who, thing, where)};
  92538. endfor
  92539. return plines;
  92540. endif
  92541. old = tostr(args[1]);
  92542. new = "";
  92543. objspec = "nditl";
  92544. objects = {who, dobj, iobj, thing, where};
  92545. prnspec = "sopqrSOPQR";
  92546. prprops = {"ps", "po", "pp", "pq", "pr", "Ps", "Po", "Pp", "Pq", "Pr"};
  92547. oldlen = length(old);
  92548. while ((prcnt = index(old, "%")) && (prcnt < oldlen))
  92549. s = old[k = (prcnt + 1)];
  92550. if ((s == "<") && (gt = index(old[k + 2..length(old)], ">")))
  92551. "handling %<verb> ";
  92552. gt = ((gt + k) + 1);
  92553. vb = old[k + 1..gt - 1];
  92554. vbs = who;
  92555. if ((length(vb) > 2) && (vb[2] == ":"))
  92556. " %<d:verb>";
  92557. vbs = objects[index(objspec, vb[1]) || 1];
  92558. vb = vb[3..length(vb)];
  92559. endif
  92560. vb = ($object_utils:has_verb(vbs, "verb_sub") ? vbs:verb_sub(vb) | this:(verb)(vb, vbs));
  92561. new = ((new + old[1..prcnt - 1]) + vb);
  92562. k = gt;
  92563. else
  92564. cp_args = {};
  92565. if (brace = index("([", s))
  92566. if (!(w = index(old[k + 1..oldlen], ")]"[brace])))
  92567. return new + old;
  92568. else
  92569. p = old[prcnt + 2..(k = (k + w)) - 1];
  92570. if (brace == 1)
  92571. "%(property)";
  92572. cp_args = {who, p};
  92573. elseif (p[1] == "#")
  92574. "%[#n] => object number";
  92575. s = ((o = index(objspec, p[2])) ? tostr(objects[o]) | (("[" + p) + "]"));
  92576. elseif (!(o = index(objspec, p[1])))
  92577. s = (("[" + p) + "]");
  92578. else
  92579. " %[dproperty] ";
  92580. cp_args = {objects[o], p[2..w - 1], strcmp(p[1], "a") < 0};
  92581. endif
  92582. endif
  92583. elseif (o = index(objspec, s))
  92584. cp_args = {objects[o], "", strcmp(s, "a") < 0};
  92585. elseif (w = index(prnspec, s, 1))
  92586. cp_args = {who, prprops[w]};
  92587. elseif (s == "#")
  92588. s = tostr(who);
  92589. elseif (s != "%")
  92590. s = ("%" + s);
  92591. endif
  92592. new = ((new + old[1..prcnt - 1]) + ((!cp_args) ? s | ((typeof(sub = $string_utils:_cap_property(@cp_args)) != ERR) ? sub | (("%(" + tostr(sub)) + ")"))));
  92593. endif
  92594. old = old[k + 1..oldlen];
  92595. oldlen = (oldlen - k);
  92596. endwhile
  92597. return new + old;
  92598. .
  92599. #20:38
  92600. " #0.string_utils:explode(subject [, break])";
  92601. " Return a list of those substrings of subject separated by runs of break[1].";
  92602. " break defaults to space.";
  92603. if (length(args) >= 2)
  92604. break = args[2][1];
  92605. else
  92606. break = " ";
  92607. endif
  92608. subject = (args[1] + break);
  92609. parts = {};
  92610. while (subject)
  92611. if ((i = index(subject, break)) > 1)
  92612. parts = {@parts, subject[1..i - 1]};
  92613. endif
  92614. subject = subject[i + 1..length(subject)];
  92615. endwhile
  92616. return parts;
  92617. .
  92618. #20:39
  92619. "This breaks up the argument string into words, the resulting list being obtained exactly the way the command line parser obtains `args' from `argstr'.";
  92620. rest = args[1];
  92621. "...trim leading blanks...";
  92622. rest[1..match(rest, "^ *")[2]] = "";
  92623. if (!rest)
  92624. return {};
  92625. endif
  92626. quote = 0;
  92627. toklist = {};
  92628. token = "";
  92629. pattern = " +%|\\.?%|\"";
  92630. while (m = match(rest, pattern))
  92631. "... find the next occurence of a special character, either";
  92632. "... a block of spaces, a quote or a backslash escape sequence...";
  92633. "notify(#4292,tostr(\"match(\",#20:print(rest),\",\",#20:print(pattern),\") => \",#20:print(m)))";
  92634. char = rest[m[1]];
  92635. token = (token + rest[1..m[1] - 1]);
  92636. if (char == " ")
  92637. toklist = {@toklist, token};
  92638. token = "";
  92639. elseif (char == "\"")
  92640. "... beginning or end of quoted string...";
  92641. "... within a quoted string spaces aren't special...";
  92642. pattern = ((quote = (!quote)) ? "\\.?%|\"" | " +%|\\.?%|\"");
  92643. elseif (m[1] < m[2])
  92644. "... char has to be a backslash...";
  92645. "... include next char literally if there is one";
  92646. token = (token + rest[m[2]]);
  92647. endif
  92648. rest[1..m[2]] = "";
  92649. endwhile
  92650. return (rest || (char != " ")) ? {@toklist, token + rest} | toklist;
  92651. .
  92652. #20:40
  92653. "This breaks up the argument string into words, returning a list of indices into argstr corresponding to the starting points of each of the arguments.";
  92654. rest = args[1];
  92655. "... find first nonspace...";
  92656. wstart = match(rest, "[^ ]%|$")[1];
  92657. wbefore = (wstart - 1);
  92658. rest[1..wbefore] = "";
  92659. if (!rest)
  92660. return {};
  92661. endif
  92662. quote = 0;
  92663. wslist = {};
  92664. pattern = " +%|\\.?%|\"";
  92665. while (m = match(rest, pattern))
  92666. "... find the next occurence of a special character, either";
  92667. "... a block of spaces, a quote or a backslash escape sequence...";
  92668. char = rest[m[1]];
  92669. if (char == " ")
  92670. wslist = {@wslist, {wstart, (wbefore + m[1]) - 1}};
  92671. wstart = ((wbefore + m[2]) + 1);
  92672. elseif (char == "\"")
  92673. "... beginning or end of quoted string...";
  92674. "... within a quoted string spaces aren't special...";
  92675. pattern = ((quote = (!quote)) ? "\\.?%|\"" | " +%|\\.?%|\"");
  92676. endif
  92677. rest[1..m[2]] = "";
  92678. wbefore = (wbefore + m[2]);
  92679. endwhile
  92680. return (rest || (char != " ")) ? {@wslist, {wstart, wbefore + length(rest)}} | wslist;
  92681. .
  92682. #20:41
  92683. ":to_value(string) tries to parse string as a value (i.e., object, number, string, error, or list thereof).";
  92684. "Returns {1,value} or {0,error_message} according as the attempt was successful or not.";
  92685. result = this:_tolist(string = (args[1] + "}"));
  92686. if (result[1] && (result[1] != $string_utils:space(result[1])))
  92687. return {0, tostr("after char ", length(string) - result[1], ":  ", result[2])};
  92688. elseif (typeof(result[1]) == NUM)
  92689. return {0, "missing } or \""};
  92690. elseif (length(result[2]) > 1)
  92691. return {0, "comma unexpected."};
  92692. elseif (result[2])
  92693. return {1, result[2][1]};
  92694. else
  92695. return {0, "missing expression"};
  92696. endif
  92697. .
  92698. #20:42
  92699. ":prefix_to_value(string) tries to parse string as a value (i.e., object, number, string, error, or list thereof).";
  92700. "Returns {rest-of-string,value} or {0,error_message} according as the attempt was successful or not.";
  92701. alen = length(args[1]);
  92702. slen = length(string = this:triml(args[1]));
  92703. if (!string)
  92704. return {0, "empty string"};
  92705. elseif (w = index("{\"", string[1]))
  92706. result = this:({"_tolist", "_unquote"}[w])(string[2..slen]);
  92707. if (typeof(result[1]) != NUM)
  92708. return result;
  92709. elseif (result[1] == 0)
  92710. return {0, "missing } or \""};
  92711. else
  92712. return {0, result[2], (alen - result[1]) + 1};
  92713. endif
  92714. else
  92715. thing = string[1..tlen = (index(string + " ", " ") - 1)];
  92716. if (typeof(s = this:_toscalar(thing)) != STR)
  92717. return {string[tlen + 1..slen], s};
  92718. else
  92719. return {0, s, (alen - slen) + 1};
  92720. endif
  92721. endif
  92722. .
  92723. #20:43
  92724. "_tolist(string) --- auxiliary for :to_value()";
  92725. rest = this:triml(args[1]);
  92726. vlist = {};
  92727. if (!rest)
  92728. return {0, {}};
  92729. elseif (rest[1] == "}")
  92730. return {rest[2..length(rest)], {}};
  92731. endif
  92732. while (1)
  92733. rlen = length(rest);
  92734. if (w = index("{\"", rest[1]))
  92735. result = this:({"_tolist", "_unquote"}[w])(rest[2..rlen]);
  92736. if (typeof(result[1]) == NUM)
  92737. return result;
  92738. endif
  92739. vlist = {@vlist, result[2]};
  92740. rest = result[1];
  92741. else
  92742. thing = rest[1..tlen = (min(index(rest + ",", ","), index(rest + "}", "}")) - 1)];
  92743. if (typeof(s = this:_toscalar(thing)) == STR)
  92744. return {rlen, s};
  92745. endif
  92746. vlist = {@vlist, s};
  92747. rest = rest[tlen + 1..rlen];
  92748. endif
  92749. if (!rest)
  92750. return {0, vlist};
  92751. elseif (rest[1] == "}")
  92752. return {rest[2..length(rest)], vlist};
  92753. elseif (rest[1] == ",")
  92754. rest = this:triml(rest[2..length(rest)]);
  92755. else
  92756. return {length(rest), ", or } expected"};
  92757. endif
  92758. endwhile
  92759. .
  92760. #20:44
  92761. "_unquote(string)   (auxiliary for :to_value())";
  92762. "reads string as if it were preceded by a quote, reading up to the closing quote if any, then returns the corresponding unquoted string.";
  92763. " => {0, string unquoted}  if there is no closing quote";
  92764. " => {original string beyond closing quote, string unquoted}  otherwise";
  92765. rest = args[1];
  92766. result = "";
  92767. while (m = match(rest, "\\.?%|\""))
  92768. "Find the next special character";
  92769. if (rest[pos = m[1]] == "\"")
  92770. return {rest[pos + 1..length(rest)], result + rest[1..pos - 1]};
  92771. endif
  92772. result = ((result + rest[1..pos - 1]) + rest[pos + 1..m[2]]);
  92773. rest = rest[m[2] + 1..length(rest)];
  92774. endwhile
  92775. return {0, result + rest};
  92776. .
  92777. #20:45
  92778. ":_toscalar(string)  --- auxiliary for :tovalue";
  92779. " => value if string represents a number, object or error";
  92780. " => string error message otherwise";
  92781. thing = args[1];
  92782. if (!thing)
  92783. return "missing value";
  92784. elseif (match(thing, "^#?[-+]?[0-9]+ *$"))
  92785. return (thing[1] == "#") ? toobj(thing) | tonum(thing);
  92786. elseif (thing[1] == "E")
  92787. return (e = $code_utils:toerr(thing)) ? tostr("unknown error code `", thing, "'") | e;
  92788. elseif (thing[1] == "#")
  92789. return tostr("bogus objectid `", thing, "'");
  92790. else
  92791. return tostr("`", thing[1], "' unexpected");
  92792. endif
  92793. .
  92794. #20:46
  92795. ":parse_command(cmd_line[,player])";
  92796. " => {verb, {dobj, dobjstr}, {prep, prepstr}, {iobj, iobjstr}, {args, argstr},";
  92797. "     dobjset, prepset, iobjset}";
  92798. "This mimics the action of the builtin parser, returning what the values of the builtin variables `verb', `dobj', `dobjstr', `prepstr', `iobj', `iobjstr', `args', and `argstr' would be if `player' had typed `cmd_line'.  ";
  92799. "`prep' is the shortened version of the preposition found.";
  92800. "";
  92801. "`dobjset' and `iobjset' are subsets of {\"any\",\"none\"} and are used to determine possible matching verbs, i.e., the matching verb must either be on `dobj' and have verb_args[1]==\"this\" or else it has verb_args[1] in `dobjset'; likewise for `iobjset' and verb_args[3]; similarly we must have verb_args[2] in `prepset'.";
  92802. c = args[1];
  92803. who = ((length(args) > 1) ? args[2] | player);
  92804. y = $string_utils:words(c);
  92805. if (y == {})
  92806. return {};
  92807. endif
  92808. vrb = y[1];
  92809. y = y[2..length(y)];
  92810. as = ((y == {}) ? "" | c[length(vrb) + 2..length(c)]);
  92811. n = 1;
  92812. while ((!(gp = $code_utils:get_prep(@y[n..length(y)]))[1]) && (n < length(y)))
  92813. n = (n + 1);
  92814. endwhile
  92815. "....";
  92816. really = player;
  92817. player = who;
  92818. loc = who.location;
  92819. if (ps = gp[1])
  92820. ds = $string_utils:from_list(y[1..n - 1], " ");
  92821. is = $string_utils:from_list(listdelete(gp, 1), " ");
  92822. io = (valid(loc) ? loc:match_object(is) | $string_utils:match_object(is, loc));
  92823. else
  92824. ds = $string_utils:from_list(y, " ");
  92825. is = "";
  92826. io = $nothing;
  92827. endif
  92828. do = (valid(loc) ? loc:match_object(ds) | $string_utils:match_object(ds, loc));
  92829. player = really;
  92830. "....";
  92831. dset = {"any", @(ds == "") ? {"none"} | {}};
  92832. "\"this\" must be handled manually.";
  92833. pset = {"any", @ps ? {$code_utils:full_prep(ps)} | {"none"}};
  92834. iset = {"any", @(is == "") ? {"none"} | {}};
  92835. return {vrb, {do, ds}, {$code_utils:short_prep(ps), ps}, {io, is}, {y, as}, {dset, pset, iset}};
  92836. .
  92837. #20:47
  92838. "$string_utils:from_value(value [, quote_strings = 0 [, list_depth = 1]])";
  92839. "Print the given value into a string.";
  92840. value = args[1];
  92841. if (length(args) < 2)
  92842. quote_strings = 0;
  92843. list_depth = 1;
  92844. else
  92845. quote_strings = args[2];
  92846. if (length(args) < 3)
  92847. list_depth = 1;
  92848. else
  92849. list_depth = args[3];
  92850. endif
  92851. endif
  92852. if (typeof(value) == LIST)
  92853. if (value)
  92854. if (list_depth)
  92855. result = ("{" + this:from_value(value[1], quote_strings, list_depth - 1));
  92856. for v in (listdelete(value, 1))
  92857. result = tostr(result, ", ", this:from_value(v, quote_strings, list_depth - 1));
  92858. endfor
  92859. return result + "}";
  92860. else
  92861. return "{...}";
  92862. endif
  92863. else
  92864. return "{}";
  92865. endif
  92866. elseif (quote_strings)
  92867. if (typeof(value) == STR)
  92868. result = "\"";
  92869. while (q = (index(value, "\"") || index(value, "\\")))
  92870. if (value[q] == "\"")
  92871. q = min(q, index(value + "\\", "\\"));
  92872. endif
  92873. result = (((result + value[1..q - 1]) + "\\") + value[q]);
  92874. value = value[q + 1..length(value)];
  92875. endwhile
  92876. return (result + value) + "\"";
  92877. elseif (typeof(value) == ERR)
  92878. return $code_utils:error_name(value);
  92879. else
  92880. return tostr(value);
  92881. endif
  92882. else
  92883. return tostr(value);
  92884. endif
  92885. .
  92886. #20:48
  92887. "$string_utils:print(value)";
  92888. "Print the given value into a string. == from_value(value,1,-1)";
  92889. value = args[1];
  92890. if (typeof(value) == LIST)
  92891. if (value)
  92892. result = ("{" + this:print(value[1]));
  92893. for val in (listdelete(value, 1))
  92894. result = tostr(result, ", ", this:print(val));
  92895. endfor
  92896. return result + "}";
  92897. else
  92898. return "{}";
  92899. endif
  92900. elseif (typeof(value) == STR)
  92901. result = "\"";
  92902. while (q = (index(value, "\"") || index(value, "\\")))
  92903. if (value[q] == "\"")
  92904. q = min(q, index(value + "\\", "\\"));
  92905. endif
  92906. result = (((result + value[1..q - 1]) + "\\") + value[q]);
  92907. value = value[q + 1..length(value)];
  92908. endwhile
  92909. return (result + value) + "\"";
  92910. elseif (typeof(value) == ERR)
  92911. return $code_utils:error_name(value);
  92912. else
  92913. return tostr(value);
  92914. endif
  92915. .
  92916. #20:49
  92917. "$string_utils:print_suspended(value)";
  92918. "Identical to $string_utils:print(value) except that we suspend where needed.";
  92919. set_task_perms(caller_perms());
  92920. value = args[1];
  92921. if (typeof(value) == LIST)
  92922. if (value)
  92923. result = ("{" + this:print_suspended(value[1]));
  92924. for val in (listdelete(value, 1))
  92925. result = tostr(result, ", ", this:print_suspended(val));
  92926. $command_utils:suspend_if_needed(0);
  92927. endfor
  92928. return result + "}";
  92929. else
  92930. return "{}";
  92931. endif
  92932. elseif (typeof(value) == STR)
  92933. result = "\"";
  92934. while (q = (index(value, "\"") || index(value, "\\")))
  92935. if (value[q] == "\"")
  92936. q = min(q, index(value + "\\", "\\"));
  92937. endif
  92938. result = tostr(result, value[1..q - 1], "\\", value[q]);
  92939. value = value[q + 1..length(value)];
  92940. $command_utils:suspend_if_needed(0);
  92941. endwhile
  92942. return (result + value) + "\"";
  92943. elseif (typeof(value) == ERR)
  92944. return $code_utils:error_name(value);
  92945. else
  92946. return tostr(value);
  92947. endif
  92948. .
  92949. #20:50
  92950. if ((len = length(args[1])) > 50)
  92951. return this:reverse(args[1][(len / 2) + 1..len]) + this:reverse(args[1][1..len / 2]);
  92952. endif
  92953. index = len;
  92954. result = "";
  92955. while (index > 0)
  92956. result = (result + args[1][index]);
  92957. index = (index - 1);
  92958. endwhile
  92959. return result;
  92960. .
  92961. #20:51
  92962. ":char_list(string) => string as a list of characters.";
  92963. "   e.g., :char_list(\"abad\") => {\"a\",\"b\",\"a\",\"d\"}";
  92964. if (30 < (len = length(string = args[1])))
  92965. return {@this:char_list(string[1..len / 2]), @this:char_list(string[(len / 2) + 1..len])};
  92966. else
  92967. l = {};
  92968. for c in [1..len]
  92969. l = {@l, string[c]};
  92970. endfor
  92971. return l;
  92972. endif
  92973. .
  92974. #20:52
  92975. ":regexp_quote(string)";
  92976. " => string with all of the regular expression special characters quoted with %";
  92977. string = args[1];
  92978. quoted = "";
  92979. while (m = rmatch(string, "[][$^.*+?].*"))
  92980. quoted = (("%" + string[m[1]..m[2]]) + quoted);
  92981. string = string[1..m[1] - 1];
  92982. endwhile
  92983. return string + quoted;
  92984. .
  92985. #20:53
  92986. "Takes the output from connection_name() and returns just the host string portion of it.  Assumes you are using bsd_network style connection names.";
  92987. s = args[1];
  92988. return s[rindex(s, " ") + 1..length(s)];
  92989. .
  92990. #20:54
  92991. "This is the function that should actually be called to get the host name from a connection name.  The archwizard should change _bsd so as to be calling the verb appropriate for his/her network interface.";
  92992. return this:connection_hostname_bsd(@args);
  92993. .
  92994. #20:55
  92995. "$string_utils:from_value(value [, quote_strings = 0 [, list_depth = 1]])";
  92996. "Print the given value into a string.";
  92997. set_task_perms(caller_perms());
  92998. value = args[1];
  92999. if (length(args) < 2)
  93000. quote_strings = 0;
  93001. list_depth = 1;
  93002. else
  93003. quote_strings = args[2];
  93004. if (length(args) < 3)
  93005. list_depth = 1;
  93006. else
  93007. list_depth = args[3];
  93008. endif
  93009. endif
  93010. if (typeof(value) == LIST)
  93011. if (value)
  93012. if (list_depth)
  93013. result = ("{" + this:from_value(value[1], quote_strings, list_depth - 1));
  93014. for v in (listdelete(value, 1))
  93015. $command_utils:suspend_if_needed(0);
  93016. result = tostr(result, ", ", this:from_value(v, quote_strings, list_depth - 1));
  93017. endfor
  93018. return result + "}";
  93019. else
  93020. return "{...}";
  93021. endif
  93022. else
  93023. return "{}";
  93024. endif
  93025. elseif (quote_strings)
  93026. if (typeof(value) == STR)
  93027. result = "\"";
  93028. while (q = (index(value, "\"") || index(value, "\\")))
  93029. $command_utils:suspend_if_needed(0);
  93030. if (value[q] == "\"")
  93031. q = min(q, index(value + "\\", "\\"));
  93032. endif
  93033. result = (((result + value[1..q - 1]) + "\\") + value[q]);
  93034. value = value[q + 1..length(value)];
  93035. endwhile
  93036. return (result + value) + "\"";
  93037. elseif (typeof(value) == ERR)
  93038. return $code_utils:error_name(value);
  93039. else
  93040. return tostr(value);
  93041. endif
  93042. else
  93043. return tostr(value);
  93044. endif
  93045. .
  93046. #20:56
  93047. ":end_expression(string[,stop_at])";
  93048. "  assumes string starts with an expression; returns the index of the last char in expression or 0 if string appears not to be an expression.  Expression ends at any character from stop_at which occurs at top level.";
  93049. string = args[1];
  93050. stop_at = {@args, " "}[2];
  93051. gone = 0;
  93052. paren_stack = "";
  93053. inquote = 0;
  93054. search = (top_level_search = (("[][{}()\"" + strsub(stop_at, "]", "")) + "]"));
  93055. paren_search = "[][{}()\"]";
  93056. while (m = match(string, search))
  93057. char = string[m[1]];
  93058. string[1..m[2]] = "";
  93059. gone = (gone + m[2]);
  93060. if (char == "\"")
  93061. "...skip over quoted string...";
  93062. char = "\\";
  93063. while (char == "\\")
  93064. if (!(m = match(string, "%(\\.?%|\"%)")))
  93065. return 0;
  93066. endif
  93067. char = string[m[1]];
  93068. string[1..m[2]] = "";
  93069. gone = (gone + m[2]);
  93070. endwhile
  93071. elseif (index("([{", char))
  93072. "... push parenthesis...";
  93073. paren_stack[1..0] = char;
  93074. search = paren_search;
  93075. elseif (i = index(")]}", char))
  93076. if (paren_stack && ("([{"[i] == paren_stack[1]))
  93077. "... pop parenthesis...";
  93078. paren_stack[1..1] = "";
  93079. search = (paren_stack ? paren_search | top_level_search);
  93080. else
  93081. "...parenthesis mismatch...";
  93082. return 0;
  93083. endif
  93084. else
  93085. "... stop character ...";
  93086. return gone - 1;
  93087. endif
  93088. endwhile
  93089. return (!paren_stack) && (gone + length(string));
  93090. .
  93091. #20:57
  93092. ":first_word(string) => {first word, rest of string} or {}";
  93093. rest = args[1];
  93094. "...trim leading blanks...";
  93095. rest[1..match(rest, "^ *")[2]] = "";
  93096. if (!rest)
  93097. return {};
  93098. endif
  93099. quote = 0;
  93100. token = "";
  93101. pattern = " +%|\\.?%|\"";
  93102. while (m = match(rest, pattern))
  93103. "... find the next occurence of a special character, either";
  93104. "... a block of spaces, a quote or a backslash escape sequence...";
  93105. char = rest[m[1]];
  93106. token = (token + rest[1..m[1] - 1]);
  93107. if (char == " ")
  93108. rest[1..m[2]] = "";
  93109. return {token, rest};
  93110. elseif (char == "\"")
  93111. "... beginning or end of quoted string...";
  93112. "... within a quoted string spaces aren't special...";
  93113. pattern = ((quote = (!quote)) ? "\\.?%|\"" | " +%|\\.?%|\"");
  93114. elseif (m[1] < m[2])
  93115. "... char has to be a backslash...";
  93116. "... include next char literally if there is one";
  93117. token = (token + rest[m[2]]);
  93118. endif
  93119. rest[1..m[2]] = "";
  93120. endwhile
  93121. return {token + rest, ""};
  93122. .
  93123. #20:58
  93124. ":common(first,second) => length of longest common prefix";
  93125. first = args[1];
  93126. second = args[2];
  93127. r = min(length(first), length(second));
  93128. l = 1;
  93129. while (r >= l)
  93130. h = ((r + l) / 2);
  93131. if (first[l..h] == second[l..h])
  93132. l = (h + 1);
  93133. else
  93134. r = (h - 1);
  93135. endif
  93136. endwhile
  93137. return r;
  93138. .
  93139. #20:59
  93140. "wr_utils:title_list/title_listc(<obj-list>[, @<args>)";
  93141. "Creates an english list out of the titles of the objects in <obj-list>.  Optional <args> are passed on to $string_utils:english_list.";
  93142. "title_listc uses :titlec() for the first item.";
  93143. titles = $list_utils:map_verb(args[1], "title");
  93144. if (verb[length(verb)] == "c")
  93145. if (titles)
  93146. titles[1] = args[1][1]:titlec();
  93147. elseif (length(args) > 1)
  93148. args[2] = $string_utils:capitalize(args[2]);
  93149. else
  93150. args = listappend(args, "Nothing");
  93151. endif
  93152. endif
  93153. return $string_utils:english_list(titles, @args[2..length(args)]);
  93154. .
  93155. #20:60
  93156. "name_and_number(object [,sepr]) => \"ObjectName (#object)\"";
  93157. "Return name and number for object. Second argument is optional separator (for those who want no space, use \"\")";
  93158. what = args[1];
  93159. sepr = ((length(args) > 1) ? args[2] | " ");
  93160. name = (valid(what) ? what.name | {"<invalid>", "$nothing", "$ambiguous_match", "$failed_match"}[1 + (what in {#-1, #-2, #-3})]);
  93161. return tostr(name, sepr, "(", what, ")");
  93162. .
  93163. #20:61
  93164. "Copied from WhiteRabbit's utilities (#4445):name_and_number_list by WhiteRabbit (#3685) Sun Dec  6 14:00:35 1992 PST";
  93165. "name_and_number_list(<list>[, @<args>])";
  93166. "<list> is a list of objects; an english list will be constructed of their names and numbers in the form \"Munchkin (#xxx)\".  <args> are the same as the optional args to $string_utils:english_list.";
  93167. return $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%[#n])", args[1]), @args[2..length(args)]);
  93168. .
  93169. #20:62
  93170. "Copied from string utilities (#20):columnize by Rog (#4292) Sun Dec 20 22:59:33 1992 PST";
  93171. "columnize (items, n [, width]) - Turn a one-column list of items into an n-column list. 'width' is the last character position that may be occupied; it defaults to a standard screen width. Example: To tell the player a list of numbers in three columns, do 'player:tell_lines ($string_utils:columnize ({1, 2, 3, 4, 5, 6, 7}, 3));'.";
  93172. items = args[1];
  93173. n = args[2];
  93174. width = ((length(args) >= 3) ? args[3] | 79);
  93175. height = (((length(items) + n) - 1) / n);
  93176. items = {@items, @$list_utils:make((height * n) - length(items), "")};
  93177. colwidths = {};
  93178. for col in [1..n - 1]
  93179. colwidths = listappend(colwidths, 1 - (((width + 1) * col) / n));
  93180. endfor
  93181. result = {};
  93182. for row in [1..height]
  93183. line = tostr(items[row]);
  93184. for col in [1..n - 1]
  93185. line = tostr(this:left(line, colwidths[col]), " ", items[row + (col * height)]);
  93186. endfor
  93187. $command_utils:suspend_if_needed(0);
  93188. result = listappend(result, line[1..min(length(line), width)]);
  93189. endfor
  93190. return result;
  93191. .
  93192. #20:63
  93193. ":a_or_an(<noun>) => \"a\" or \"an\"";
  93194. "To accomodate personal variation (e.g., \"an historical book\"), a player can override this by having a personal a_or_an verb.  If that verb returns 0 instead of a string, the standard algorithm is used.";
  93195. noun = args[1];
  93196. if ($object_utils:has_verb(player, "a_or_an") && ((custom_result = player:a_or_an(noun)) != 0))
  93197. return custom_result;
  93198. endif
  93199. if (noun in this.use_article_a)
  93200. return "a";
  93201. endif
  93202. if (noun in this.use_article_an)
  93203. return "an";
  93204. endif
  93205. a_or_an = "a";
  93206. if (noun != "")
  93207. if (index("aeiou", noun[1]))
  93208. a_or_an = "an";
  93209. "unicycle, unimplemented, union, united, unimpressed, unique";
  93210. if ((((noun[1] == "u") && (length(noun) > 2)) && (noun[2] == "n")) && ((index("aeiou", noun[3]) == 0) || (((noun[3] == "i") && (length(noun) > 3)) && (index("aeioubcghqwyz", noun[4]) || ((length(noun) > 4) && index("eiy", noun[5]))))))
  93211. a_or_an = "a";
  93212. endif
  93213. endif
  93214. endif
  93215. return a_or_an;
  93216. "Ported by Mickey with minor tweaks from a Moo far far away.";
  93217. "Last modified Sun Aug  1 22:53:07 1993 EDT by BabyBriar (#2).";
  93218. .
  93219. #21:0
  93220. "make_exit(spec, source, dest,[really-create-or-recycle])";
  93221. "Uses $recycler by default; supplying really-create as 0 suppresses this.";
  93222. "Returns the object number as a list if successful, 0 if not.";
  93223. set_task_perms(caller_perms());
  93224. spec = args[1];
  93225. source = args[2];
  93226. dest = args[3];
  93227. if (length(args) > 3)
  93228. recreate_enabled = args[4];
  93229. else
  93230. recreate_enabled = 1;
  93231. endif
  93232. if (recreate_enabled)
  93233. exit = $recycler:_create($exit);
  93234. else
  93235. exit = create($exit);
  93236. endif
  93237. if (typeof(exit) == ERR)
  93238. player:tell(exit);
  93239. return;
  93240. endif
  93241. $building_utils:set_names(exit, spec);
  93242. exit.source = source;
  93243. exit.dest = dest;
  93244. source_ok = source:add_exit(exit);
  93245. dest_ok = dest:add_entrance(exit);
  93246. move(exit, $nothing);
  93247. via = $string_utils:from_value(setadd(exit.aliases, exit.name), 1);
  93248. if (source_ok)
  93249. player:tell("Exit from ", source.name, " (", source, ") to ", dest.name, " (", dest, ") via ", via, " created with id ", exit, ".");
  93250. if (!dest_ok)
  93251. player:tell("However, I couldn't add ", exit, " as a legal entrance to ", dest.name, ".  You may have to get its owner, ", dest.owner.name, " to add it for you.");
  93252. endif
  93253. return {exit};
  93254. elseif (dest_ok)
  93255. player:tell("Exit to ", dest.name, " (", dest, ") via ", via, " created with id ", exit, ".  However, I couldn't add ", exit, " as a legal exit from ", source.name, ".  Get its owner, ", source.owner.name, " to add it for you.");
  93256. return {exit};
  93257. elseif (0)
  93258. "I considered using this for awhile. -- Lambda";
  93259. player:tell("Exit to ", dest.name, " (", dest, ") via ", via, " created with id ", exit, ".  However, I couldn't add ", exit, " as EITHER a legal exit from ", source.name, " OR as a legal entrance to ", dest.name, ".  Get their owners, ", source.owner.name, " and ", dest.owner.name, ", respectively, to add it for you.");
  93260. return 0;
  93261. else
  93262. if (recreate_enabled)
  93263. $recycler:_recycle(exit);
  93264. else
  93265. recycle(exit);
  93266. endif
  93267. player:tell("I couldn't add a new exit as EITHER a legal exit from ", source.name, " OR as a legal entrance to ", dest.name, ".  Get their owners, ", source.owner.name, " and ", dest.owner.name, ", respectively, to add it for you.");
  93268. return 0;
  93269. endif
  93270. .
  93271. #21:1
  93272. "$building_utils:set_names(object, spec)";
  93273. set_task_perms(caller_perms());
  93274. object = args[1];
  93275. names = this:parse_names(args[2]);
  93276. name = (names[1] || object.name);
  93277. return object:set_name(name) && object:set_aliases(names[2]);
  93278. .
  93279. #21:2
  93280. ":recreate(object,newparent) -- effectively recycle and recreate the specified object as a child of parent.  Returns true if successful.";
  93281. object = args[1];
  93282. parent = args[2];
  93283. who = caller_perms();
  93284. if (!(valid(object) && valid(parent)))
  93285. return E_INVARG;
  93286. elseif (who.wizard)
  93287. "no problemo";
  93288. elseif ((who != object.owner) || ((who != parent.owner) && (!parent.f)))
  93289. return E_PERM;
  93290. endif
  93291. "Chparent any children to their grandparent instead of orphaning them horribly.  Have to do the chparent with wizperms, in case the children are owned by others, so do this before set_task_perms.";
  93292. for c in (children(object))
  93293. chparent(c, parent(object));
  93294. endfor
  93295. set_task_perms(who);
  93296. if ($object_utils:has_callable_verb(object, "recycle"))
  93297. object:recycle();
  93298. endif
  93299. chparent(object, #-1);
  93300. for p in (properties(object))
  93301. delete_property(object, p);
  93302. endfor
  93303. for v in (verbs(object))
  93304. delete_verb(object, "0");
  93305. endfor
  93306. for item in (object.contents)
  93307. move(item, #-1);
  93308. endfor
  93309. chparent(object, parent);
  93310. object.name = "";
  93311. if ($object_utils:has_verb(parent, "initialize"))
  93312. object:initialize();
  93313. endif
  93314. object.r = 0;
  93315. object.f = 0;
  93316. object.w = 0;
  93317. return 1;
  93318. .
  93319. #21:3
  93320. "transfer_ownership(object, oldowner, newowner)";
  93321. "Transfer ownership of object from oldowner to newowner.";
  93322. if (!((caller == this) || caller_perms().wizard))
  93323. return E_PERM;
  93324. endif
  93325. what = args[1];
  93326. if (valid(from = args[2]) && (typeof(from.owned_objects) == LIST))
  93327. from.owned_objects = setremove(from.owned_objects, what);
  93328. endif
  93329. if (valid(to = args[3]) && (typeof(from.owned_objects) == LIST))
  93330. to.owned_objects = setadd(to.owned_objects, what);
  93331. $wiz_utils:set_owner(what, to);
  93332. endif
  93333. .
  93334. #21:4
  93335. "$building_utils:parse_names(spec)";
  93336. "Return {name, {alias, alias, ...}} from name,alias,alias or name:alias,alias";
  93337. spec = args[1];
  93338. if (!(colon = index(spec, ":")))
  93339. aliases = $string_utils:explode(spec, ",");
  93340. name = aliases[1];
  93341. else
  93342. aliases = $string_utils:explode(spec[colon + 1..length(spec)], ",");
  93343. name = spec[1..colon - 1];
  93344. endif
  93345. return {name, $list_utils:map_arg($string_utils, "trim", aliases)};
  93346. .
  93347. #22:0
  93348. if ($code_utils:parse_verbref(what = args[1]))
  93349. "... hey wow, I found it!...";
  93350. return {what};
  93351. else
  93352. return {};
  93353. endif
  93354. .
  93355. #22:1
  93356. "Help facility for verbs that people have bothered to document.  If the argument is a verb specification, this retrieves the code and prints any documentation lines that might be at the beginning.  Returns true if the arg can actually be interpreted as a verb specification, whether or not it is a correct one.";
  93357. set_task_perms(caller_perms());
  93358. if (!(spec = $code_utils:parse_verbref(args[1])))
  93359. return 0;
  93360. elseif ($command_utils:object_match_failed(object = $string_utils:match_object(spec[1], player.location), spec[1]))
  93361. return 1;
  93362. elseif (!(hv = $object_utils:has_verb(object, spec[2])))
  93363. return "That object does not define that verb.";
  93364. elseif (typeof(verbdoc = $code_utils:verb_documentation(object = hv[1], spec[2])) == ERR)
  93365. return tostr(verbdoc);
  93366. elseif (typeof(info = verb_info(object, spec[2])) == ERR)
  93367. return tostr(info);
  93368. else
  93369. objverb = tostr(object.name, "(", object, "):", strsub(info[3], " ", "/"));
  93370. if (verbdoc)
  93371. return {tostr("Information about ", objverb), "----", @verbdoc};
  93372. else
  93373. return tostr("No information about ", objverb);
  93374. endif
  93375. endif
  93376. .
  93377. #22:2
  93378. set_task_perms(caller_perms());
  93379. if (!(spec = $code_utils:parse_verbref(args[1])))
  93380. return E_INVARG;
  93381. elseif ($command_utils:object_match_failed(object = $string_utils:match_object(spec[1], player.location), spec[1]))
  93382. return E_INVARG;
  93383. elseif (!(hv = $object_utils:has_verb(object, spec[2])))
  93384. return E_VERBNF;
  93385. elseif (typeof(vd = $code_utils:verb_documentation(hv[1], spec[2])) != LIST)
  93386. return vd;
  93387. else
  93388. return {tostr(";$code_utils:set_verb_documentation(", $code_utils:corify_object(hv[1]), ",", $string_utils:print(spec[2]), ",$command_utils:read_lines())"), @$command_utils:dump_lines(vd)};
  93389. endif
  93390. .
  93391. #23:0
  93392. if (!args)
  93393. l = {};
  93394. for p in (properties(#0))
  93395. if ((p[max(1, length(p) - 5)..length(p)] == "_utils") && #0.(p).description)
  93396. l = {@l, "$" + p};
  93397. endif
  93398. endfor
  93399. return {@pass(@args), @l};
  93400. elseif (ts = pass(@args))
  93401. return ts;
  93402. elseif ((what = args[1])[1] != "$")
  93403. return {};
  93404. elseif (ts = pass("$generic_" + what[2..length(what)]))
  93405. return ts;
  93406. elseif ((r = rindex(w = strsub(what[2..length(what)], "-", "_"), "_utils")) && ((r == (length(w) - 5)) && (valid(#0.(w)) && #0.(w).description)))
  93407. return {what};
  93408. else
  93409. return {};
  93410. endif
  93411. .
  93412. #23:1
  93413. topic = args[1];
  93414. if ((topic == (("$" + topic[2..length(topic) - 5]) + "utils")) && (valid(#0.(w = strsub(topic[2..length(topic)], "-", "_"))) && (uhelp = #0.(w):description())))
  93415. return {tostr("General information on $", w, ":"), "----", @uhelp};
  93416. else
  93417. return pass(@args);
  93418. endif
  93419. .
  93420. #23:2
  93421. if ((E_PROPNF != (text = pass(@args))) || ((args[1][1] != "$") || ((!((uprop = args[1][2..length(args[1])]) in properties(#0))) || (typeof(uobj = #0.(uprop)) != OBJ))))
  93422. return text;
  93423. else
  93424. udesc = uobj.description;
  93425. return {tostr(";;$", uprop, ".description = $command_utils:read_lines()"), @$command_utils:dump_lines((typeof(udesc) == LIST) ? udesc | {udesc})};
  93426. endif
  93427. .
  93428. #24:0
  93429. text = args[1];
  93430. for i in [1..length($code_utils.error_list)]
  93431. text = {@text, tostr("    ", $string_utils:left($code_utils.error_names[i], 15), $code_utils.error_list[i])};
  93432. endfor
  93433. return text;
  93434. .
  93435. #24:1
  93436. text = args[1];
  93437. for p in ($code_utils:prepositions())
  93438. text = {@text, tostr($string_utils:space(4), p)};
  93439. endfor
  93440. return text;
  93441. .
  93442. #26:0
  93443. ":set_programmer(victim[,mail from])  => 1 or error.";
  93444. "Sets victim.programmer, chparents victim to $prog if necessary, and sends mail to $new_prog_log, mail is from optional second arg or caller_perms().";
  93445. whodunnit = caller_perms();
  93446. mailfrom = ((length(args) == 2) ? args[2] | whodunnit);
  93447. if (!whodunnit.wizard)
  93448. return E_PERM;
  93449. elseif (!(valid(victim = args[1]) && (is_player(victim) && $object_utils:isa(victim, $player))))
  93450. return E_INVARG;
  93451. elseif (victim.programmer)
  93452. return E_NONE;
  93453. elseif (typeof(e = (victim.programmer = 1)) == ERR)
  93454. return e;
  93455. else
  93456. oldquota = victim.ownership_quota;
  93457. if (!$object_utils:isa(victim, $prog))
  93458. if (typeof(e = chparent(victim, $prog)) == ERR)
  93459. "...this isn't really supposed to happen but it could...";
  93460. player:notify(tostr("chparent(", victim, ",", $prog, ") failed:  ", e));
  93461. player:notify("Check for common properties.");
  93462. endif
  93463. else
  93464. player:notify(tostr(victim.name, " was already a child of ", parent(victim).name, " (", parent(victim), ")"));
  93465. endif
  93466. victim.ownership_quota = (oldquota + ($prog.ownership_quota - $player_class.ownership_quota));
  93467. $mail_agent:send_message(mailfrom, {$new_prog_log, victim}, tostr("@programmer ", victim.name, " (", victim, ")"), tostr("I just gave ", victim.name, " a programmer bit."));
  93468. return 1;
  93469. endif
  93470. .
  93471. #26:1
  93472. ":set_player(victim[,nochown]) => 1 or error";
  93473. "Set victim's player flag, (maybe) chown to itself, add name and aliases to $player_db.";
  93474. " E_NONE == already a player,";
  93475. " E_NACC == player_db is frozen,";
  93476. " E_RECMOVE == name is unavailable";
  93477. if (!caller_perms().wizard)
  93478. return E_PERM;
  93479. elseif (!(valid(victim = args[1]) && $object_utils:isa(victim, $player)))
  93480. return E_INVARG;
  93481. elseif (is_player(victim))
  93482. return E_NONE;
  93483. elseif ($player_db.frozen)
  93484. return E_NACC;
  93485. elseif (!$player_db:available(name = victim.name))
  93486. return E_RECMOVE;
  93487. else
  93488. set_player_flag(victim, 1);
  93489. if ($object_utils:isa(victim, $prog))
  93490. victim.programmer = 1;
  93491. else
  93492. victim.programmer = $player.programmer;
  93493. endif
  93494. if (!{@args, 0}[2])
  93495. $wiz_utils:set_owner(victim, victim);
  93496. endif
  93497. $player_db:insert(name, victim);
  93498. for a in (setremove(aliases = victim.aliases, name))
  93499. if (index(a, " "))
  93500. "..ignore ..";
  93501. elseif ($player_db:available(a) in {this, 1})
  93502. $player_db:insert(a, victim);
  93503. else
  93504. aliases = setremove(aliases, a);
  93505. endif
  93506. endfor
  93507. victim.aliases = setadd(aliases, name);
  93508. return 1;
  93509. endif
  93510. .
  93511. #26:2
  93512. ":set_owner(object,newowner[,suspendok])  does object.owner=newowner, taking care of c properties as well.  This should be used anyplace one is contemplating doing object.owner=newowner, since the latter leaves ownership of c properties unchanged.  (--Rog thinks this is a server bug).";
  93513. if (!valid(object = args[1]))
  93514. return E_INVIND;
  93515. elseif (!caller_perms().wizard)
  93516. return E_PERM;
  93517. elseif (!(valid(newowner = args[2]) && is_player(newowner)))
  93518. return E_INVARG;
  93519. endif
  93520. suspendok = {@args, 0}[3];
  93521. oldowner = object.owner;
  93522. object.owner = newowner;
  93523. for pname in ($object_utils:all_properties(object))
  93524. if (suspendok && ((ticks_left() < 5000) || (seconds_left() < 2)))
  93525. suspend(0);
  93526. endif
  93527. perms = property_info(object, pname)[2];
  93528. if (index(perms, "c"))
  93529. set_property_info(object, pname, {newowner, perms});
  93530. endif
  93531. endfor
  93532. if ($object_utils:isa(oldowner, $player))
  93533. if (is_player(oldowner) && (object != oldowner))
  93534. oldowner.ownership_quota = (oldowner.ownership_quota + 1);
  93535. endif
  93536. if (typeof(oldowner.owned_objects) == LIST)
  93537. oldowner.owned_objects = setremove(oldowner.owned_objects, object);
  93538. endif
  93539. endif
  93540. if ($object_utils:isa(newowner, $player))
  93541. if (object != newowner)
  93542. newowner.ownership_quota = (newowner.ownership_quota - 1);
  93543. endif
  93544. if (typeof(newowner.owned_objects) == LIST)
  93545. newowner.owned_objects = setadd(newowner.owned_objects, object);
  93546. endif
  93547. endif
  93548. return 1;
  93549. .
  93550. #26:3
  93551. ":set_property_owner(object,prop,newowner[,suspendok])  changes the ownership of object.prop to newowner.  If the property is !c, changes the ownership on all of the descendents as well.  Otherwise, we just chown the property on the object itself and give a warning if newowner!=object.owner (--Rog thinks this is a server bug that one is able to do this at all...).";
  93552. if (!caller_perms().wizard)
  93553. return E_PERM;
  93554. elseif (!(info = property_info(object = args[1], pname = args[2])))
  93555. "... handles E_PROPNF and invalid object errors...";
  93556. return info;
  93557. elseif (!is_player(newowner = args[3]))
  93558. return E_INVARG;
  93559. elseif (index(info[2], "c"))
  93560. if ({@args, 0}[4] / 2)
  93561. "...(recursive call)...";
  93562. "...child property is +c while parent is -c??...RUN AWAY!!";
  93563. return E_NONE;
  93564. else
  93565. set_property_info(object, pname, listset(info, newowner, 1));
  93566. return (newowner == object.owner) || E_NONE;
  93567. endif
  93568. else
  93569. set_property_info(object, pname, listset(info, newowner, 1));
  93570. if ((suspendok = ({@args, 0}[4] % 2)) && ((ticks_left() < 10000) || (seconds_left() < 2)))
  93571. suspend(0);
  93572. endif
  93573. suspendok = (2 + suspendok);
  93574. for c in (children(object))
  93575. this:set_property_owner(c, pname, newowner, suspendok);
  93576. endfor
  93577. return 1;
  93578. endif
  93579. .
  93580. #26:4
  93581. ":unset_player(victim[,newowner])  => 1 or error";
  93582. "Reset victim's player flag, chown victim to newowner (if given), remove all of victim's names and aliases from $player_db.";
  93583. if (!caller_perms().wizard)
  93584. return E_PERM;
  93585. elseif (!valid(victim = args[1]))
  93586. return E_INVARG;
  93587. elseif (!is_player(victim))
  93588. return E_NONE;
  93589. endif
  93590. if (length(args) >= 2)
  93591. $wiz_utils:set_owner(victim, args[2]);
  93592. endif
  93593. victim.programmer = 0;
  93594. victim.wizard = 0;
  93595. set_player_flag(victim, 0);
  93596. if ($player_db.frozen)
  93597. player:tell("Warning:  player_db is in the middle of a :load().");
  93598. endif
  93599. $player_db:delete2(victim.name, victim);
  93600. for a in (victim.aliases)
  93601. $player_db:delete2(a, victim);
  93602. endfor
  93603. return 1;
  93604. .
  93605. #26:5
  93606. ":set_property_flags(object,prop,flags[,suspendok])  changes the permissions on object.prop to flags.  Unlike a mere set_property_info, this changes the flags on all descendant objects as well.  We also change the ownership on the descendent properties where necessary.";
  93607. object = args[1];
  93608. pname = args[2];
  93609. flags = args[3];
  93610. suspendok = {@args, 0}[4];
  93611. perms = caller_perms();
  93612. if (!(info = property_info(object, pname)))
  93613. "... handles E_PROPNF and invalid object errors...";
  93614. return info;
  93615. elseif ($set_utils:difference($string_utils:char_list(flags), {"r", "w", "c"}))
  93616. "...not r, w, or c?...";
  93617. return E_INVARG;
  93618. elseif ((pinfo = property_info(parent(object), pname)) && (flags != pinfo[2]))
  93619. "... property doesn't actually live here...";
  93620. "... only allowed to correct so that this property matches parent...";
  93621. return E_INVARG;
  93622. elseif (!(perms.wizard || (info[1] == perms)))
  93623. "... you have to own the property...";
  93624. return E_PERM;
  93625. elseif (!(((!(c = index(flags, "c"))) == (!index(info[2], "c"))) || $perm_utils:controls(perms, object)))
  93626. "... if you're changing the c flag, you have to own the object...";
  93627. return E_PERM;
  93628. else
  93629. if (c)
  93630. set_property_info(object, pname, {object.owner, kflags = flags});
  93631. else
  93632. set_property_info(object, pname, kflags = listset(info, flags, 2));
  93633. endif
  93634. for kid in (children(object))
  93635. this:_set_property_flags(kid, pname, kflags, suspendok);
  93636. endfor
  93637. return 1;
  93638. endif
  93639. .
  93640. #26:6
  93641. "_set_property_flags(object, pname, {owner, flags} or something+\"c\", suspendok)";
  93642. "auxiliary to :set_property_flags... don't call this directly.";
  93643. if (caller != this)
  93644. return E_PERM;
  93645. endif
  93646. if (args[4] && $command_utils:running_out_of_time(0))
  93647. suspend(0);
  93648. endif
  93649. object = args[1];
  93650. if (typeof(args[3]) != LIST)
  93651. set_property_info(object, args[2], {object.owner, args[3]});
  93652. else
  93653. set_property_info(@args[1..3]);
  93654. endif
  93655. for kid in (children(object))
  93656. this:_set_property_flags(@listset(args, kid, 1));
  93657. endfor
  93658. .
  93659. #26:7
  93660. "Generate a random password of length args[1].  Alternates vowels and consonants, for maximum pronounceability.  Uses its own list of consonants which exclude F and C and K to prevent generating obscene sounding passwords.";
  93661. vowels = "aeiouy";
  93662. consonants = "bdghjlmnpqrstvwxz";
  93663. len = tonum(args[1]);
  93664. if (len)
  93665. alt = (random(2) - 1);
  93666. s = "";
  93667. for i in [1..len]
  93668. s = (s + (alt ? vowels[random(6)] | consonants[random(17)]));
  93669. alt = (!alt);
  93670. endfor
  93671. return s;
  93672. else
  93673. return E_INVARG;
  93674. endif
  93675. .
  93676. #26:8
  93677. ":queued_tasks(player) => list of queued tasks for that player.";
  93678. "shouldn't the server builtin should work this way?  oh well";
  93679. set_task_perms(caller_perms());
  93680. if (typeof(e = set_task_perms(who = args[1])) == ERR)
  93681. return e;
  93682. elseif (who.wizard)
  93683. tasks = {};
  93684. for t in (queued_tasks())
  93685. if (t[5] == who)
  93686. tasks = {@tasks, t};
  93687. endif
  93688. endfor
  93689. return tasks;
  93690. else
  93691. return queued_tasks();
  93692. endif
  93693. .
  93694. #26:10
  93695. "Return 1 if args[1] is a newted player.  0 if not, or if some error.  Maybe should do better in the error case.  Feel free :-)";
  93696. if (!caller_perms().wizard)
  93697. return E_PERM;
  93698. else
  93699. "return verb_code($wiz_utils, \"newt_confunc\") == verb_code(args[1], \"confunc\")";
  93700. return verb_info(args[1], "confunc")[1].wizard && (!args[1].wizard);
  93701. endif
  93702. .
  93703. #26:11
  93704. player:notify_lines({"", $login:newt_registration_string(), ""});
  93705. set_task_perms(this);
  93706. boot_player(player);
  93707. .
  93708. #26:12
  93709. if (!caller_perms().wizard)
  93710. return E_PERM;
  93711. else
  93712. player:tell("Beginning initialize_owned:  ", ctime());
  93713. for n in [0..tonum(max_object())]
  93714. o = toobj(n);
  93715. if (valid(o))
  93716. if ($object_utils:isa(owner = o.owner, $player) && (typeof(owner.owned_objects) == LIST))
  93717. owner.owned_objects = setadd(owner.owned_objects, o);
  93718. endif
  93719. endif
  93720. $command_utils:suspend_if_needed(0);
  93721. endfor
  93722. player:tell("Done adding, beginning verification pass.");
  93723. this:verify_owned_objects();
  93724. player:tell("Finished:  ", ctime());
  93725. endif
  93726. .
  93727. #26:13
  93728. if (!caller_perms().wizard)
  93729. return E_PERM;
  93730. else
  93731. for p in (players())
  93732. if (typeof(p.owned_objects) == LIST)
  93733. for o in (p.owned_objects)
  93734. if (((typeof(o) != OBJ) || (!valid(o))) || (o.owner != p))
  93735. p.owned_objects = setremove(p.owned_objects, o);
  93736. if (((typeof(o) == OBJ) && valid(o)) && (typeof(o.owner.owned_objects) == LIST))
  93737. o.owner.owned_objects = setadd(o.owner.owned_objects, o);
  93738. endif
  93739. endif
  93740. $command_utils:suspend_if_needed(0);
  93741. endfor
  93742. endif
  93743. endfor
  93744. endif
  93745. .
  93746. #26:14
  93747. ":connected_wizards() => list of currently connected wizards and players mentioned in .public_identity properties as being wizard counterparts.";
  93748. wizzes = $object_utils:leaves($wiz);
  93749. wlist = {};
  93750. for w in (wizzes)
  93751. if (w.wizard)
  93752. if (connected_seconds(w))
  93753. wlist = setadd(wlist, w);
  93754. endif
  93755. if (connected_seconds(w.public_identity))
  93756. wlist = setadd(wlist, w.public_identity);
  93757. endif
  93758. endif
  93759. endfor
  93760. return wlist;
  93761. .
  93762. #26:15
  93763. ":all_wizards() => list of all wizards and players mentioned in .public_identity properties as being wizard counterparts.";
  93764. wizzes = $object_utils:leaves($wiz);
  93765. wlist = {};
  93766. for w in (wizzes)
  93767. if (w.wizard)
  93768. if (is_player(w))
  93769. wlist = setadd(wlist, w);
  93770. endif
  93771. if (is_player(w.public_identity))
  93772. wlist = setadd(wlist, w.public_identity);
  93773. endif
  93774. endif
  93775. endfor
  93776. return wlist;
  93777. .
  93778. #26:16
  93779. ":rename_all_instances(object,oldname,newname)";
  93780. "Used to rename all instances of an unwanted verb (like recycle or disfunc)";
  93781. "if said verb is actually defined on the object itself";
  93782. if (caller_perms().wizard)
  93783. found = 0;
  93784. object = args[1];
  93785. objverb = args[1..2];
  93786. newname = args[3];
  93787. while (info = verb_info(@objverb))
  93788. set_verb_info(@objverb, listset(info, newname, 3));
  93789. found = 1;
  93790. endwhile
  93791. return found;
  93792. else
  93793. return E_PERM;
  93794. endif
  93795. .
  93796. #26:17
  93797. miss = args[1];
  93798. if (!(index = (miss in this.missed_help_strings)))
  93799. this.missed_help_strings = {miss, @this.missed_help_strings};
  93800. this.missed_help_counters = {{0, 0}, @this.missed_help_counters};
  93801. index = 1;
  93802. endif
  93803. which = (args[2] ? 2 | 1);
  93804. this.missed_help_counters[index][which] = (this.missed_help_counters[index][which] + 1);
  93805. .
  93806. #26:18
  93807. mhs = this.missed_help_strings;
  93808. cnt = this.missed_help_counters;
  93809. "save values first, so subsequent changes during suspends wont affect it";
  93810. thresh = (args ? args[1] | 5);
  93811. strs = {};
  93812. for i in [1..length(mhs)]
  93813. $command_utils:suspend_if_needed(0);
  93814. if ((cnt[i][1] + cnt[i][2]) > thresh)
  93815. strs = {@strs, ((($string_utils:right(tostr(cnt[i][1]), 5) + " ") + $string_utils:right(tostr(cnt[i][2]), 5)) + " ") + mhs[i]};
  93816. endif
  93817. endfor
  93818. sorted = $list_utils:sort_suspended(0, strs);
  93819. len = length(sorted);
  93820. player:tell(" miss ambig word");
  93821. for x in [1..len]
  93822. $command_utils:suspend_if_needed(0);
  93823. player:tell(sorted[(len - x) + 1]);
  93824. endfor
  93825. player:tell(" - - - - - - - - -");
  93826. .
  93827. #26:19
  93828. if (caller_perms().wizard)
  93829. pass();
  93830. this.missed_help_counters = (this.missed_help_strings = {});
  93831. endif
  93832. .
  93833. #26:20
  93834. ":show_netwho_listing(tell,player_list)";
  93835. " prints a listing of the indicated players showing connect sites.";
  93836. if (!caller_perms().wizard)
  93837. return E_PERM;
  93838. endif
  93839. who = args[1];
  93840. if (!(unsorted = args[2]))
  93841. return;
  93842. endif
  93843. su = $string_utils;
  93844. alist = {};
  93845. footnotes = {};
  93846. nwidth = length("Player name");
  93847. for u in (unsorted)
  93848. $command_utils:suspend_if_needed(0);
  93849. if (u.programmer)
  93850. pref = "% ";
  93851. footnotes = setadd(footnotes, "prog");
  93852. else
  93853. pref = "  ";
  93854. endif
  93855. if (u in connected_players())
  93856. lctime = ctime(time() - connected_seconds(u));
  93857. where = connection_name(u);
  93858. else
  93859. lctime = ctime(u.last_connect_time);
  93860. where = u.last_connect_place;
  93861. endif
  93862. name = u.name;
  93863. if (length(name) > 15)
  93864. name = (name[1..13] + "..");
  93865. endif
  93866. u3 = {tostr(pref, u.name, " (", u, ")"), lctime[5..10] + lctime[20..24]};
  93867. nwidth = max(length(u3[1]), nwidth);
  93868. where = $string_utils:connection_hostname(where);
  93869. if ($login:blacklisted(where))
  93870. where = ("(*) " + where);
  93871. footnotes = setadd(footnotes, "black");
  93872. elseif ($login:graylisted(where))
  93873. where = ("(+) " + where);
  93874. footnotes = setadd(footnotes, "gray");
  93875. endif
  93876. alist = {@alist, {@u3, where}};
  93877. endfor
  93878. alist = $list_utils:sort_alist_suspended(0, alist, 3);
  93879. $command_utils:suspend_if_needed(0);
  93880. headers = {"Player name", "Last Login", "From Where"};
  93881. before = {0, nwidth + 3, (nwidth + length(ctime(0))) - 11};
  93882. tell1 = ("  " + headers[1]);
  93883. tell2 = ("  " + su:space(headers[1], "-"));
  93884. for j in [2..3]
  93885. tell1 = (su:left(tell1, before[j]) + headers[j]);
  93886. tell2 = (su:left(tell2, before[j]) + su:space(headers[j], "-"));
  93887. endfor
  93888. who:notify(tell1);
  93889. who:notify(tell2);
  93890. for a in (alist)
  93891. $command_utils:suspend_if_needed(0);
  93892. tell1 = a[1];
  93893. for j in [2..3]
  93894. tell1 = (su:left(tell1, before[j]) + a[j]);
  93895. endfor
  93896. who:notify(tell1[1..min(length(tell1), 79)]);
  93897. endfor
  93898. if (footnotes)
  93899. who:notify("");
  93900. if ("prog" in footnotes)
  93901. who:notify(" %  == programmer.");
  93902. endif
  93903. if ("black" in footnotes)
  93904. who:notify("(*) == blacklisted site.");
  93905. endif
  93906. if ("gray" in footnotes)
  93907. who:notify("(+) == graylisted site.");
  93908. endif
  93909. endif
  93910. .
  93911. #26:21
  93912. ":show_netwho_from_listing(tell,site)";
  93913. "@net-who from hoststring prints all players who have connected from that host or host substring.  Substring can include *'s, e.g. @net-who from *.foo.edu.";
  93914. if (!caller_perms().wizard)
  93915. return E_PERM;
  93916. endif
  93917. tellwho = args[1];
  93918. su = $string_utils;
  93919. if (!index(where = args[2], "*"))
  93920. "Oh good... search for users from a site... the fast way.  No wild cards.";
  93921. nl = 0;
  93922. bozos = {};
  93923. sites = $site_db:find_all_keys(where);
  93924. while (sites)
  93925. s = sites;
  93926. sites = {};
  93927. for domain in (s)
  93928. for b in ($site_db:find_exact(domain))
  93929. if (typeof(b) == STR)
  93930. sites = setadd(sites, (b + ".") + domain);
  93931. else
  93932. bozos = setadd(bozos, b);
  93933. nl = max(length(tostr(b, valid(b) ? b.name | "")), nl);
  93934. endif
  93935. endfor
  93936. endfor
  93937. endwhile
  93938. if (bozos)
  93939. tellwho:notify(tostr(su:left("  Player", nl + 7), "From"));
  93940. tellwho:notify(tostr(su:left("  ------", nl + 7), "----"));
  93941. for who in (bozos)
  93942. st = su:left(tostr(valid(who) ? (who.programmer ? "% " | "  ") + who.name | "", " (", who, ")"), nl + 7);
  93943. comma = 0;
  93944. if ($object_utils:isa(who, $player) && is_player(who))
  93945. for p in ({who.email_address || "*Unregistered*", @who.all_connect_places})
  93946. if (comma && (length(p) >= (78 - length(st))))
  93947. tellwho:notify(tostr(st, ","));
  93948. st = (su:space(nl + 7) + p);
  93949. else
  93950. st = tostr(st, comma ? ", " | "", p);
  93951. endif
  93952. comma = 1;
  93953. $command_utils:suspend_if_needed(0);
  93954. endfor
  93955. else
  93956. st = (st + (valid(who) ? "*** recreated ***" | "*** recycled ***"));
  93957. endif
  93958. tellwho:notify(st);
  93959. endfor
  93960. tellwho:notify("");
  93961. tellwho:notify(tostr(length(bozos), " player", (length(bozos) == 1) ? "" | "s", " found."));
  93962. else
  93963. tellwho:notify(tostr("No sites matching `", where, "'"));
  93964. endif
  93965. else
  93966. "User typed 'from'.  Go search for users from this site.  (SLOW!)";
  93967. howmany = 0;
  93968. for who in (players())
  93969. $command_utils:suspend_if_needed(0);
  93970. matches = {};
  93971. for name in (who.all_connect_places)
  93972. if ((index(where, "*") && su:match_string(name, where)) || ((!index(where, "*")) && index(name, where)))
  93973. matches = {@matches, name};
  93974. endif
  93975. endfor
  93976. if (matches)
  93977. howmany = (howmany + 1);
  93978. tellwho:notify(tostr(who.name, " (", who, "): ", su:english_list(matches)));
  93979. endif
  93980. endfor
  93981. tellwho:notify(tostr(howmany || "No", " matches found."));
  93982. endif
  93983. .
  93984. #26:22
  93985. ":check_player_request(name [,email [,connection]])";
  93986. " check if the request for player and email address is valid;";
  93987. " return empty string if it valid, or else a string saying why not.";
  93988. " The result starts with - if this is a 'send email, don't try again' situation.";
  93989. ":check_reregistration(name, email, connection)";
  93990. "  name is ignored, only check the 'email' parts";
  93991. if (!caller_perms().wizard)
  93992. return E_PERM;
  93993. "accesses registration information -- wiz only";
  93994. endif
  93995. name = args[1];
  93996. if (verb == "check_reregistration")
  93997. "don't check player name";
  93998. elseif (!name)
  93999. return "A blank name isn't allowed.";
  94000. elseif (name == "<>")
  94001. return "Names with angle brackets aren't allowed.";
  94002. elseif (index(name, " "))
  94003. return "Names with spaces are not allowed. Use dashes or underscores.";
  94004. elseif (match(name, "^<.*>$"))
  94005. return tostr("Try using ", name[2..length(name)], " instead of ", name, ".");
  94006. elseif ($player_db.frozen)
  94007. return "New players cannot be created at the moment, try again later.";
  94008. elseif (!$player_db:available(name))
  94009. return ("The name '" + name) + "' is not available.";
  94010. elseif ($login:_match_player(name) != $failed_match)
  94011. return ("The name '" + name) + "' doesn't seem to be available.";
  94012. endif
  94013. if (length(args) == 1)
  94014. "no email address supplied.";
  94015. return "";
  94016. endif
  94017. address = args[2];
  94018. if ($registration_db:suspicious_address(address))
  94019. return "-There has already been a character with that or a similar email address.";
  94020. endif
  94021. if (reason = $network:invalid_email_address(address))
  94022. return reason;
  94023. endif
  94024. parsed = $network:parse_address(address);
  94025. if ($registration_db:suspicious_userid(parsed[1]))
  94026. return tostr("-Automatic registration from an account named ", parsed[1], " is not allowed.");
  94027. endif
  94028. connection = ((length(args) > 2) ? args[3] | parsed[2]);
  94029. if ((connection[length(connection) - 2..length(connection)] == ".uk") && (parsed[2][1..3] == "uk."))
  94030. return tostr("Addresses must be in internet form. Try ", parsed[1], "@", $string_utils:from_list($list_utils:reverse($string_utils:explode(parsed[2], ".")), "."), ".");
  94031. elseif (match(connection, "^[0-9.]+$"))
  94032. return "-The system cannot resolve the name of the system you're connected from.";
  94033. elseif ((a = $network:local_domain(connection)) != (b = $network:local_domain(parsed[2])))
  94034. return tostr("-The connection is from '", a, "' but the mail address is '", b, "'; these don't seem to be the same place.");
  94035. elseif ($login:spooflisted(parsed[2]))
  94036. return tostr("-Automatic registration is not allowed from ", parsed[2], ".");
  94037. endif
  94038. return "";
  94039. .
  94040. #26:23
  94041. "create a player named NAME with email address ADDRESS; return {object, password}.";
  94042. "assumes $wiz_utils:check_player_request() has been called and it passes.";
  94043. if (!caller_perms().wizard)
  94044. return E_PERM;
  94045. endif
  94046. name = args[1];
  94047. address = args[2];
  94048. new = create($player_class, $nothing);
  94049. new.name = name;
  94050. new.aliases = {name};
  94051. new.password = crypt(password = $wiz_utils:random_password(5));
  94052. new.last_connect_time = $maxint;
  94053. "Last disconnect time is creation time, until they login.";
  94054. new.last_disconnect_time = time();
  94055. new.ownership_quota = $wiz_utils.default_player_quota;
  94056. $wiz_utils:set_player(new);
  94057. new.email_address = address;
  94058. $registration_db:add(new, address, @args[3..length(args)]);
  94059. move(new, $player_start);
  94060. new.programmer = $player_class.programmer;
  94061. return {new, password};
  94062. .
  94063. #26:24
  94064. ":send_new_player_mail(preface, name, address, character#, password)";
  94065. "  used by $wiz:@make-player and $guest:@request";
  94066. if (!caller_perms().wizard)
  94067. return E_PERM;
  94068. endif
  94069. preface = args[1];
  94070. name = args[2];
  94071. address = args[3];
  94072. new = args[4];
  94073. password = args[5];
  94074. msg = {preface};
  94075. msg = {@msg, tostr("A character has been created, with name \"", name, "\" and password \"", password, "\".  (Passwords are case sensitive.)")};
  94076. msg = {@msg, tostr($network.moo_name, " is at ", $network.site, ", port ", $network.port, ".")};
  94077. msg = {@msg, "Read the help if you haven't used MOO before.  A tutorial available through the @tutorial command. Try paging the character HELP if you can't find what you need in the help system or tutorial."};
  94078. msg = {@msg, "A programmer's manual and various other pieces of documentation are available via ftp from ", "  parcftp.xerox.com, directory /pub/MOO"};
  94079. msg = {@msg, "Keep your password secure; do not let anyone else connect as you. Remember, you are responsible for what your character does. If you no longer want your character, do not give it to anyone else. You can change your password after you connect with the @password command."};
  94080. msg = {@msg, "After you connect, type `help manners' in order to see the policy on the code of conduct expected."};
  94081. msg2 = {};
  94082. for x in (msg)
  94083. msg2 = {@msg2, "", @$generic_editor:fill_string(x, 75)};
  94084. endfor
  94085. return $network:sendmail(address, (("Your " + $network.moo_name) + " character, ") + name, "Reply-to: " + $login.registration_address, @msg2);
  94086. .
  94087. #26:25
  94088. "do_maker_player(name,email,[comment])";
  94089. "Common code for @make-player";
  94090. "If no password is given, generates a random password for the player.";
  94091. "Email-address is stored in $registration_db and on the player object.";
  94092. if (!caller_perms().wizard)
  94093. return E_PERM;
  94094. endif
  94095. name = args[1];
  94096. email = args[2];
  94097. comments = $string_utils:from_list(args[3..length(args)], " ");
  94098. reason = $wiz_utils:check_player_request(name, email);
  94099. if (others = $registration_db:find_exact(email))
  94100. player:notify(email + " is the registered address of the following characters:");
  94101. for x in (others)
  94102. player:notify(tostr(valid(x[1]) ? x[1].name | "<recycled>", (valid(x[1]) && (!is_player(x[1]))) ? " {nonplayer}" | "", " (", x[1], ") ", (length(x) > 1) ? ("[" + tostr(@x[2..length(x)])) + "]" | ""));
  94103. endfor
  94104. if (!reason)
  94105. reason = "Already registered.";
  94106. endif
  94107. endif
  94108. if (reason)
  94109. player:notify(reason);
  94110. if (!$command_utils:yes_or_no("Create character anyway? "))
  94111. player:notify("Okay.");
  94112. return;
  94113. endif
  94114. endif
  94115. new = $wiz_utils:make_player(name, email);
  94116. player:notify(tostr(name, " (", new[1], ") created with password `", new[2], "' for ", email, " ", comments));
  94117. $mail_agent:send_message(player, $new_player_log, tostr(name, " (", new[1], ")"), tostr(email, comments ? " " + comments | ""));
  94118. if ($network.active)
  94119. if ($command_utils:yes_or_no(("Send email to " + email) + " with password? "))
  94120. player:notify(tostr("Sending the password to ", email, "."));
  94121. if ((result = $wiz_utils:send_new_player_mail(tostr("From ", player.name, "@", $network.moo_name, ":"), name, email, new[1], new[2])) == 0)
  94122. player:notify(tostr("Mail sent successfully to ", email, "."));
  94123. else
  94124. player:tell("Cannot send mail: ", result);
  94125. endif
  94126. else
  94127. player:notify("Okay.");
  94128. endif
  94129. else
  94130. player:notify("Sorry, the network isn't active.");
  94131. endif
  94132. .
  94133. #26:26
  94134. "do_register(name, email_address [,comments])";
  94135. "change player's email address.";
  94136. if (!caller_perms().wizard)
  94137. return E_PERM;
  94138. endif
  94139. whostr = args[1];
  94140. email = args[2];
  94141. comments = $string_utils:from_list(args[3..length(args)]);
  94142. whostr = args[1];
  94143. who = $string_utils:match_player(whostr);
  94144. if ($command_utils:player_match_failed(who, whostr))
  94145. return;
  94146. endif
  94147. if (((whostr != who.name) && (!(whostr in who.aliases))) && (whostr != tostr(who)))
  94148. player:notify(tostr("Must be a full name or an object number:  ", who.name, "(", who, ")"));
  94149. return;
  94150. endif
  94151. if (reason = $network:invalid_email_address(email))
  94152. player:notify(reason);
  94153. if (!$command_utils:yes_or_no("Register anyway?"))
  94154. return player:notify("re-registration aborted.");
  94155. endif
  94156. endif
  94157. if (comments)
  94158. $registration_db:add(who, email, comments);
  94159. else
  94160. $registration_db:add(who, email);
  94161. endif
  94162. old = who.email_address;
  94163. who.email_address = email;
  94164. player:notify(tostr(who.name, " (", who, ") formerly ", old ? old | "unregistered", ", registered at ", email, ".  ", comments ? (" [" + comments) + "]" | ""));
  94165. .
  94166. #26:27
  94167. "do_new_password(who, [password])";
  94168. if (!caller_perms().wizard)
  94169. return E_PERM;
  94170. endif
  94171. whostr = args[1];
  94172. who = $string_utils:match_player(whostr);
  94173. if ($command_utils:player_match_failed(who, whostr))
  94174. return;
  94175. endif
  94176. if (((whostr != who.name) && (!(whostr in who.aliases))) && (whostr != tostr(who)))
  94177. player:notify(tostr("Must be a full name or an object number:  ", who.name, "(", who, ")"));
  94178. return;
  94179. endif
  94180. whostr = $string_utils:nn(who);
  94181. player:notify(tostr("About to change password for ", whostr, ". Old encrypted password is \"", who.password, "\""));
  94182. if ((length(args) > 1) && (password = args[2]))
  94183. password = args[2];
  94184. else
  94185. password = $wiz_utils:random_password(5);
  94186. endif
  94187. who.password = crypt(password);
  94188. player:notify(tostr(whostr, " new password is `", password, "'."));
  94189. if (!who.email_address)
  94190. player:notify(tostr(whostr, " doesn't have a registered email_address, cannot mail password; tell them some some other way."));
  94191. elseif ($command_utils:yes_or_no(tostr("Email new password to ", whostr, "?")))
  94192. player:notify("Sending the password via email.");
  94193. if ((result = $network:sendmail(who.email_address, ("Your " + $network.moo_name) + " password", ("The password for your " + $network.moo_name) + " character:", " " + whostr, "has been changed. The new password is:", " " + password, "", "Please note that passwords are case sensitive.")) == 0)
  94194. player:tell("Mail sent.");
  94195. else
  94196. player:tell("Trouble sending mail: ", result);
  94197. endif
  94198. else
  94199. player:tell("No mail sent.");
  94200. endif
  94201. .
  94202. #27:0
  94203. return ((caller == this) || caller_perms().wizard) ? pass(@args) | E_PERM;
  94204. .
  94205. #27:1
  94206. ":add(player,site)";
  94207. if (!caller_perms().wizard)
  94208. return E_PERM;
  94209. endif
  94210. who = args[1];
  94211. domain = args[2];
  94212. if (this:domain_literal(domain))
  94213. "... just enter it...";
  94214. l = this:find_exact(domain);
  94215. if (l == $failed_match)
  94216. this:insert(domain, {who});
  94217. elseif (!(who in l))
  94218. this:insert(domain, setadd(l, who));
  94219. endif
  94220. else
  94221. "...an actual domain name; add player to list for that domain...";
  94222. "...then add domain itself to list for the next larger domain; repeat...";
  94223. "...  Example:  domain == foo.bar.edu:  ";
  94224. "...            enter #who  on foo.bar.edu list";
  94225. "...            enter `foo' on bar.edu list";
  94226. "...            enter `bar' on edu list";
  94227. if (!(dot = index(domain, ".")))
  94228. dot = (length(domain) + 1);
  94229. domain = tostr(domain, ".", this.domain);
  94230. endif
  94231. prev = who;
  94232. while ($failed_match == (l = this:find_exact(domain)))
  94233. this:insert(domain, {prev});
  94234. if (dot)
  94235. prev = domain[1..dot - 1];
  94236. domain = domain[dot + 1..length(domain)];
  94237. else
  94238. return;
  94239. endif
  94240. dot = index(domain, ".");
  94241. endwhile
  94242. if (!(prev in l))
  94243. this:insert(domain, {@l, prev});
  94244. endif
  94245. return;
  94246. endif
  94247. .
  94248. #27:2
  94249. ":load([start]) -- reloads site_db with the connection places of all players.";
  94250. "This routine calls suspend() if it runs out of time.";
  94251. "WIZARDLY";
  94252. "...needs to be able to read .all_connect_places";
  94253. if (!$perm_utils:controls(caller_perms(), this))
  94254. return E_PERM;
  94255. endif
  94256. plist = players();
  94257. if (!args)
  94258. this:clearall();
  94259. elseif (i = (args[1] in plist))
  94260. plist[1..i - 1] = {};
  94261. else
  94262. return E_INVARG;
  94263. endif
  94264. for p in (plist)
  94265. if (valid(p) && (is_player(p) && (!$object_utils:isa(p, $guest))))
  94266. "... player may be recycled or toaded during the suspend(),...";
  94267. "... guests login from everywhere...";
  94268. for c in (p.all_connect_places)
  94269. this:add(p, c);
  94270. if ($command_utils:running_out_of_time())
  94271. player:tell("...", p);
  94272. suspend(0);
  94273. endif
  94274. endfor
  94275. endif
  94276. endfor
  94277. .
  94278. #27:3
  94279. ":domain_literal(string)";
  94280. " => true iff string is a domain literal (i.e., numeric IP address).";
  94281. if (10 <= (len = length(hnum = strsub(args[1], ".", ""))))
  94282. return tonum(hnum[1..9]) && tonum(hnum[6..len]);
  94283. else
  94284. return tonum(hnum);
  94285. endif
  94286. "SLEAZY CODE ALERT";
  94287. "... what I wanted to do was return tonum(strsub(args[1],\".\",\"\"))";
  94288. "... but on a 32-bit machine, this has a 1 in 4294967296 chance of failing";
  94289. "... (e.g., on \"42.94.967.296\", though I'll grant this particular example";
  94290. "...  entails some very strange subnetting on net 42, to say the least).";
  94291. "... So we do something that is guaranteed to work so long as internet";
  94292. "... addresses stay under 32 bits --- a while yet...";
  94293. "";
  94294. "... As soon as we're sure match() is working, this will become a one-liner:";
  94295. return match(args[1], "[0-9]+%.[0-9]+%.[0-9]+%.[0-9]+");
  94296. .
  94297. #27:4
  94298. if (caller_perms().wizard)
  94299. pass();
  94300. this:load();
  94301. endif
  94302. .
  94303. #28:0
  94304. "sin(x) -- given x in degrees, sin(x) will return the value of the sine";
  94305. "function at x times 10000";
  94306. x = (((args[1] + 45) % 360) - 45);
  94307. if (x < 0)
  94308. return -this:sin(-x);
  94309. elseif (x > 225)
  94310. return -this:xcos(x - 270);
  94311. elseif (x > 135)
  94312. return -this:xsin(x - 180);
  94313. elseif (x > 45)
  94314. return this:xcos(x - 90);
  94315. else
  94316. return this:xsin(x);
  94317. endif
  94318. .
  94319. #28:1
  94320. "cos(x) -- given x in degrees, cos(x) will return cosine evaluated at x";
  94321. "times 10000";
  94322. return this:sin(90 - args[1]);
  94323. .
  94324. #28:2
  94325. "tan(x) -- given x in degrees, tan(x) will calculate the tangent at x";
  94326. "times 10000";
  94327. return (this:sin(args[1]) * 10000) / this:cos(args[1]);
  94328. .
  94329. #28:3
  94330. "xsin(x) -- calculates the taylor approximation for the sine function";
  94331. x = args[1];
  94332. if ((x * x) > this.taylor)
  94333. return ((this:xsin(x / 2) * this:xcos((x + 1) / 2)) + (this:xsin((x + 1) / 2) * this:xcos(x / 2))) / 10000;
  94334. else
  94335. return (x * (17453000 - ((x * x) * 886))) / 100000;
  94336. endif
  94337. .
  94338. #28:4
  94339. "xcos(x) -- calculates the taylor approximation for the cosine function";
  94340. x = args[1];
  94341. if ((x * x) > this.taylor)
  94342. return ((this:xcos(x / 2) * this:xcos((x + 1) / 2)) - (this:xsin(x / 2) * this:xsin((x + 1) / 2))) / 10000;
  94343. else
  94344. return (1000000000 - ((x * x) * (152309 + ((4 * x) * x)))) / 100000;
  94345. endif
  94346. .
  94347. #28:5
  94348. "factorial(n) -- returns n factorial for 0 <= n (<= 12).";
  94349. if ((number = args[1]) < 0)
  94350. return E_INVARG;
  94351. endif
  94352. fact = 1;
  94353. for i in [2..number]
  94354. fact = (fact * i);
  94355. endfor
  94356. return fact;
  94357. .
  94358. #28:6
  94359. "pow(x,n) -- returns x raised to the nth power. n must be >= 0.";
  94360. if ((power = args[2]) < 0)
  94361. return E_INVARG;
  94362. endif
  94363. n = args[1];
  94364. if (power % 2)
  94365. ret = n;
  94366. else
  94367. ret = 1;
  94368. endif
  94369. while (power = (power / 2))
  94370. n = (n * n);
  94371. if (power % 2)
  94372. ret = (ret * n);
  94373. endif
  94374. endwhile
  94375. return ret;
  94376. .
  94377. #28:7
  94378. "fibonacci(n) -- calculates the fibonacci numbers to the nth term";
  94379. "and returns them in a list. n must be >= 0.";
  94380. x0 = 0;
  94381. x1 = 1;
  94382. if ((n = args[1]) < 0)
  94383. return E_INVARG;
  94384. elseif (n == 0)
  94385. return {x0};
  94386. else
  94387. x = {x0, x1};
  94388. for i in [2..n]
  94389. len = length(x);
  94390. x = {@x, x[len - 1] + x[len]};
  94391. endfor
  94392. return x;
  94393. endif
  94394. .
  94395. #28:8
  94396. "geometric(x,n) -- calculates the value of the geometric series at x to ";
  94397. "the nth term. i.e., approximates 1/(1-x) when |x| < 1. this, of course,";
  94398. "is impossible in MOO, but someone may find it useful in some way.";
  94399. "n defaults to 5. n must be >= 0.";
  94400. n = args[1];
  94401. order = ((length(args) > 1) ? args[2] | 5);
  94402. x = 1;
  94403. for i in [1..order]
  94404. x = (x + this:pow(n, i));
  94405. endfor
  94406. return x;
  94407. .
  94408. #28:9
  94409. "divmod(n,d) => {q,r} such that n = dq + r";
  94410. "  handles negative numbers correctly   0<=r<d if d>0, -d<r<=0 if d<0.";
  94411. n = args[1];
  94412. d = args[2];
  94413. r = (((n % d) + d) % d);
  94414. q = ((n - r) / d);
  94415. return {q, r};
  94416. .
  94417. #28:10
  94418. "combinations(n,r) -- returns the number of ways one can choose r";
  94419. "objects from n distinct choices.";
  94420. "C(n,r) = n!/[r!(n-r)!]";
  94421. "  overflow may occur if n>29...";
  94422. n = args[1];
  94423. r = args[2];
  94424. if (0 > (r = min(r, n - r)))
  94425. return 0;
  94426. else
  94427. c = 1;
  94428. n = (n + 1);
  94429. for i in [1..r]
  94430. c = ((c * (n - i)) / i);
  94431. endfor
  94432. return c;
  94433. endif
  94434. .
  94435. #28:11
  94436. "permutations(n,r) -- returns the number of ways possible for one to";
  94437. "order r objects given n distinct locations.";
  94438. "P(n,r) = n!/(n-r)!";
  94439. n = args[1];
  94440. r = args[2];
  94441. return this:factorial(n) / this:factorial(n - r);
  94442. .
  94443. #28:12
  94444. "simpson({a,b},{f(a),f((a+b)/2),f(b)}) -- given two endpoints, a and b,";
  94445. "and the functions value at a, (a+b)/2, and b, this will calculate";
  94446. "a numerical approximation of the integral using simpson's rule.";
  94447. "the answer is returned as {integer,fraction}";
  94448. point = args[1];
  94449. fcn = args[2];
  94450. return this:parts((point[2] - point[1]) * ((fcn[1] + (4 * fcn[2])) + fcn[3]), 6);
  94451. .
  94452. #28:13
  94453. "parts(n,q[,i]) -- returns a decomposition of n by q into integer and";
  94454. "floating point parts with i = the number of digits after the decimal.";
  94455. "i defaults to 5.";
  94456. "warning: it is quite easy to hit maxint which results in unpredictable";
  94457. "         results";
  94458. parts = {(n = args[1]) / (q = args[2]), n % q};
  94459. i = ((length(args) > 2) ? args[3] | 5);
  94460. return {parts[1], (parts[2] * this:pow(10, i)) / q};
  94461. .
  94462. #28:14
  94463. return sqrt(args[1]);
  94464. "sqrt(n) => largest integer <= square root of n.  Uses Newton's method.";
  94465. "obsolete now; left for documentation purposes.";
  94466. n = args[1];
  94467. if (n < 0)
  94468. return E_RANGE;
  94469. elseif (n)
  94470. x1 = n;
  94471. while (x1 > (x2 = ((x1 + (n / x1)) / 2)))
  94472. x1 = x2;
  94473. endwhile
  94474. return x1;
  94475. else
  94476. return 0;
  94477. endif
  94478. .
  94479. #28:15
  94480. "arctan(y/x) == arctan(x,y) => angle in degrees.";
  94481. if (length(args) < 2)
  94482. sin = args[1];
  94483. cos = 10000;
  94484. else
  94485. sin = args[2];
  94486. cos = args[1];
  94487. endif
  94488. if (sin < 0)
  94489. return -this:arctan(cos, -sin);
  94490. elseif (cos < 0)
  94491. return 180 - this:arctan(-cos, sin);
  94492. elseif (sin > cos)
  94493. return 90 - this:arctan(sin, cos);
  94494. else
  94495. tan = ((sin * 10000) / cos);
  94496. a = $list_utils:find_insert(this.tangents, tan - 1);
  94497. if ((this.tangents[a] - tan) < (tan - {0, @this.tangents}[a]))
  94498. return a;
  94499. else
  94500. return a - 1;
  94501. endif
  94502. endif
  94503. .
  94504. #28:16
  94505. "div(n,d) => q such that n = dq + r and  (0<=r<d if d>0, -d<r<=0 if d<0).";
  94506. return this:divmod(@args)[1];
  94507. .
  94508. #28:17
  94509. "A correct mod function.";
  94510. "mod(n,d) => r such that n = dq + r and (0<=r<d if d>0 or -d<r<=0 if d<0).";
  94511. n = args[1];
  94512. d = args[2];
  94513. return ((n % d) + d) % d;
  94514. .
  94515. #28:18
  94516. "returns 10000 exp (x/10000)";
  94517. "The accuracy seems to be ~0.1% for 0<x<4";
  94518. x = args[1];
  94519. if (x < 0)
  94520. z = this:(verb)(-x);
  94521. #78:tell("->", x, "  ", z);
  94522. return (100000000 + (z / 2)) / z;
  94523. elseif (x > 1000)
  94524. z = this:(verb)(x / 2);
  94525. if (z > 1073741823)
  94526. return $maxint;
  94527. "maxint for overflows";
  94528. elseif (z > 460000)
  94529. z = (((z + 5000) / 10000) * z);
  94530. elseif (z > 30000)
  94531. z = (((((z + 50) / 100) * z) + 50) / 100);
  94532. else
  94533. z = (((z * z) + 5000) / 10000);
  94534. endif
  94535. if (x % 2)
  94536. return z + ((z + 5000) / 10000);
  94537. else
  94538. return z;
  94539. endif
  94540. else
  94541. return ((10000 + x) + (((x * x) + 10000) / 20000)) + ((((x * x) * x) + 300000000) / 600000000);
  94542. endif
  94543. .
  94544. #28:19
  94545. "random(): returns a random number in the following manner:";
  94546. "random(n > 0) will return a number in the range 0 to n";
  94547. "random(n < 0) will return a number in the range n to 0";
  94548. prob = args[1];
  94549. mod = ((prob < 0) ? -1 | 1);
  94550. return (mod * random(abs(prob + mod))) - mod;
  94551. .
  94552. #28:20
  94553. "random_range(range [,mean]): returns a random number within the given";
  94554. "range from the mean. if the mean isn't given, it defaults to 0";
  94555. "e.g., random_range(10) => -10..10";
  94556. "      random_range(10,4) => -6..14";
  94557. range = args[1];
  94558. mean = ((length(args) > 1) ? args[2] | 0);
  94559. return mean + (((random(2) == 1) ? -1 | 1) * this:random(range));
  94560. .
  94561. #28:21
  94562. "is_prime(number) returns 1 if the number is prime or 0 if it isn't.";
  94563. "of course, only positive numbers are candidates for primality.";
  94564. number = args[1];
  94565. if (number == 2)
  94566. return 1;
  94567. elseif ((number < 2) || ((number % 2) == 0))
  94568. return 0;
  94569. else
  94570. choice = 3;
  94571. while (((denom = (choice * choice)) <= number) && (denom > 0))
  94572. if ((seconds_left() < 2) || (ticks_left() < 25))
  94573. suspend(0);
  94574. endif
  94575. if ((number % choice) == 0)
  94576. return 0;
  94577. endif
  94578. choice = (choice + 2);
  94579. endwhile
  94580. endif
  94581. return 1;
  94582. .
  94583. #28:22
  94584. bl1 = this:BLFromInt(args[1]);
  94585. bl2 = this:BLFromInt(args[2]);
  94586. blOut = {};
  94587. for i in [1..32]
  94588. blOut = {@blOut, bl1[i] && bl2[i]};
  94589. endfor
  94590. return this:IntFromBL(blOut);
  94591. .
  94592. #28:23
  94593. bl1 = this:BLFromInt(args[1]);
  94594. bl2 = this:BLFromInt(args[2]);
  94595. blOut = {};
  94596. for i in [1..32]
  94597. blOut = {@blOut, bl1[i] || bl2[i]};
  94598. endfor
  94599. return this:IntFromBL(blOut);
  94600. .
  94601. #28:24
  94602. bl1 = this:BLFromInt(args[1]);
  94603. bl2 = this:BLFromInt(args[2]);
  94604. blOut = {};
  94605. for i in [1..32]
  94606. blOut = {@blOut, bl1[i] != bl2[i]};
  94607. endfor
  94608. return this:IntFromBL(blOut);
  94609. .
  94610. #28:25
  94611. return -(1 + args[1]);
  94612. "";
  94613. "... here's what it used to be ...";
  94614. bl1 = this:BLFromInt(args[1]);
  94615. blOut = {};
  94616. for i in [1..32]
  94617. blOut = {@blOut, !bl1[i]};
  94618. endfor
  94619. return this:IntFromBL(blOut);
  94620. .
  94621. #28:26
  94622. x = args[1];
  94623. l = {};
  94624. firstbit = (x < 0);
  94625. if (firstbit)
  94626. x = (x + $minint);
  94627. endif
  94628. for i in [1..31]
  94629. l = {x % 2, @l};
  94630. x = (x / 2);
  94631. endfor
  94632. return {firstbit, @l};
  94633. .
  94634. #28:27
  94635. bl = args[1];
  94636. x = 0;
  94637. for l in (bl)
  94638. x = (x * 2);
  94639. x = (x + l);
  94640. endfor
  94641. return x;
  94642. .
  94643. #28:28
  94644. "gcd(num1,num2): find the greatest common divisor of the two numbers";
  94645. "using the division algorithm. the absolute values of num1 and num2 are";
  94646. "used without loss of generality.";
  94647. num1 = abs(args[1]);
  94648. num2 = abs(args[2]);
  94649. max = max(num1, num2);
  94650. min = min(num1, num2);
  94651. if (r1 = (max % min))
  94652. while (r2 = (min % r1))
  94653. min = r1;
  94654. r1 = r2;
  94655. endwhile
  94656. return r1;
  94657. else
  94658. return min;
  94659. endif
  94660. .
  94661. #28:29
  94662. "lcm(num1,num2): find the least common multiple of the two numbers.";
  94663. "we shall use the positive lcm value without loss of generality.";
  94664. "since we have gcd already, we'll just use lcm*gcd = num1*num2";
  94665. num1 = abs(args[1]);
  94666. num2 = abs(args[2]);
  94667. return (num1 * num2) / this:gcd(num1, num2);
  94668. .
  94669. #28:30
  94670. "are_rel_prime(num1,num2): returns 1 if num1 and num2 are relatively";
  94671. "prime.";
  94672. "since we have gcd, this is pretty easy.";
  94673. if (this:gcd(args[1], args[2]) == 1)
  94674. return 1;
  94675. else
  94676. return 0;
  94677. endif
  94678. .
  94679. #28:31
  94680. "Call with first arg either a number or a string, being the number";
  94681. "desired for conversion. capital letters denote values from 10-35;";
  94682. "lowercase letters from 36 to 61. Maximal base is 62.";
  94683. "You will be unable to use the extra 26 lowercases as separate unless";
  94684. "you pass a nonzero fourth argument. Passing zero or none uses the";
  94685. "default value, which is to have AAAA=aaaa.";
  94686. "The second and third arguments should be the base of the number and";
  94687. "the base you want it in, respectively.";
  94688. "Any of the arguments can be strings or nums, but high-base numbers";
  94689. "will need to be strings. This returns a string.";
  94690. "Any problems, talk to Ozymandias.";
  94691. sensitive = 0;
  94692. if (length(args) < 3)
  94693. return E_INVARG;
  94694. elseif (length(args) == 4)
  94695. sensitive = tonum(args[4]);
  94696. endif
  94697. result = 0;
  94698. thenum = tostr(args[1]);
  94699. origbase = tonum(args[2]);
  94700. newbase = tonum(args[3]);
  94701. if ((((origbase < 2) || (newbase < 2)) || (origbase > 62)) || (newbase > 62))
  94702. return E_INVARG;
  94703. endif
  94704. for which in [1..length(thenum)]
  94705. value = index(this.base_alphabet, thenum[which], sensitive);
  94706. if ((!value) || (value > origbase))
  94707. return E_INVARG;
  94708. endif
  94709. result = (((result * origbase) + value) - 1);
  94710. endfor
  94711. thestring = "";
  94712. if (result < 0)
  94713. return E_INVARG;
  94714. endif
  94715. while (result)
  94716. if ((which = ((result % newbase) + 1)) <= length(this.base_alphabet))
  94717. thestring = (this.base_alphabet[which] + thestring);
  94718. else
  94719. return E_INVARG;
  94720. endif
  94721. result = (result / newbase);
  94722. endwhile
  94723. return thestring;
  94724. .
  94725. #28:32
  94726. "exp(x[,n]) -- calculates an nth order taylor approximation for e^x.";
  94727. "n defaults to 5. Any n given must be >= 0. you need to divide the result";
  94728. "the answer will be returned as {integer part,fractional part}";
  94729. x = args[1];
  94730. n = ((length(args) > 1) ? args[2] | 5);
  94731. ex = (nfact = 1);
  94732. for i in [0..n - 1]
  94733. j = (n - i);
  94734. ex = ((ex * x) + (nfact = (nfact * j)));
  94735. endfor
  94736. return this:parts(ex, nfact);
  94737. .
  94738. #28:33
  94739. ":norm(a,b,c,d...) => sqrt(a^2+b^2+c^2+...)";
  94740. m = max(max(@args), -min(@args));
  94741. logm = length(tostr(m));
  94742. if (logm <= 4)
  94743. s = 0;
  94744. for a in (args)
  94745. s = (s + (a * a));
  94746. endfor
  94747. return sqrt(s);
  94748. else
  94749. factor = tonum("1" + "0000000"[1..logm - 4]);
  94750. s = 0;
  94751. for a in (args)
  94752. a = (a / factor);
  94753. s = (s + (a * a));
  94754. endfor
  94755. return sqrt(s) * factor;
  94756. endif
  94757. .
  94758. #28:34
  94759. ":sum(num, num, num ...) => Total of all arguments added together.";
  94760. total = 0;
  94761. for number in ((typeof(x = args[1]) == LIST) ? x | args)
  94762. total = (total + number);
  94763. endfor
  94764. return total;
  94765. .
  94766. #29:0
  94767. "Returns the set union of all of the lists provided as arguments.";
  94768. if (!args)
  94769. return {};
  94770. endif
  94771. set = args[1];
  94772. for l in (listdelete(args, 1))
  94773. for x in (l)
  94774. set = setadd(set, x);
  94775. endfor
  94776. endfor
  94777. return set;
  94778. .
  94779. #29:1
  94780. "Returns the set intersection of all the lists provided as arguments.";
  94781. if (!args)
  94782. return {};
  94783. endif
  94784. max = 0;
  94785. result = args[1];
  94786. for set in (listdelete(args, 1))
  94787. if (length(result) < length(set))
  94788. set1 = result;
  94789. set2 = set;
  94790. else
  94791. set1 = set;
  94792. set2 = result;
  94793. endif
  94794. for x in (set1)
  94795. if (!(x in set2))
  94796. set1 = setremove(set1, x);
  94797. endif
  94798. endfor
  94799. result = set1;
  94800. endfor
  94801. return result;
  94802. .
  94803. #29:2
  94804. "Usage:  diff(set 1, set 2, ..., set n)";
  94805. "Returns all elements of set 1 that are not in sets 2..n";
  94806. set = args[1];
  94807. for l in (listdelete(args, 1))
  94808. for x in (l)
  94809. set = setremove(set, x);
  94810. endfor
  94811. endfor
  94812. return set;
  94813. .
  94814. #29:3
  94815. "True if the first list given is a superset of all subsequent lists.";
  94816. "False otherwise.  {} is a superset of {} and nothing else; anything is";
  94817. "a superset of {}.  If only one list is given, return true.";
  94818. super = (args ? args[1] | {});
  94819. for l in (listdelete(args, 1))
  94820. for x in (l)
  94821. if (!(x in super))
  94822. return 0;
  94823. endif
  94824. endfor
  94825. endfor
  94826. return 1;
  94827. .
  94828. #29:4
  94829. "Usage:  exclusive_or(set, set, ...)";
  94830. "Return the set of all elements that are in exactly one of the input sets";
  94831. "For two sets, this is the equivalent of (A u B) - (A n B).";
  94832. if (!args)
  94833. return {};
  94834. endif
  94835. set = (so_far = args[1]);
  94836. for l in (listdelete(args, 1))
  94837. for x in (l)
  94838. if (x in so_far)
  94839. set = setremove(set, x);
  94840. else
  94841. set = setadd(set, x);
  94842. endif
  94843. endfor
  94844. so_far = {@so_far, @l};
  94845. endfor
  94846. return set;
  94847. .
  94848. #29:5
  94849. "Usage:  diff(set 1, set 2, ..., set n)";
  94850. "Returns all elements of set 1 that are not in sets 2..n";
  94851. set = args[1];
  94852. for l in (listdelete(args, 1))
  94853. for x in (l)
  94854. set = setremove(set, x);
  94855. $command_utils:suspend_if_needed(0);
  94856. endfor
  94857. endfor
  94858. return set;
  94859. .
  94860. #29:6
  94861. "True if the two lists given contain the same elements.";
  94862. "False otherwise.";
  94863. set1 = args[1];
  94864. set2 = args[2];
  94865. while (set1)
  94866. elt = set1[1];
  94867. set1 = listdelete(set1, 1);
  94868. if (elt in set2)
  94869. set2 = setremove(set2, elt);
  94870. while (elt in set2)
  94871. set2 = setremove(set2, elt);
  94872. endwhile
  94873. while (elt in set1)
  94874. set1 = setremove(set1, elt);
  94875. endwhile
  94876. else
  94877. return 0;
  94878. endif
  94879. endwhile
  94880. if (set2)
  94881. return 0;
  94882. else
  94883. return 1;
  94884. endif
  94885. .
  94886. #30:0
  94887. pass();
  94888. $prog.help = this;
  94889. .
  94890. #31:0
  94891. if (caller_perms().wizard)
  94892. pass();
  94893. this:rm_message_seq({1, 1 + this:length_all_msgs()});
  94894. this:expunge_rmm();
  94895. this.mail_forward = {player, this};
  94896. this.mail_notify = {player};
  94897. for p in ({"moderator_forward", "writers", "readers", "expire_period", "last_used_time"})
  94898. this.(p) = $mail_recipient.(p);
  94899. endfor
  94900. this.moderated = 1;
  94901. else
  94902. return E_PERM;
  94903. endif
  94904. .
  94905. #31:1
  94906. if (!this:is_writable_by(caller_perms()))
  94907. return E_PERM;
  94908. else
  94909. if (msgs = this.messages)
  94910. new = (msgs[length(msgs)][1] + 1);
  94911. else
  94912. new = 1;
  94913. endif
  94914. if (rmsgs = this.messages_going)
  94915. lbrm = rmsgs[length(rmsgs)][2];
  94916. new = max(new, lbrm[length(lbrm)][1] + 1);
  94917. endif
  94918. m = args[1];
  94919. if (index(m[4], "@programmer ") == 1)
  94920. m = {m[1], toobj(args[2]), o = toobj(m[4][index(m[4], "(") + 1..index(m[4], ")") - 1]), o.name};
  94921. endif
  94922. this.messages = {@msgs, {new, m}};
  94923. this.last_msg_date = m[1];
  94924. this.last_used_time = time();
  94925. return new;
  94926. endif
  94927. .
  94928. #31:2
  94929. ":display_seq_headers(msg_seq[,cur])";
  94930. ":display_seq_full(msg_seq[,cur]) => {cur}";
  94931. if (!this:ok(caller, caller_perms()))
  94932. return E_PERM;
  94933. endif
  94934. cur = {@args, 0}[2];
  94935. read_date = {@args, $maxint, $maxint}[3];
  94936. last = (ldate = 0);
  94937. player:tell("       WHEN           WHO                           BY");
  94938. for x in (msgs = this:messages_in_seq(args[1]))
  94939. msgnum = $string_utils:right(last = x[1], 4, (cur == x[1]) ? ">" | " ");
  94940. ldate = x[2][1];
  94941. if (typeof(x[2][2]) != OBJ)
  94942. hdr = this:msg_summary_line(@x[2]);
  94943. else
  94944. hdr = tostr(ctime(ldate)[5..16], "   ", $string_utils:left(tostr(x[2][4], " (", x[2][3], ")"), 30), valid(w = x[2][2]) ? w.name | "??", " (", x[2][2], ")");
  94945. endif
  94946. player:tell(msgnum, (ldate > read_date) ? ":+ " | ":  ", hdr);
  94947. $command_utils:suspend_if_needed(0);
  94948. endfor
  94949. if (verb == "display_seq_full")
  94950. return {last, ldate};
  94951. else
  94952. player:tell("----+");
  94953. endif
  94954. .
  94955. #31:3
  94956. ":from_msg_seq(object or list[,mask])";
  94957. " => msg_seq of messages from any of these senders";
  94958. if (!this:ok(caller, caller_perms()))
  94959. return E_PERM;
  94960. endif
  94961. if (typeof(plist = args[1]) != LIST)
  94962. plist = {plist};
  94963. endif
  94964. i = 1;
  94965. fseq = {};
  94966. mask = {@args, {1}}[2];
  94967. for msg in (this.messages)
  94968. if ((!mask) || (i < mask[1]))
  94969. elseif ((length(mask) < 2) || (i < mask[2]))
  94970. if (msg[2][2] in plist)
  94971. fseq = $seq_utils:add(fseq, i, i);
  94972. endif
  94973. else
  94974. mask = mask[3..length(mask)];
  94975. endif
  94976. i = (i + 1);
  94977. $command_utils:suspend_if_needed(0);
  94978. endfor
  94979. return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or "));
  94980. .
  94981. #31:4
  94982. ":to_msg_seq(object or list[,mask]) => msg_seq of messages to those people";
  94983. if (!this:ok(caller, caller_perms()))
  94984. return E_PERM;
  94985. endif
  94986. if (typeof(plist = args[1]) != LIST)
  94987. plist = {plist};
  94988. endif
  94989. i = 1;
  94990. fseq = {};
  94991. mask = {@args, {1}}[2];
  94992. for msg in (this.messages)
  94993. if ((!mask) || (i < mask[1]))
  94994. elseif ((length(mask) < 2) || (i < mask[2]))
  94995. if (msg[2][3] in plist)
  94996. fseq = $seq_utils:add(fseq, i, i);
  94997. endif
  94998. else
  94999. mask = mask[3..length(mask)];
  95000. endif
  95001. i = (i + 1);
  95002. $command_utils:suspend_if_needed(0);
  95003. endfor
  95004. return fseq || ("%f %<has> no messages about @programmer'ing " + $string_utils:english_list(plist, "no one", " or "));
  95005. .
  95006. #31:5
  95007. ":%to_msg_seq/subject_msg_seq(string or list of strings[,mask])";
  95008. " => msg_seq of messages containing one of strings in the to line";
  95009. if (!this:ok(caller, caller_perms()))
  95010. return E_PERM;
  95011. endif
  95012. if (typeof(nlist = args[1]) != LIST)
  95013. nlist = {nlist};
  95014. endif
  95015. i = 1;
  95016. fseq = {};
  95017. mask = {@args, {1}}[2];
  95018. for msg in (this.messages)
  95019. if ((!mask) || (i < mask[1]))
  95020. elseif ((length(mask) < 2) || (i < mask[2]))
  95021. if (msg[2][4] in nlist)
  95022. fseq = $seq_utils:add(fseq, i, i);
  95023. endif
  95024. else
  95025. mask = mask[3..length(mask)];
  95026. endif
  95027. i = (i + 1);
  95028. $command_utils:suspend_if_needed(0);
  95029. endfor
  95030. return fseq || ("%f %<has> no messages about @programmer'ing " + $string_utils:english_list(nlist, "no one", " or "));
  95031. .
  95032. #31:6
  95033. return this.name + " doesn't understand %%from:";
  95034. .
  95035. #32:0
  95036. "WIZARDLY";
  95037. if (args)
  95038. "...check for an exact match first...";
  95039. search = args[1];
  95040. if (property_info(parent(this), search))
  95041. if (property_info(this, " " + search))
  95042. return {search};
  95043. endif
  95044. elseif (property_info(this, search))
  95045. return {search};
  95046. endif
  95047. "...search for partial matches, allowing for";
  95048. "...confusion between topics that do and don't start with @, and";
  95049. ".. confusion between - and _ characters.";
  95050. props = properties(this);
  95051. topics = {};
  95052. if (search[1] == "@")
  95053. search = search[2..length(search)];
  95054. endif
  95055. search = strsub(search, "-", "_");
  95056. if (!search)
  95057. "...don't try searching for partial matches if the string is empty or @";
  95058. "...we'd get *everything*...";
  95059. return {};
  95060. endif
  95061. for prop in (props)
  95062. if (((i = index(strsub(prop, "-", "_"), search)) == 1) || ((i == 2) && index(" @", prop[1])))
  95063. topics = {@topics, (prop[1] == " ") ? prop[2..length(prop)] | prop};
  95064. endif
  95065. endfor
  95066. return topics;
  95067. else
  95068. "...return list of all topics...";
  95069. props = setremove(properties(this), "");
  95070. for p in ($object_utils:all_properties(parent(this)))
  95071. if (i = ((" " + p) in props))
  95072. props = {p, @listdelete(props, i)};
  95073. endif
  95074. endfor
  95075. return props;
  95076. endif
  95077. .
  95078. #32:1
  95079. "WIZARDLY";
  95080. topic = args[1];
  95081. dblist = {@args, {}}[2];
  95082. text = (this.(topic) || this.(" " + topic));
  95083. if (typeof(text) == LIST)
  95084. if (text && (text[1] == (("*" + (vb = strsub(text[1], "*", ""))) + "*")))
  95085. text = this:(vb)(listdelete(text, 1), dblist);
  95086. endif
  95087. endif
  95088. return text;
  95089. .
  95090. #32:2
  95091. ":sort_topics(list_of_topics) -- sorts the given list of strings, assuming that they're help-system topic names";
  95092. buckets = "abcdefghijklmnopqrstuvwxyz";
  95093. keys = (names = $list_utils:make(length(buckets) + 1, {}));
  95094. for name in (setremove(args[1], ""))
  95095. key = (index(".@", name[1]) ? name[2..length(name)] + " " | name);
  95096. k = (index(buckets, key[1]) + 1);
  95097. bucket = keys[k];
  95098. i = $list_utils:find_insert(bucket, key);
  95099. keys[k] = listinsert(bucket, key, i);
  95100. names[k] = listinsert(names[k], name, i);
  95101. $command_utils:suspend_if_needed(0);
  95102. endfor
  95103. return $list_utils:append(@names);
  95104. .
  95105. #32:3
  95106. ":columnize(@list_of_strings) -- prints the given list of strings in 4 columns.";
  95107. sorted = {@args, "", "", ""};
  95108. n = (length(sorted) / 4);
  95109. su = $string_utils;
  95110. index = {};
  95111. for i in [1..n]
  95112. index = {@index, tostr(su:left(sorted[i], 20), su:left(sorted[i + n], 20), su:left(sorted[i + (2 * n)], 20), sorted[i + (3 * n)])};
  95113. $command_utils:suspend_if_needed(0);
  95114. endfor
  95115. return index;
  95116. .
  95117. #32:4
  95118. "{\"*forward*\", topic, @rest}  => text for topic from this help db.";
  95119. "{\"*pass*\",    topic, @rest}  => text for topic from next help db.";
  95120. "In both cases the text of @rest is appended.  ";
  95121. "@rest may in turn begin with a *<verb>*";
  95122. text = args[1];
  95123. dblist = {@args, {}}[2];
  95124. if (verb == "forward")
  95125. first = this:get_topic(text[1], dblist);
  95126. elseif ((result = $code_utils:help_db_search(text[1], dblist)) && ((db = result[1]) != $ambiguous_match))
  95127. first = db:get_topic(result[2], dblist[(db in dblist) + 1..length(dblist)]);
  95128. else
  95129. first = {};
  95130. endif
  95131. if (2 <= (len = length(text)))
  95132. if (text[2] == (("*" + (vb = strsub(text[2], "*", ""))) + "*"))
  95133. return {@first, @this:(vb)(text[3..len], dblist)};
  95134. else
  95135. return {@first, @text[2..len]};
  95136. endif
  95137. else
  95138. return first;
  95139. endif
  95140. .
  95141. #32:5
  95142. "{\"*subst*\", @text} => text with the following substitutions:";
  95143. "  \"...%[expr]....\" => \"...\"+value of expr (assumed to be a string)+\"....\"";
  95144. "  \"%;expr\"         => @(value of expr (assumed to be a list of strings))";
  95145. newlines = {};
  95146. for old in (args[1])
  95147. new = "";
  95148. bomb = 0;
  95149. while ((prcnt = index(old, "%")) && (prcnt < length(old)))
  95150. new = (new + old[1..prcnt - 1]);
  95151. code = old[prcnt + 1];
  95152. old = old[prcnt + 2..length(old)];
  95153. if (code == "[")
  95154. prog = "";
  95155. while ((b = index(old + "]", "]")) > (p = index(old + "%", "%")))
  95156. prog = ((prog + old[1..p - 1]) + old[p + 1]);
  95157. old = old[p + 2..length(old)];
  95158. endwhile
  95159. prog = (prog + old[1..b - 1]);
  95160. old = old[b + 1..length(old)];
  95161. value = $no_one:eval_d(prog);
  95162. if (value[1])
  95163. new = tostr(new, value[2]);
  95164. else
  95165. new = tostr(new, $string_utils:print(value[2]));
  95166. bomb = 1;
  95167. endif
  95168. elseif ((code != ";") || new)
  95169. new = ((new + "%") + code);
  95170. else
  95171. value = $no_one:eval_d(old);
  95172. if (value[1] && (typeof(r = value[2]) == LIST))
  95173. newlines = {@newlines, @r[1..length(r) - 1]};
  95174. new = tostr(r[length(r)]);
  95175. else
  95176. new = tostr(new, $string_utils:print(value[2]));
  95177. bomb = 1;
  95178. endif
  95179. old = "";
  95180. endif
  95181. endwhile
  95182. if (bomb)
  95183. newlines = {@newlines, new + old, tostr("@@@ Helpfile alert:  Previous line is messed up; notify ", this.owner.wizard ? "" | tostr(this.owner.name, " (", this.owner, ") or "), "a wizard. @@@")};
  95184. else
  95185. newlines = {@newlines, new + old};
  95186. endif
  95187. endfor
  95188. return newlines;
  95189. .
  95190. #32:6
  95191. "{\"*index*\" [, title]}";
  95192. "This produces a columnated list of topics in this help db, headed by title.";
  95193. $command_utils:suspend_if_needed(0);
  95194. title = (args[1] ? args[1][1] | tostr(this.name, " (", this, ")"));
  95195. su = $string_utils;
  95196. return {"", title, su:from_list($list_utils:map_arg(su, "space", su:explode(title), "-"), " "), @this:columnize(@this:sort_topics(this:find_topics()))};
  95197. .
  95198. #32:7
  95199. pass(@args);
  95200. if ($perm_utils:controls(caller_perms(), this))
  95201. this.r = 1;
  95202. this.f = 0;
  95203. endif
  95204. .
  95205. #32:8
  95206. "{\"*verbdoc*\", \"object\", \"verbname\"}  use documentation for this verb";
  95207. set_task_perms(this.owner);
  95208. if (!valid(object = $string_utils:match_object(args[1][1], player.location)))
  95209. return E_INVARG;
  95210. elseif (!(hv = $object_utils:has_verb(object, vname = args[1][2])))
  95211. return E_VERBNF;
  95212. else
  95213. return $code_utils:verb_documentation(hv[1], vname);
  95214. endif
  95215. .
  95216. #32:9
  95217. if (typeof(text = this.(fulltopic = args[1])) == ERR)
  95218. return text;
  95219. else
  95220. return {tostr(";;", $code_utils:corify_object(this), ".(", $string_utils:print(fulltopic), ") = $command_utils:read_lines()"), @$command_utils:dump_lines(text)};
  95221. endif
  95222. .
  95223. #33:0
  95224. player:tell("Sorry, but guest characters are not allowed to change their passwords.");
  95225. .
  95226. #33:1
  95227. if (!caller_perms().wizard)
  95228. return;
  95229. endif
  95230. player = this;
  95231. this:notify(tostr("Sorry, but you've been here for ", $string_utils:from_seconds(connected_seconds(this)), " and someone else wants to be a guest now.  Feel free to come back", @$login:player_creation_enabled(player) ? {" or even create your own character if you want..."} | ($login.registration_address ? {" or send mail to ", $login.registration_address, " to obtain a character of your own."} | {"."})));
  95232. fork (0)
  95233. oldloc = this.location;
  95234. move(this, #-1);
  95235. move(this, this.home);
  95236. "..force enterfunc to be called so that the newbie gets a room description.";
  95237. if ($object_utils:isa(oldloc, $room))
  95238. oldloc:announce("In the distance you hear someone's alarm clock going off.");
  95239. if (oldloc != this.location)
  95240. oldloc:announce(this.name, " wavers and vanishes into insubstantial mist.");
  95241. else
  95242. oldloc:announce(this.name, " undergoes a wrenching personality shift.");
  95243. endif
  95244. endif
  95245. endfork
  95246. .
  95247. #33:2
  95248. this:log_disconnect();
  95249. fork (0)
  95250. if (this.location != this.home)
  95251. this:room_announce("The housekeeper arrives to remove ", this.name, ".");
  95252. move(this, this.home);
  95253. endif
  95254. for x in ({"paranoid", "lines", "responsible", "linelen", "linebuffer", "brief", "gaglist", "rooms", "pagelen", "current_message", "current_folder", "messages", "request"})
  95255. if ($object_utils:has_property($guest, x))
  95256. clear_property(this, x);
  95257. endif
  95258. endfor
  95259. this:set_description(this.default_description);
  95260. this:set_gender(this.default_gender);
  95261. for x in (this.contents)
  95262. this:eject(x);
  95263. endfor
  95264. for x in (this.features)
  95265. this:remove_feature(x);
  95266. endfor
  95267. this:clear_refusals();
  95268. for x in ($object_utils:descendants($generic_editor))
  95269. if (loc = (this in x.active))
  95270. x:kill_session(loc);
  95271. endif
  95272. endfor
  95273. endfork
  95274. pass(@args);
  95275. .
  95276. #33:3
  95277. "Called by #0:connect_player when this object is about to be used as the next guest character.  Usually returns `this', but if for some reason some other guest character should be used, that player object is returned instead";
  95278. if (!caller_perms().wizard)
  95279. "...caller is not :do_login_command; doesn't matter what we return...";
  95280. return this;
  95281. elseif ($login:blacklisted($string_utils:connection_hostname(connection_name(player))))
  95282. return #-2;
  95283. elseif (!(this in connected_players()))
  95284. "...not logged in, no problemo...";
  95285. return this;
  95286. endif
  95287. longest = 900;
  95288. "...guests get 15 minutes before they can be dislodged...";
  95289. candidate = #-1;
  95290. free = {};
  95291. for g in (children($guest))
  95292. if (!is_player(g))
  95293. "...a toaded guest?...";
  95294. elseif (!(g in connected_players()))
  95295. "...yay; found an unused guest...";
  95296. free = {@free, g};
  95297. elseif ((t = connected_seconds(g)) > longest)
  95298. longest = t;
  95299. candidate = g;
  95300. endif
  95301. endfor
  95302. if (free)
  95303. candidate = free[random(length(free))];
  95304. elseif (valid(candidate))
  95305. "...someone's getting bumped...";
  95306. candidate:boot();
  95307. endif
  95308. return candidate;
  95309. .
  95310. #33:4
  95311. return;
  95312. .
  95313. #33:5
  95314. if ($login:player_creation_enabled(player))
  95315. player:tell("First @quit, then connect to the MOO again and, rather than doing `connect guest' do `create <name> <password>'");
  95316. else
  95317. player:tell($login:registration_string());
  95318. endif
  95319. .
  95320. #33:6
  95321. return pass(@args);
  95322. .
  95323. #33:7
  95324. ":log(islogin,time,where) adds an entry to the connection log for this guest.";
  95325. if (caller != this)
  95326. return E_PERM;
  95327. elseif (length(this.connect_log) < this.max_connect_log)
  95328. this.connect_log = {args, @this.connect_log};
  95329. else
  95330. this.connect_log = {args, @this.connect_log[1..this.max_connect_log - 1]};
  95331. endif
  95332. .
  95333. #33:8
  95334. if (valid(caller_perms()) && (caller != this))
  95335. return E_PERM;
  95336. else
  95337. $guest_log:enter(1, time(), $string_utils:connection_hostname(connection_name(this)));
  95338. ret = pass(@args);
  95339. this:tell_lines($string_utils:pronoun_sub(this.extra_confunc_msg));
  95340. return ret;
  95341. endif
  95342. .
  95343. #33:9
  95344. if (caller != this)
  95345. return E_PERM;
  95346. else
  95347. cname = (connection_name(this) || this.last_connect_place);
  95348. $guest_log:enter(0, time(), $string_utils:connection_hostname(cname));
  95349. endif
  95350. .
  95351. #33:10
  95352. if (!valid(caller_perms()))
  95353. player:tell("Sorry, that information is not available.");
  95354. endif
  95355. .
  95356. #33:11
  95357. hash = tonum(caller_perms());
  95358. host = $string_utils:connection_hostname(this.last_connect_place);
  95359. for i in [1..length(host)]
  95360. hash = ((hash * 14) + index($string_utils.ascii, host[i]));
  95361. endfor
  95362. return crypt(tostr(hash), @args);
  95363. .
  95364. #33:12
  95365. if (caller_perms() != this)
  95366. return E_PERM;
  95367. else
  95368. return pass(@args);
  95369. endif
  95370. .
  95371. #33:13
  95372. return pass(@args);
  95373. .
  95374. #33:14
  95375. return pass(@args);
  95376. "only for setting permission";
  95377. .
  95378. #33:15
  95379. "Usage:  @request <name> for <email-address>";
  95380. if (player != this)
  95381. return player:tell(E_PERM);
  95382. endif
  95383. name = dobjstr;
  95384. address = iobjstr;
  95385. connection = $string_utils:connection_hostname(connection_name(player));
  95386. if (this.request)
  95387. return player:tell("Sorry, you appear to have already requested a character.");
  95388. endif
  95389. if (index(address = iobjstr, " "))
  95390. return player:notify_lines($code_utils:verb_usage());
  95391. elseif (reason = $wiz_utils:check_player_request(name, address, connection))
  95392. if (reason[1] == "-")
  95393. reason = (reason[2..length(reason)] + " Please ");
  95394. else
  95395. reason = (reason + " Please try again, or, to register another way, ");
  95396. endif
  95397. player:tell(reason, " mail to ", $login.registration_address, " with the character name you want.");
  95398. return;
  95399. endif
  95400. while (typeof(answer = $command_utils:yes_or_no(("Generally, only one character per real person is allowed. For more details, read `help multiple-characters'. Do you already have (or have you already requested) a " + $network.moo_name) + " character?")) == ERR)
  95401. endwhile
  95402. if (answer)
  95403. return player:tell("Character request processing ended.");
  95404. endif
  95405. if (!$network.active)
  95406. $mail_agent:send_message(this, $registration_db.registrar, "Player request", {"Player request from " + connection, ":", "", (("@make-player " + name) + " ") + address});
  95407. player:tell("Request for new character ", name, " email address '", address, "' accepted. Please be patient until the registrar gets around to it. If you don't get email within a week, please send regular email to ", $login.registration_address, ".");
  95408. elseif ($player_db.frozen)
  95409. player:tell("Sorry, can't create any new players right now.  Try again in a few minutes.");
  95410. else
  95411. new = $wiz_utils:make_player(name, address);
  95412. password = new[2];
  95413. new = new[1];
  95414. player:tell("Character ", name, " (", new, ") created, mailing password to ", address, "; you should get the mail very soon.");
  95415. player:tell("If you do not get it, please do NOT request another character. Send regular email to ", $login.registration_address, ", with the name of the character you requested.");
  95416. $mail_agent:send_message($new_player_log.autoregistration_player, $new_player_log, tostr(name, " (", new, ")"), {address, (" Automatically created at request of player from " + connection) + "."});
  95417. $wiz_utils:send_new_player_mail(tostr("A guest connected from ", connection, " at ", ctime(), " requested a character on ", $network.moo_name, " for email address ", address, "."), name, address, new, password);
  95418. this.request = 1;
  95419. return;
  95420. endif
  95421. .
  95422. #33:16
  95423. if (caller_perms().wizard)
  95424. this.extra_confunc_msg = "";
  95425. endif
  95426. .
  95427. #33:17
  95428. "disallow guests from setting aliases on themselves";
  95429. if ($perm_utils:controls(caller_perms(), this))
  95430. return pass(@args);
  95431. else
  95432. return E_PERM;
  95433. endif
  95434. .
  95435. #35:0
  95436. "   add(seq,start,end) => seq with range added.";
  95437. "remove(seq,start,end) => seq with range removed.";
  95438. "  both assume start<=end.";
  95439. seq = args[1];
  95440. start = args[2];
  95441. s = ((start == $minint) ? 1 | $list_utils:find_insert(seq, start - 1));
  95442. e = $list_utils:find_insert(seq, after = (args[3] + 1));
  95443. remove = (verb == "remove");
  95444. return {@seq[1..s - 1], @((s + remove) % 2) ? {start} | {}, @((e + remove) % 2) ? {after} | {}, @seq[e..length(seq)]};
  95445. .
  95446. #35:1
  95447. ":contains(seq,elt) => true iff elt is in seq.";
  95448. return ($list_utils:find_insert(@args) + 1) % 2;
  95449. .
  95450. #35:2
  95451. ":complement(seq) => the sequence containing all integers *not* in seq.";
  95452. seq = args[1];
  95453. if (seq && (seq[1] == $minint))
  95454. return listdelete(seq, 1);
  95455. else
  95456. return {$minint, @seq};
  95457. endif
  95458. .
  95459. #35:3
  95460. ":union(seq1,seq2,...) => union of all sequences...";
  95461. ":intersection(seq1,seq2,...) => intersection of all sequences...";
  95462. intersect = (verb != "union");
  95463. if ({} in args)
  95464. if (intersect)
  95465. return {};
  95466. else
  95467. args = $list_utils:setremove_all(args, {});
  95468. endif
  95469. endif
  95470. if ((alen = length(args)) <= 1)
  95471. return args ? args[1] | (intersect ? {$minint} | {});
  95472. else
  95473. if (intersect)
  95474. args = $list_utils:map_arg(this, "complement", args);
  95475. endif
  95476. lens = {length(args[1])};
  95477. for a in (listdelete(args, 1))
  95478. lens = {@lens, length(a)};
  95479. endfor
  95480. args = $list_utils:sort(args, lens);
  95481. lens = $list_utils:sort(lens);
  95482. for ll in [-length(lens)..-2]
  95483. second = args[2];
  95484. for i in [1..length(first = args[1]) / 2]
  95485. second = this:add(second, first[(2 * i) - 1], first[2 * i] - 1);
  95486. endfor
  95487. if (length(first) % 2)
  95488. s = $list_utils:find_insert(second, (start = first[length(first)]) - 1);
  95489. second = {@second[1..s - 1], @(s % 2) ? {start} | {}};
  95490. endif
  95491. i = $list_utils:find_insert(lens = lens[3..-ll], slen = length(second));
  95492. lens = listinsert(lens, slen, i);
  95493. args = listinsert(args[3..-ll], second, i);
  95494. endfor
  95495. return intersect ? this:complement(second) | second;
  95496. endif
  95497. .
  95498. #35:4
  95499. if (!(seq = args[1]))
  95500. return "empty";
  95501. endif
  95502. e = tostr((seq[1] == $minint) ? "" | seq[1]);
  95503. for i in [2..length(seq)]
  95504. e = (e + ((i % 2) ? tostr(", ", seq[i]) | ((seq[i] == (seq[i - 1] + 1)) ? "" | tostr("..", seq[i] - 1))));
  95505. endfor
  95506. return e + ((length(seq) % 2) ? ".." | "");
  95507. .
  95508. #35:5
  95509. ":for([n,]seq,obj,verb,@args) => for s in (seq) obj:verb(s,@args); endfor";
  95510. if (typeof(n = args[1]) == NUM)
  95511. args = listdelete(args, 1);
  95512. seq = args[1];
  95513. else
  95514. seq = n;
  95515. n = 1;
  95516. endif
  95517. if (seq[1] == $minint)
  95518. return E_RANGE;
  95519. endif
  95520. object = args[2];
  95521. vname = args[3];
  95522. args = args[4..length(args)];
  95523. for r in [1..length(seq) / 2]
  95524. for i in [seq[(2 * r) - 1]..seq[2 * r] - 1]
  95525. if (typeof(object:(vname)(@listinsert(args, i, n))) == ERR)
  95526. return;
  95527. endif
  95528. endfor
  95529. endfor
  95530. if (length(seq) % 2)
  95531. i = seq[length(seq)];
  95532. while (1)
  95533. if (typeof(object:(vname)(@listinsert(args, i, n))) == ERR)
  95534. return;
  95535. endif
  95536. i = (i + 1);
  95537. endwhile
  95538. endif
  95539. .
  95540. #35:6
  95541. "extract(seq,array) => list of elements of array with indices in seq.";
  95542. if (alen = length(array = args[2]))
  95543. e = $list_utils:find_insert(seq = args[1], 1);
  95544. s = $list_utils:find_insert(seq, alen);
  95545. seq = {@(e % 2) ? {} | {1}, @seq[e..s - 1], @(s % 2) ? {} | {alen + 1}};
  95546. ret = {};
  95547. for i in [1..length(seq) / 2]
  95548. $command_utils:suspend_if_needed(0);
  95549. ret = {@ret, @array[seq[(2 * i) - 1]..seq[2 * i] - 1]};
  95550. endfor
  95551. return ret;
  95552. else
  95553. return {};
  95554. endif
  95555. .
  95556. #35:7
  95557. seq = args[1];
  95558. if (!seq)
  95559. return {};
  95560. else
  95561. if (length(seq) % 2)
  95562. seq = {@seq, $minint};
  95563. endif
  95564. l = {};
  95565. for i in [1..length(seq) / 2]
  95566. for j in [seq[(2 * i) - 1]..seq[2 * i] - 1]
  95567. l = {@l, j};
  95568. endfor
  95569. endfor
  95570. return l;
  95571. endif
  95572. .
  95573. #35:8
  95574. ":fromlist(list) => corresponding sequence.";
  95575. return this:from_sorted_list($list_utils:sort(args[1]));
  95576. .
  95577. #35:9
  95578. ":from_sorted_list(sorted_list) => corresponding sequence.";
  95579. if (!(lst = args[1]))
  95580. return {};
  95581. else
  95582. seq = {i = lst[1]};
  95583. next = (i + 1);
  95584. for i in (listdelete(lst, 1))
  95585. if (i != next)
  95586. seq = {@seq, next, i};
  95587. endif
  95588. next = (i + 1);
  95589. endfor
  95590. return (next == $minint) ? seq | {@seq, next};
  95591. endif
  95592. .
  95593. #35:10
  95594. return (seq = args[1]) ? seq[1] | E_NONE;
  95595. .
  95596. #35:11
  95597. return (seq = args[1]) ? ((len = length(seq)) % 2) ? $minint - 1 | (seq[len] - 1) | E_NONE;
  95598. .
  95599. #35:12
  95600. ":size(seq) => number of elements in seq";
  95601. "  for sequences consisting of more than half of the 4294967298 available integers, this returns a negative number, which can either be interpreted as (cardinality - 4294967298) or -(size of complement sequence)";
  95602. n = 0;
  95603. for i in (seq = args[1])
  95604. n = (i - n);
  95605. endfor
  95606. return (length(seq) % 2) ? $minint - n | n;
  95607. .
  95608. #35:13
  95609. ":from_string(string) => corresponding sequence or E_INVARG";
  95610. "  string should be a comma separated list of numbers and";
  95611. "  number..number ranges";
  95612. su = $string_utils;
  95613. if (!(words = su:explode(su:strip_chars(args[1], " "), ",")))
  95614. return {};
  95615. endif
  95616. parts = {};
  95617. for word in (words)
  95618. to = index(word, "..");
  95619. if ((!to) && su:is_numeric(word))
  95620. part = {tonum(word), tonum(word) + 1};
  95621. elseif (to)
  95622. if (to == 1)
  95623. start = $minint;
  95624. elseif (su:is_numeric(start = word[1..to - 1]))
  95625. start = tonum(start);
  95626. else
  95627. return E_INVARG;
  95628. endif
  95629. end = word[to + 2..length(word)];
  95630. if (!end)
  95631. part = {start};
  95632. elseif (!su:is_numeric(end))
  95633. return E_INVARG;
  95634. elseif ((end = tonum(end)) >= start)
  95635. part = {start, end + 1};
  95636. else
  95637. part = {};
  95638. endif
  95639. else
  95640. return E_INVARG;
  95641. endif
  95642. parts = {@parts, part};
  95643. endfor
  95644. return this:union(@parts);
  95645. .
  95646. #35:14
  95647. ":firstn(seq,n) => first n elements of seq as a sequence.";
  95648. if ((n = args[2]) <= 0)
  95649. return {};
  95650. endif
  95651. l = length(seq = args[1]);
  95652. s = 1;
  95653. while (s <= l)
  95654. n = (n + seq[s]);
  95655. if ((s >= l) || (n <= seq[s + 1]))
  95656. return {@seq[1..s], n};
  95657. endif
  95658. n = (n - seq[s + 1]);
  95659. s = (s + 2);
  95660. endwhile
  95661. return seq;
  95662. .
  95663. #35:15
  95664. ":lastn(seq,n) => last n elements of seq as a sequence.";
  95665. n = args[2];
  95666. if ((l = length(seq = args[1])) % 2)
  95667. return {$minint - n};
  95668. else
  95669. s = l;
  95670. while (s)
  95671. n = (seq[s] - n);
  95672. if (n >= seq[s - 1])
  95673. return {n, @seq[s..l]};
  95674. endif
  95675. n = (seq[s - 1] - n);
  95676. s = (s - 2);
  95677. endwhile
  95678. return seq;
  95679. endif
  95680. .
  95681. #35:16
  95682. ":range(start,end) => sequence corresponding to [start..end] range";
  95683. return ((start = args[1]) <= (end = args[2])) ? {start, end + 1} | {};
  95684. .
  95685. #36:0
  95686. if (caller_perms().wizard)
  95687. pass();
  95688. delete_verb(this, "is_readable_by");
  95689. delete_verb(this, "is_usable_by");
  95690. delete_verb(this, "mail_notify");
  95691. "...remove references to ARB...";
  95692. this:rm_message_seq({1, 1 + this:length_all_msgs()});
  95693. this:expunge_rmm();
  95694. this.mail_forward = {player, this};
  95695. this.mail_notify = {player};
  95696. for p in ({"moderator_forward", "moderator_notify", "writers", "readers", "expire_period", "last_used_time"})
  95697. this.(p) = $mail_recipient.(p);
  95698. endfor
  95699. this.moderated = 1;
  95700. else
  95701. return E_PERM;
  95702. endif
  95703. .
  95704. #37:0
  95705. return $gender_utils:get_conj(args[1], this);
  95706. x = args[1];
  95707. len = length(x);
  95708. if ((len > 3) && (rindex(x, "n't") == (len - 3)))
  95709. return this:verb_sub(x[1..len - 3]) + "n't";
  95710. endif
  95711. for y in (this.conjugations)
  95712. if (x == y[1])
  95713. return y[2];
  95714. endif
  95715. endfor
  95716. for y in ({{"ches", "ch"}, {"ies", "y"}, {"sses", "ss"}, {"shes", "sh"}, {"s", ""}})
  95717. if ((len > length(y[1])) && (rindex(x, y[1]) == ((len - length(y[1])) + 1)))
  95718. return x[1..len - length(y[1])] + y[2];
  95719. endif
  95720. endfor
  95721. return x;
  95722. .
  95723. #37:1
  95724. "$you:say_action(message [,who [,thing, [,where]]]).";
  95725. "announce 'message' with pronoun substitution as if it were just ";
  95726. "  where:announce_all($string_utils:pronoun_sub(message, who, thing, where)); ";
  95727. "except that who (player), dobj, and iobj get modified messages, with the appropriate use of 'you' instead of their name.";
  95728. "who   default player";
  95729. "thing default object that called this verb";
  95730. "where default who.location";
  95731. msg = args[1];
  95732. who = ((length(args) >= 2) ? args[2] | player);
  95733. thing = ((length(args) >= 3) ? args[3] | caller);
  95734. where = ((length(args) >= 4) ? args[4] | who.location);
  95735. you = this;
  95736. if (typeof(msg) == LIST)
  95737. tell = "";
  95738. for x in (msg)
  95739. tell = (tell + ((typeof(x) == STR) ? x | x[random(length(x))]));
  95740. endfor
  95741. else
  95742. tell = msg;
  95743. endif
  95744. who:tell($string_utils:pronoun_sub(this:fixpos(tell, "%n"), you, thing, where));
  95745. if ($object_utils:has_callable_verb(where, "announce_all_but"))
  95746. where:announce_all_but({dobj, who, iobj}, $string_utils:pronoun_sub(tell, who, thing, where));
  95747. endif
  95748. if (valid(dobj) && (dobj != who))
  95749. x = dobj;
  95750. dobj = you;
  95751. x:tell($string_utils:pronoun_sub(this:fixpos(tell, "%d"), who, thing, where));
  95752. dobj = x;
  95753. endif
  95754. if (valid(iobj) && (!(iobj in {who, dobj})))
  95755. x = iobj;
  95756. iobj = you;
  95757. x:tell($string_utils:pronoun_sub(this:fixpos(tell, "%i"), who, thing, where));
  95758. iobj = x;
  95759. endif
  95760. .
  95761. #37:2
  95762. which = (args[2] + "'s");
  95763. return strsub(strsub(args[1], which, "your"), $string_utils:uppercase(which), "Your");
  95764. .
  95765. #39:0
  95766. "find(string[,n]) => datum corresponding to string with the search starting at node \" \"+string[1..n], n defaults to 0 (root node), $ambiguous_match or $failed_match";
  95767. "find_key(string[,n]) is like :find but returns the full string key rather than the associated datum.  Note that if several string keys present in the db share a common prefix, :find_key(prefix) will return $ambiguous_match, but if there is a unique datum associated with all of these strings :find(prefix) will return it rather than $ambiguous_match.";
  95768. "Assumes n<=length(string)";
  95769. rest = (search = args[1]);
  95770. sofar = {@args, 0}[2];
  95771. prefix = search[1..sofar];
  95772. rest[1..sofar] = "";
  95773. info = this.(" " + prefix);
  95774. data = ((verb == "find") ? this.data | 3);
  95775. if (i = (search in info[3]))
  95776. "...exact match for one of the strings in this node...";
  95777. return info[data][i];
  95778. elseif (index(info[1], rest) == 1)
  95779. "...ambiguous iff there's more than one object represented in this node..";
  95780. return this:_only(prefix, data);
  95781. elseif (index(rest, info[1]) != 1)
  95782. "...search string doesn't agree with common portion...";
  95783. return $failed_match;
  95784. elseif (index(info[2], search[nsofar = ((sofar + length(info[1])) + 1)]))
  95785. "...search string follows one of continuations leading to other nodes...";
  95786. return this:(verb)(search, nsofar);
  95787. else
  95788. "...search string may partially match one of the strings in this node...";
  95789. for i in [1..length(exacts = info[3])]
  95790. if (index(exacts[i], search) == 1)
  95791. return info[data][i];
  95792. endif
  95793. endfor
  95794. return $failed_match;
  95795. endif
  95796. .
  95797. #39:1
  95798. rest = (search = args[1]);
  95799. sofar = {@args, 0}[2];
  95800. prefix = search[1..sofar];
  95801. rest[1..sofar] = "";
  95802. info = this.(" " + prefix);
  95803. if (i = (search in info[3]))
  95804. return info[this.data][i];
  95805. elseif ((length(rest) <= (common = length(info[1]))) || (rest[1..common] != info[1]))
  95806. return $failed_match;
  95807. elseif (index(info[2], search[(sofar + common) + 1]))
  95808. return this:find_exact(search, (sofar + common) + 1);
  95809. else
  95810. return $failed_match;
  95811. endif
  95812. .
  95813. #39:2
  95814. ":find_all(string [,n=0])";
  95815. "assumes n <= length(string)";
  95816. rest = (search = args[1]);
  95817. sofar = {@args, 0}[2];
  95818. prefix = search[1..sofar];
  95819. rest[1..sofar] = "";
  95820. info = this.(" " + prefix);
  95821. data = ((verb == "find_all") ? this.data | 3);
  95822. if (index(info[1], rest) == 1)
  95823. "...return entire subtree.";
  95824. return this:((data == 3) ? "_every_key" | "_every")(prefix);
  95825. elseif (index(rest, info[1]) != 1)
  95826. "...common portion doesn't agree.";
  95827. return {};
  95828. elseif (index(info[2], rest[1 + (common = length(info[1]))]))
  95829. "...matching strings are in a subnode.";
  95830. return this:(verb)(search, (sofar + common) + 1);
  95831. else
  95832. "...matching string is in info[3].  length(rest) > common,";
  95833. "...so there will be at most one matching string.";
  95834. for i in [1..length(info[3])]
  95835. if (index(info[3][i], search) == 1)
  95836. return {info[data][i]};
  95837. endif
  95838. endfor
  95839. return {};
  95840. endif
  95841. .
  95842. #39:3
  95843. ":_only(prefix,data) => if all strings in this node have the same datum, return it, otherwise, return $ambiguous_match.";
  95844. prefix = args[1];
  95845. data = args[2];
  95846. info = this.(" " + prefix);
  95847. if (data == 3)
  95848. "... life is much simpler if there's no separate datum.";
  95849. "... if there's more than one string here, we barf.";
  95850. if (info[2] || (length(info[3]) > 1))
  95851. return $ambiguous_match;
  95852. elseif (info[3])
  95853. return info[3][1];
  95854. else
  95855. "..this can only happen with the root node of an empty db.";
  95856. return $failed_match;
  95857. endif
  95858. elseif (info[2])
  95859. what = this:_only(tostr(prefix, info[1], info[2][1]), data);
  95860. if (what == $ambiguous_match)
  95861. return what;
  95862. endif
  95863. elseif (info[data])
  95864. what = info[data][1];
  95865. info[data] = listdelete(info[data], 1);
  95866. else
  95867. "..this can only happen with the root node of an empty db.";
  95868. return $failed_match;
  95869. endif
  95870. for x in (info[data])
  95871. if (what != x)
  95872. return $ambiguous_match;
  95873. endif
  95874. endfor
  95875. for i in [2..length(info[2])]
  95876. if (what != this:_only(tostr(prefix, info[1], info[2][i]), data))
  95877. return $ambiguous_match;
  95878. endif
  95879. endfor
  95880. return what;
  95881. .
  95882. #39:4
  95883. info = this.(" " + args[1]);
  95884. prefix = (args[1] + info[1]);
  95885. r = $list_utils:remove_duplicates(info[4]);
  95886. for i in [1..length(branches = info[2])]
  95887. for new in (this:_every(prefix + branches[i]))
  95888. r = setadd(r, new);
  95889. endfor
  95890. endfor
  95891. return r;
  95892. .
  95893. #39:5
  95894. info = this.(" " + args[1]);
  95895. prefix = (args[1] + info[1]);
  95896. r = info[3];
  95897. for i in [1..length(branches = info[2])]
  95898. for new in (this:_every_key(prefix + branches[i]))
  95899. r = setadd(r, new);
  95900. endfor
  95901. endfor
  95902. return r;
  95903. .
  95904. #39:6
  95905. ":insert([n,]string,datum) -- inserts <string,datum> correspondence into tree starting at node \" \"+string[1..n], n defaulting to 0 (root node).";
  95906. "Assumes length(string) >= n";
  95907. "Returns {old_datum} (or 1) if there was a <string,old_datum> correspondence there before, otherwise returns 0";
  95908. if (!($perm_utils:controls(caller_perms(), this) || (caller == this)))
  95909. return E_PERM;
  95910. endif
  95911. has_datum = (this.data > 3);
  95912. if (typeof(sofar = args[1]) == NUM)
  95913. search = args[2];
  95914. datum = (has_datum ? args[3] | 0);
  95915. else
  95916. search = sofar;
  95917. sofar = 0;
  95918. datum = (has_datum ? args[2] | 0);
  95919. endif
  95920. prefix = search[1..sofar];
  95921. info = this.(" " + prefix);
  95922. if (i = (search in info[3]))
  95923. "... exact match ...";
  95924. if (has_datum)
  95925. previous = {info[this.data][i]};
  95926. info[this.data][i] = datum;
  95927. this:set_node(prefix, @info);
  95928. return previous;
  95929. else
  95930. return 1;
  95931. endif
  95932. endif
  95933. rest = search;
  95934. rest[1..sofar] = "";
  95935. if (index(rest, info[1]) != 1)
  95936. "... find where new string disagrees with common portion...";
  95937. c = ($string_utils:common(rest, info[1]) + 1);
  95938. "... make a new node with a shorter common portion....";
  95939. this:make_node(prefix + info[1][1..c], @listset(info, info[1][c + 1..length(info[1])], 1));
  95940. this:set_node(prefix, info[1][1..c - 1], info[1][c], {search}, @has_datum ? {{datum}} | {});
  95941. return 0;
  95942. elseif (rest == info[1])
  95943. ".. new string == common portion, insert...";
  95944. info[3] = {@info[3], search};
  95945. if (has_datum)
  95946. info[this.data] = {@info[this.data], datum};
  95947. endif
  95948. this:set_node(prefix, @info);
  95949. return 0;
  95950. elseif (index(info[2], search[nsofar = ((sofar + length(info[1])) + 1)]))
  95951. "... new string matches pre-existing continuation. insert in subnode....";
  95952. return this:insert(nsofar, search, datum);
  95953. else
  95954. "... new string may blow away one of the exact matches (i.e., matches one of them up to the first character beyond the common portion) in which case we need to create a new subnode....";
  95955. s = search[1..nsofar];
  95956. for m in (info[3])
  95957. if (index(m, s) == 1)
  95958. i = (m in info[3]);
  95959. "... we know m != search ...";
  95960. "... string m has been blown away.  create new node ...";
  95961. cbegin = (cafter = (length(s) + 1));
  95962. cend = $string_utils:common(search, m);
  95963. this:make_node(s, m[cbegin..cend], "", {search, m}, @has_datum ? {{datum, info[this.data][i]}} | {});
  95964. this:set_node(prefix, info[1], info[2] + s[nsofar], listdelete(info[3], i), @has_datum ? {listdelete(info[this.data], i)} | {});
  95965. return 0;
  95966. endif
  95967. endfor
  95968. "... new string hasn't blown away any of the exact matches, insert it as a new exact match...";
  95969. info[3] = {search, @info[3]};
  95970. if (has_datum)
  95971. info[this.data] = {datum, @info[this.data]};
  95972. endif
  95973. this:set_node(prefix, @info);
  95974. return 0;
  95975. endif
  95976. .
  95977. #39:7
  95978. ":delete(string[,n]) deletes any <string,something> pair from the tree starting at node \" \"+string[1..n], n defaulting to 0 (root node)";
  95979. "Returns {something} if such a pair existed, otherwise returns 0";
  95980. "If that node is not the root node and ends up containing only one string and no subnodes, we kill it and return {something,string2,something2} where <string2,something2> is the remaining pair.";
  95981. if (!($perm_utils:controls(caller_perms(), this) || (caller == this)))
  95982. return E_PERM;
  95983. endif
  95984. rest = (search = args[1]);
  95985. sofar = {@args, 0}[2];
  95986. prefix = search[1..sofar];
  95987. rest[1..sofar] = "";
  95988. info = this.(" " + prefix);
  95989. if (i = (search in info[3]))
  95990. previous = {info[this.data][i]};
  95991. info[3] = listdelete(info[3], i);
  95992. if (this.data > 3)
  95993. info[this.data] = listdelete(info[this.data], i);
  95994. endif
  95995. elseif ((rest == info[1]) || ((index(rest, info[1]) != 1) || (!index(info[2], search[d = ((sofar + length(info[1])) + 1)]))))
  95996. "... hmm string isn't in here...";
  95997. return 0;
  95998. elseif ((previous = this:delete(search, d)) && (length(previous) > 1))
  95999. i = index(info[2], search[d]);
  96000. info[2][i..i] = "";
  96001. info[3] = {previous[2], @info[3]};
  96002. if (this.data > 3)
  96003. info[this.data] = {previous[3], @info[this.data]};
  96004. endif
  96005. previous = previous[1..1];
  96006. else
  96007. return previous;
  96008. endif
  96009. if ((!prefix) || ((length(info[3]) + length(info[2])) != 1))
  96010. this:set_node(prefix, @info);
  96011. return previous;
  96012. elseif (info[3])
  96013. this:kill_node(prefix);
  96014. return {@previous, info[3][1], info[this.data][1]};
  96015. else
  96016. sub = this.(" " + (p = tostr(prefix, info[1], info[2])));
  96017. this:kill_node(p);
  96018. this:set_node(prefix, @listset(sub, tostr(info[1], info[2], sub[1]), 1));
  96019. return previous;
  96020. endif
  96021. .
  96022. #39:8
  96023. ":delete2(string,datum[,n]) deletes the pair <string,datum> from the tree starting at node \" \"+string[1..n], n defaulting to 0 (root node)";
  96024. "Similar to :delete except that if the entry for that string has a different associated datum, it will not be removed.  ";
  96025. ":delete2(string,datum) is equivalent to ";
  96026. " ";
  96027. "  if(this:find_exact(string)==datum) ";
  96028. "    this:delete(string); ";
  96029. "  endif";
  96030. if (!($perm_utils:controls(caller_perms(), this) || (caller == this)))
  96031. return E_PERM;
  96032. endif
  96033. rest = (search = args[1]);
  96034. datum = args[2];
  96035. sofar = {@args, 0}[3];
  96036. prefix = search[1..sofar];
  96037. rest[1..sofar] = "";
  96038. info = this.(" " + prefix);
  96039. if (i = (search in info[3]))
  96040. previous = {info[this.data][i]};
  96041. if (previous[1] != datum)
  96042. return previous;
  96043. endif
  96044. info[3] = listdelete(info[3], i);
  96045. if (this.data > 3)
  96046. info[this.data] = listdelete(info[this.data], i);
  96047. endif
  96048. elseif ((rest == info[1]) || ((index(rest, info[1]) != 1) || (!index(info[2], search[d = ((sofar + length(info[1])) + 1)]))))
  96049. "... hmm string isn't in here...";
  96050. return 0;
  96051. elseif ((previous = this:delete2(search, datum, d)) && (length(previous) > 1))
  96052. i = index(info[2], search[d]);
  96053. info[2][i..i] = "";
  96054. info[3] = {previous[2], @info[3]};
  96055. if (this.data > 3)
  96056. info[this.data] = {previous[3], @info[this.data]};
  96057. endif
  96058. previous = previous[1..1];
  96059. else
  96060. return previous;
  96061. endif
  96062. if ((!prefix) || ((length(info[3]) + length(info[2])) != 1))
  96063. this:set_node(prefix, @info);
  96064. return previous;
  96065. elseif (info[3])
  96066. this:kill_node(prefix);
  96067. return {@previous, info[3][1], info[this.data][1]};
  96068. else
  96069. sub = this.(" " + (p = tostr(prefix, info[1], info[2])));
  96070. this:kill_node(p);
  96071. this:set_node(prefix, @listset(sub, tostr(info[1], info[2], sub[1]), 1));
  96072. return previous;
  96073. endif
  96074. .
  96075. #39:9
  96076. return (caller != this) ? E_PERM | (this.(" " + args[1]) = listdelete(args, 1));
  96077. .
  96078. #39:10
  96079. "WIZARDLY";
  96080. return (caller != this) ? E_PERM | add_property(this, " " + args[1], listdelete(args, 1), {$generic_db.owner, this.node_perms});
  96081. .
  96082. #39:11
  96083. "WIZARDLY";
  96084. return (caller != this) ? E_PERM | delete_property(this, " " + args[1]);
  96085. .
  96086. #39:12
  96087. "WIZARDLY";
  96088. if (!($perm_utils:controls(caller_perms(), this) || (caller == this)))
  96089. return E_PERM;
  96090. endif
  96091. if (args && ((d = args[1]) in {3, 4}))
  96092. this.data = d;
  96093. endif
  96094. for p in (properties(this))
  96095. if ((p[1] == " ") && (p != " "))
  96096. delete_property(this, p);
  96097. endif
  96098. "... there should be a better way....";
  96099. "...This is bad as it leaves the db in an inconsistent state...";
  96100. $command_utils:suspend_if_needed(0);
  96101. endfor
  96102. this:set_node("", "", "", {}, @(this.data > 3) ? {{}} | {});
  96103. .
  96104. #39:13
  96105. if (!($perm_utils:controls(caller_perms(), this) || (caller == this)))
  96106. return E_PERM;
  96107. endif
  96108. this:_kill_subtrees("", 0);
  96109. this:clearall(@args);
  96110. .
  96111. #39:14
  96112. ":_kill_subtree(node,count)...wipes out all subtrees";
  96113. "...returns count + number of nodes removed...";
  96114. if (!($perm_utils:controls(caller_perms(), this) || (caller == this)))
  96115. return E_PERM;
  96116. endif
  96117. info = this.(" " + (prefix = args[1]));
  96118. count = args[2];
  96119. if ((ticks_left() < 500) || (seconds_left() < 2))
  96120. player:tell("...", count);
  96121. suspend(0);
  96122. endif
  96123. for i in [1..length(info[2])]
  96124. count = (this:_kill_subtrees(n = tostr(prefix, info[1], info[2][i]), count) + 1);
  96125. this:kill_node(n);
  96126. endfor
  96127. return count;
  96128. .
  96129. #39:15
  96130. info = this.(" " + (prefix = (args || {""})[1]));
  96131. depth = 0;
  96132. string = prefix;
  96133. if ((ticks_left() < 500) || (seconds_left() < 2))
  96134. player:tell("...", prefix);
  96135. suspend(0);
  96136. endif
  96137. for i in [1..length(info[2])]
  96138. if ((r = this:depth(tostr(prefix, info[1], info[2][i])))[1] > depth)
  96139. depth = r[1];
  96140. string = r[2];
  96141. endif
  96142. endfor
  96143. return {depth + 1, string};
  96144. .
  96145. #39:16
  96146. info = this.(" " + (prefix = args[1]));
  96147. count = (length(info[3]) + args[2]);
  96148. if ((ticks_left() < 500) || (seconds_left() < 2))
  96149. player:tell("...", count);
  96150. suspend(0);
  96151. endif
  96152. for i in [1..length(info[2])]
  96153. count = this:count_entries(tostr(prefix, info[1], info[2][i]), count);
  96154. endfor
  96155. return count;
  96156. .
  96157. #39:17
  96158. info = this.(" " + (prefix = args[1]));
  96159. count = args[2];
  96160. for s in (info[3])
  96161. count = (count + length(s));
  96162. endfor
  96163. if ((ticks_left() < 500) || (seconds_left() < 2))
  96164. player:tell("...", count);
  96165. suspend(0);
  96166. endif
  96167. for i in [1..length(info[2])]
  96168. count = this:count_chars(tostr(prefix, info[1], info[2][i]), count);
  96169. endfor
  96170. return count;
  96171. .
  96172. #39:18
  96173. "count [entries|chars] in <db>";
  96174. "  reports on the number of distinct string keys or the number of characters";
  96175. "  in all string keys in the db";
  96176. if (index("entries", dobjstr) == 1)
  96177. player:tell(this:count_entries("", 0), " strings in ", this.name, "(", this, ")");
  96178. elseif (index("chars", dobjstr) == 1)
  96179. player:tell(this:count_chars("", 0), " chars in ", this.name, "(", this, ")");
  96180. else
  96181. player:tell("Usage: ", verb, " entries|chars in <db>");
  96182. endif
  96183. .
  96184. #40:0
  96185. "eval(code)";
  96186. "Evaluate code with $no_one's permissions (so you won't damage anything).";
  96187. "If code does not begin with a semicolon, set this = caller (in the code to be evaluated) and return the value of the first `line' of code.  This means that subsequent lines will not be evaluated at all.";
  96188. "If code begins with a semicolon, set this = caller and let the code decide for itself when to return a value.  This is how to do multi-line evals.";
  96189. set_task_perms(this);
  96190. exp = args[1];
  96191. if (exp[1] != ";")
  96192. return eval(tostr("this=", caller, "; return ", exp, ";"));
  96193. else
  96194. return eval(tostr("this=", caller, ";", exp, ";"));
  96195. endif
  96196. .
  96197. #40:1
  96198. return 0;
  96199. .
  96200. #40:2
  96201. ":eval_d(code)";
  96202. "exactly like :eval except that the d flag is unset";
  96203. "Evaluate code with $no_one's permissions (so you won't damage anything).";
  96204. "If code does not begin with a semicolon, set this = caller (in the code to be evaluated) and return the value of the first `line' of code.  This means that subsequent lines will not be evaluated at all.";
  96205. "If code begins with a semicolon, set this = caller and let the code decide for itself when to return a value.  This is how to do multi-line evals.";
  96206. set_task_perms(this);
  96207. exp = args[1];
  96208. if (exp[1] != ";")
  96209. return $code_utils:eval_d(tostr("this=", caller, "; return ", exp, ";"));
  96210. else
  96211. return $code_utils:eval_d(tostr("this=", caller, ";", exp, ";"));
  96212. endif
  96213. .
  96214. #40:3
  96215. "call_verb(object, verb name, args)";
  96216. "Call verb with $no_one's permissions (so you won't damage anything).";
  96217. "One could do this with $no_one:eval, but ick.";
  96218. set_task_perms(this);
  96219. return args[1]:(args[2])(@args[3]);
  96220. .
  96221. #41:0
  96222. ":load() -- reloads the player_db with the names of all existing players.";
  96223. "This routine calls suspend() if it runs out of time.";
  96224. ".frozen is set to 1 while the load is in progress so that other routines are warned and don't try to do any updates.  Sometimes, an update is unavoidable (e.g., player gets recycled) in which case the offending routine should set .frozen to 2, causing the load to start over at the beginning.";
  96225. if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
  96226. return E_PERM;
  96227. endif
  96228. this:clearall();
  96229. this.frozen = 1;
  96230. for p in (players())
  96231. this:suspend_restart(p);
  96232. "... note that if a player is recycled or toaded during the suspension,...";
  96233. "... it won't be removed from the for loop iteration; thus this test:     ";
  96234. if (valid(p) && is_player(p))
  96235. if (typeof(po = this:find_exact(p.name)) == ERR)
  96236. player:tell(p.name, ":  ", po);
  96237. return;
  96238. elseif (po != p)
  96239. if (valid(po) && is_player(po))
  96240. player:tell("name `", p.name, "' for ", p, " subsumes alias for ", po.name, "(", po, ").");
  96241. endif
  96242. this:insert(p.name, p);
  96243. endif
  96244. for a in (p.aliases)
  96245. this:suspend_restart(p);
  96246. if (index(a, " "))
  96247. "don't bother";
  96248. elseif (typeof(ao = this:find_exact(a)) == ERR)
  96249. player:tell(a, ":  ", ao);
  96250. return;
  96251. elseif (!(valid(ao) && is_player(ao)))
  96252. this:insert(a, p);
  96253. elseif (ao != p)
  96254. player:tell("alias `", a, "' for ", p.name, "(", p, ") used by ", ao.name, "(", ao, ").");
  96255. endif
  96256. endfor
  96257. endif
  96258. endfor
  96259. this.frozen = 0;
  96260. .
  96261. #41:1
  96262. ":check() -- checks for recycled and toaded players that managed not to get expunged from the db.";
  96263. for p in (properties($player_db))
  96264. if ((ticks_left() < 500) || (seconds_left() < 2))
  96265. player:tell("...", p);
  96266. suspend(0);
  96267. endif
  96268. if (p[1] == " ")
  96269. nlist = this.(p)[3];
  96270. olist = this.(p)[4];
  96271. for i in [1..length(nlist)]
  96272. if (valid(olist[i]) && (is_player(olist[i]) && (nlist[i] in olist[i].aliases)))
  96273. else
  96274. player:tell(".", p[2..length(p)], " <- ", nlist[i], " ", olist[i]);
  96275. endif
  96276. endfor
  96277. endif
  96278. endfor
  96279. player:tell("done.");
  96280. .
  96281. #41:2
  96282. if (caller_perms().wizard)
  96283. pass();
  96284. this.reserved = {};
  96285. this:load();
  96286. endif
  96287. .
  96288. #41:3
  96289. ":available(name) => 1 if a name is available for use, or the object id of whoever is currently using it, or 0 if the name is otherwise forbidden.";
  96290. "If $player_db is not .frozen and :available returns 1, then $player:set_name will succeed.";
  96291. name = args[1];
  96292. if ((name in this.stupid_names) || (name in this.reserved))
  96293. return 0;
  96294. elseif ((((!name) || index(name, " ")) || index(name, "\\")) || index(name, "\""))
  96295. return 0;
  96296. elseif (index("*#()", name[1]))
  96297. return 0;
  96298. elseif (valid(who = this:find_exact(name)) && is_player(who))
  96299. return who;
  96300. else
  96301. return 1;
  96302. endif
  96303. .
  96304. #41:4
  96305. "used during :load to do the usual out-of-time check.";
  96306. "if someone makes a modification during the suspension (indicated by this.frozen being set to 2), we have to restart the entire load.";
  96307. if (caller != this)
  96308. return E_PERM;
  96309. elseif ($command_utils:running_out_of_time())
  96310. player:tell("...", args[1]);
  96311. suspend(0);
  96312. if (this.frozen != 1)
  96313. player:tell("...argh... restarting $player_db:load...");
  96314. fork (0)
  96315. this:load();
  96316. endfork
  96317. kill_task(task_id());
  96318. endif
  96319. endif
  96320. .
  96321. #42:0
  96322. "@perm_utils:controls(who, what)";
  96323. "Is WHO allowed to hack on WHAT?";
  96324. return (args[1] == args[2].owner) || args[1].wizard;
  96325. .
  96326. #42:1
  96327. ":apply(permstring,mods) => new permstring.";
  96328. "permstring is a permissions string, mods is a concatenation of strings of the form +<letters>, !<letters>, or -<letters>, where <letters> is a string of letters as might appear in a permissions string (`+' adds the specified permissions, `-' or `!' removes them; `-' and `!' are entirely equivalent).";
  96329. perms = args[1];
  96330. mods = args[2];
  96331. if ((!mods) || (!index("!-+", mods[1])))
  96332. return mods;
  96333. endif
  96334. i = 1;
  96335. while (i <= length(mods))
  96336. if (mods[i] == "+")
  96337. while (((i = (i + 1)) <= length(mods)) && (!index("!-+", mods[i])))
  96338. if (!index(perms, mods[i]))
  96339. perms = (perms + mods[i]);
  96340. endif
  96341. endwhile
  96342. else
  96343. "mods[i] must be ! or -";
  96344. while (((i = (i + 1)) <= length(mods)) && (!index("!-+", mods[i])))
  96345. perms = strsub(perms, mods[i], "");
  96346. endwhile
  96347. endif
  96348. endwhile
  96349. return perms;
  96350. .
  96351. #42:2
  96352. stage = 1;
  96353. c = callers();
  96354. while (((stage = (stage + 1)) < length(c)) && (c[stage][1] == c[1][1]))
  96355. endwhile
  96356. return c[stage];
  96357. .
  96358. #42:3
  96359. "controls_prop(who, what, propname)";
  96360. "Is WHO allowed to hack on WHAT's PROPNAME?";
  96361. return (args[1] == property_info(args[2], args[3])[1]) || args[1].wizard;
  96362. .
  96363. #43:0
  96364. "$gender_utils:set(object,gender) --- sets the pronoun properties of object.";
  96365. "gender is a string: one of the strings in $gender_utils.genders, the list of rcognized genders.  If the gender change is successful, the (full) name of the gender (e.g., \"male\") is returned.  E_NONE is returned if gender does not match any recognized gender.  Any other error encountered (e.g., E_PERM, E_PROPNF) is likewise returned and the object's pronoun properties are left unaltered.";
  96366. set_task_perms(caller_perms());
  96367. if (this == (object = args[1]))
  96368. return E_DIV;
  96369. elseif (gnum = $string_utils:find_prefix(gender = args[2], this.genders))
  96370. gender = this.genders[gnum];
  96371. else
  96372. return E_NONE;
  96373. endif
  96374. save = {};
  96375. prons = this.pronouns;
  96376. for p in (prons)
  96377. save = {@save, e = object.(p)};
  96378. if ((typeof(e) != STR) || (typeof(e = (object.(p) = this.(p)[gnum])) == ERR))
  96379. for i in [1..length(save) - 1]
  96380. object.(prons[i]) = save[i];
  96381. endfor
  96382. return e;
  96383. endif
  96384. endfor
  96385. return gender;
  96386. .
  96387. #43:1
  96388. "$gender_utils:add(object[,perms[,owner]])";
  96389. "--- adds pronoun properties to object if they're not already there.";
  96390. "    perms default to \"rc\", owner defaults to the object owner.";
  96391. set_task_perms(caller_perms());
  96392. object = args[1];
  96393. perms = ((length(args) >= 2) ? args[2] | "rc");
  96394. owner = ((length(args) >= 3) ? args[3] | object.owner);
  96395. prons = this.pronouns;
  96396. e = 1;
  96397. for p in (prons)
  96398. if (!$object_utils:has_property(object, p))
  96399. e = add_property(object, p, "", {owner, perms});
  96400. if (typeof(e) == ERR)
  96401. player:tell("Couldn't add ", object, ".", p, ":  ", e);
  96402. return;
  96403. endif
  96404. elseif ((typeof(object.(p)) != STR) && (typeof(e = (object.(p) = "")) == ERR))
  96405. player:tell("Couldn't reset ", object, ".", p, ":  ", e);
  96406. return;
  96407. elseif (!object.(p))
  96408. e = 0;
  96409. endif
  96410. endfor
  96411. if ((!e) && (ERR == typeof(e = this:set(object, "neuter"))))
  96412. player:tell("Couldn't initialize pronouns:  ", e);
  96413. endif
  96414. .
  96415. #43:2
  96416. "get_pronoun(key,object) => pronoun corresponding to object.";
  96417. "key can be one of s,o,p,q,r,S,O,P,Q,R to refer to the pronoun properties relatively directly or it can be something of the form \"he/she\" or \"He/She\".";
  96418. "Next the object is checked for the desired pronoun property.  If that doesn't exist, we look at object.gender and infer the pronoun from the corresponding $gender_utils property.  If .gender doesn't exist or the object itself is invalid, we use the corresponding property on $player.";
  96419. key = args[1];
  96420. if (key[1] == ":")
  96421. key = key[2..length(key)];
  96422. endif
  96423. if ((length(key) == 1) && (i = index("sopqrSOPQR", key, 1)))
  96424. prop = this.pronouns[i];
  96425. else
  96426. search = "$1:he$s:she$1:he/she$2:him$2:him/her$3:his/her$4:hers$4:his/hers$5:himself$5:herself$5:himself/herself";
  96427. i = index(search, (":" + key) + "$");
  96428. if (!i)
  96429. return "";
  96430. endif
  96431. cap = (strcmp("a", key) > 0);
  96432. prop = this.pronouns[tonum(search[i - 1]) + (5 * cap)];
  96433. endif
  96434. if (!valid(object = ((length(args) >= 2) ? args[2] | player)))
  96435. return $player.(prop);
  96436. elseif (STR == typeof(p = object.(prop)))
  96437. return p;
  96438. elseif ((STR == typeof(g = object.gender)) && (i = (g in this.genders)))
  96439. return this.(prop)[i];
  96440. else
  96441. return $player.(prop);
  96442. endif
  96443. .
  96444. #43:3
  96445. "get_conj(verbspec,object) => verb conjugated according to object.";
  96446. "verbspec can be one of \"singular/plural\", \"singular\", \"singular/\", or \"/plural\", e.g., \"is/are\", \"is\", \"is/\", or \"/are\".";
  96447. "The object is checked to see whether it is singular or plural.  This is inferred from its .gender property.  If .gender doesn't exist or the object itself is invalid, we assume singular.";
  96448. spec = args[1];
  96449. i = index(spec + "/", "/");
  96450. sing = spec[1..i - 1];
  96451. if (i < length(spec))
  96452. plur = spec[i + 1..length(spec)];
  96453. else
  96454. plur = "";
  96455. endif
  96456. cap = (strcmp("a", (i == 1) ? spec[2] | spec) > 0);
  96457. if (((valid(object = ((length(args) >= 2) ? args[2] | player)) && (STR == typeof(g = object.gender))) && (i = (g in this.genders))) && this.is_plural[i])
  96458. vb = (plur || this:_verb_plural(sing, i));
  96459. else
  96460. vb = (sing || this:_verb_singular(plur, i));
  96461. endif
  96462. if (cap)
  96463. return $string_utils:capitalize(vb);
  96464. else
  96465. return vb;
  96466. endif
  96467. .
  96468. #43:4
  96469. if (typeof(st = args[1]) != STR)
  96470. return E_INVARG;
  96471. endif
  96472. len = length(st);
  96473. if ((len >= 3) && (rindex(st, "n't") == (len - 2)))
  96474. return this:_verb_plural(st[1..len - 3], args[2]) + "n't";
  96475. elseif (i = (st in {"has", "is"}))
  96476. return this.({"have", "be"}[i])[args[2]];
  96477. elseif (st == "was")
  96478. return (args[2] > 6) ? "were" | st;
  96479. elseif ((len <= 3) || (st[len] != "s"))
  96480. return st;
  96481. elseif (st[len - 1] != "e")
  96482. return st[1..len - 1];
  96483. elseif (((st[len - 2] == "h") && index("cs", st[len - 3])) || index("ox", st[len - 2]))
  96484. return st[1..len - 2];
  96485. "washes => wash, belches => belch, boxes => box";
  96486. "used to have || ((st[len - 2] == \"s\") && (!index(\"aeiouy\", st[len - 3])))";
  96487. "so that <consonant>ses => <consonant>s";
  96488. "known examples: none";
  96489. "counterexample: browses => browse";
  96490. elseif (st[len - 2] == "i")
  96491. return st[1..len - 3] + "y";
  96492. else
  96493. return st[1..len - 1];
  96494. endif
  96495. .
  96496. #43:5
  96497. if (typeof(st = args[1]) != STR)
  96498. return E_INVARG;
  96499. endif
  96500. len = length(st);
  96501. if ((len >= 3) && (rindex(st, "n't") == (len - 2)))
  96502. return this:_verb_singular(st[1..len - 3], args[2]) + "n't";
  96503. elseif (i = (st in {"have", "are"}))
  96504. return this.({"have", "be"}[i])[args[2]];
  96505. elseif ((st[len] == "y") && (!index("aeiou", st[len - 1])))
  96506. return st[1..len - 1] + "ies";
  96507. elseif (index("osx", st[len]) || ((len > 1) && (index("chsh", st[len - 1..len]) % 2)))
  96508. return st + "es";
  96509. else
  96510. return st + "s";
  96511. endif
  96512. .
  96513. #43:6
  96514. "_do(cap,object,modifiers...)";
  96515. cap = args[1];
  96516. object = args[2];
  96517. if (!(modifiers = args[3]))
  96518. if (typeof(object) != OBJ)
  96519. return tostr(object);
  96520. elseif (!valid(object))
  96521. return (cap ? "N" | "n") + "othing";
  96522. else
  96523. return cap ? object:titlec() | object:title();
  96524. endif
  96525. elseif (modifiers[1] == ".")
  96526. len = length(modifiers);
  96527. if (i = index(modifiers[2..len], "."))
  96528. i = (i + 1);
  96529. elseif (!(i = ((index(modifiers, ":") || index(modifiers, "#")) || index(modifiers, "!"))))
  96530. i = (len + 1);
  96531. endif
  96532. if (typeof(o = object.(modifiers[2..i - 1])) == ERR)
  96533. return tostr("%(", o, ")");
  96534. else
  96535. return this:_do(cap || (strcmp("a", modifiers[2]) > 0), o, modifiers[i..len]);
  96536. endif
  96537. elseif (modifiers[1] == ":")
  96538. if (typeof(object) != OBJ)
  96539. return tostr("%(", E_TYPE, ")");
  96540. elseif (p = this:get_pronoun(modifiers, object))
  96541. return p;
  96542. else
  96543. return tostr("%(", modifiers, "??)");
  96544. endif
  96545. elseif (modifiers[1] == "#")
  96546. return tostr(object);
  96547. elseif (modifiers[1] == "!")
  96548. return this:get_conj(modifiers[2..length(modifiers)], object);
  96549. else
  96550. i = ((((index(modifiers, ".") || index(modifiers, ":")) || index(modifiers, "#")) || index(modifiers, "!")) || (length(modifiers) + 1));
  96551. s = modifiers[1..i - 1];
  96552. if (j = (s in {"dobj", "iobj", "this"}))
  96553. return this:_do(cap, {dobj, iobj, callers()[2][1]}[j], modifiers[i..length(modifiers)]);
  96554. else
  96555. return tostr("%(", s, "??)");
  96556. endif
  96557. endif
  96558. .
  96559. #43:7
  96560. "Experimental pronoun substitution. The official version is on $string_utils.";
  96561. "syntax:  :pronoun_sub(text[,who])";
  96562. "experimental version that accomodates Aladdin's style...";
  96563. set_task_perms($no_one);
  96564. who = ((length(args) >= 2) ? args[2] | player);
  96565. if (typeof(args[1]) == LIST)
  96566. plines = {};
  96567. for line in (args[1])
  96568. plines = {@plines, this:pronoun_sub(line, who)};
  96569. endfor
  96570. return plines;
  96571. endif
  96572. old = tostr(args[1]);
  96573. new = "";
  96574. here = (valid(who) ? who.location | $nothing);
  96575. objspec = "nditl";
  96576. objects = {who, dobj, iobj, caller, here};
  96577. prnspec = "sopqrSOPQR";
  96578. prprops = {"ps", "po", "pp", "pq", "pr", "Ps", "Po", "Pp", "Pq", "Pr"};
  96579. oldlen = length(old);
  96580. while ((prcnt = index(old, "%")) && (prcnt < oldlen))
  96581. cp_args = {};
  96582. s = old[k = (prcnt + 1)];
  96583. if (brace = index("([{", s))
  96584. if (!(w = index(old[k + 1..oldlen], ")]}"[brace])))
  96585. return new + old;
  96586. elseif (brace == 3)
  96587. s = this:_do(0, who, old[prcnt + 2..(k = (k + w)) - 1]);
  96588. else
  96589. p = old[prcnt + 2..(k = (k + w)) - 1];
  96590. if (brace == 1)
  96591. cp_args = {who, p};
  96592. elseif (p[1] == "#")
  96593. s = ((o = index(objspec, p[2])) ? tostr(objects[o]) | (("[" + p) + "]"));
  96594. elseif (!(o = index(objspec, p[1])))
  96595. s = (("[" + p) + "]");
  96596. else
  96597. cp_args = {objects[o], p[2..w - 1], strcmp(p[1], "a") < 0};
  96598. endif
  96599. endif
  96600. elseif (o = index(objspec, s))
  96601. cp_args = {objects[o], "", strcmp(s, "a") < 0};
  96602. elseif (w = index(prnspec, s, 1))
  96603. cp_args = {who, prprops[w]};
  96604. elseif (s == "#")
  96605. s = tostr(who);
  96606. elseif (s != "%")
  96607. s = ("%" + s);
  96608. endif
  96609. new = ((new + old[1..prcnt - 1]) + ((!cp_args) ? s | ((typeof(sub = $string_utils:_cap_property(@cp_args)) != ERR) ? sub | (("%(" + tostr(sub)) + ")"))));
  96610. old = old[k + 1..oldlen];
  96611. oldlen = (oldlen - k);
  96612. endwhile
  96613. return new + old;
  96614. .
  96615. #44:0
  96616. "Given a time() or ctime()-style date, this returns the full name of the day.";
  96617. if (typeof(args[1]) == NUM)
  96618. time = ctime(args[1]);
  96619. elseif (typeof(args[1]) == STR)
  96620. time = args[1];
  96621. else
  96622. return E_TYPE;
  96623. endif
  96624. dayabbr = $string_utils:explode(time)[1];
  96625. return this.days[dayabbr in this.dayabbrs];
  96626. .
  96627. #44:1
  96628. "Given a time() or ctime()-style date, this returns the full name";
  96629. "of the month.";
  96630. if (typeof(args[1]) == NUM)
  96631. time = ctime(args[1]);
  96632. elseif (typeof(args[1]) == STR)
  96633. time = args[1];
  96634. else
  96635. return E_TYPE;
  96636. endif
  96637. monthabbr = $string_utils:explode(time)[2];
  96638. return this.months[monthabbr in this.monthabbrs];
  96639. .
  96640. #44:2
  96641. "Return a time in the form [h]h[:mm[:ss]] {a.m.|p.m.}.  Args are";
  96642. "[1]   either a time()- or a ctime()-style date, and";
  96643. "[2]   (optional) the precision desired--1 for hours, 2 for minutes,";
  96644. "        3 for seconds.  If not given, precision defaults to minutes";
  96645. if (typeof(args[1]) == NUM)
  96646. time = ctime(args[1]);
  96647. elseif (typeof(args[1]) == STR)
  96648. time = args[1];
  96649. else
  96650. return E_TYPE;
  96651. endif
  96652. if (length(args) > 1)
  96653. precision = args[2];
  96654. else
  96655. precision = 2;
  96656. endif
  96657. time = $string_utils:explode(time)[4];
  96658. hour = tonum(time[1..2]);
  96659. if (hour == 0)
  96660. time = (("12" + time[3..(precision * 3) - 1]) + " a.m.");
  96661. elseif (hour == 12)
  96662. time = (time[1..(precision * 3) - 1] + " p.m.");
  96663. elseif (hour > 12)
  96664. time = ((tostr(hour - 12) + time[3..(precision * 3) - 1]) + " p.m.");
  96665. else
  96666. time = ((tostr(hour) + time[3..(precision * 3) - 1]) + " a.m.");
  96667. endif
  96668. return time;
  96669. .
  96670. #44:3
  96671. "Given string hh:mm:ss ($string_utils:explode(ctime(time))[4]), this returns";
  96672. "the number of seconds elapsed since 00:00:00.  I can't remember why I";
  96673. "created this verb, but I'm sure it serves some useful purpose.";
  96674. return (((60 * 60) * tonum(args[1][1..2])) + (60 * tonum(args[1][4..5]))) + tonum(args[1][7..8]);
  96675. .
  96676. #44:4
  96677. r = 10000;
  96678. h = ((r * r) + (r / 2));
  96679. time = ((args == {}) ? time() | args[1]);
  96680. t = (((time + 120) % 86400) / 240);
  96681. s = ((5 * ((time - 14957676) % 31556952)) / 438291);
  96682. phi = ((s + t) + this.corr);
  96683. cs = $trig_utils:cos(s);
  96684. spss = (((($trig_utils:sin(phi) * $trig_utils:sin(s)) + h) / r) - r);
  96685. cpcs = (((($trig_utils:cos(phi) * cs) + h) / r) - r);
  96686. return (((((this.stsd * cs) - (this.ctcd * cpcs)) - (this.ct * spss)) + h) / r) - r;
  96687. .
  96688. #44:5
  96689. "Given a string such as returned by ctime(), return the corresponding time-in-seconds-since-1970 time returned by time(), or E_DIV if the format is wrong in some essential way.";
  96690. words = $string_utils:explode(args[1]);
  96691. if (length(words) == 5)
  96692. "Arrgh!  the old ctime() didn't return a time zone, yet it arbitrarily decides whether it's standard or daylight savings time.  URK!!!!!";
  96693. words = listappend(words, "PST");
  96694. endif
  96695. if ((((length(words) != 6) || (length(hms = $string_utils:explode(words[4], ":")) != 3)) || (!(month = (words[2] in this.monthabbrs)))) || (!(zone = $list_utils:assoc(words[6], this.timezones))))
  96696. return E_DIV;
  96697. endif
  96698. year = tonum(words[5]);
  96699. day = (({-1, 30, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}[month] + tonum(words[3])) + (year * 366));
  96700. zone = zone[2];
  96701. return (((((((((((((day - ((day + 1038) / 1464)) - ((day + 672) / 1464)) - ((day + 306) / 1464)) - ((day + 109740) / 146400)) - ((day + 73140) / 146400)) - ((day + 36540) / 146400)) - 719528) * 24) + tonum(hms[1])) + zone) * 60) + tonum(hms[2])) * 60) + tonum(hms[3]);
  96702. .
  96703. #44:6
  96704. s = args[1];
  96705. if (s < 0)
  96706. return "-" + this:(verb)(-s);
  96707. endif
  96708. m = (s / 60);
  96709. s = (s % 60);
  96710. if (m)
  96711. ss = tostr((s < 10) ? ":0" | ":", s);
  96712. h = (m / 60);
  96713. m = (m % 60);
  96714. if (h)
  96715. ss = tostr((m < 10) ? ":0" | ":", m, ss);
  96716. d = (h / 24);
  96717. h = (h % 24);
  96718. return tostr(@d ? {d, (h < 10) ? ":0" | ":"} | {}, h, ss);
  96719. else
  96720. return tostr(m, ss);
  96721. endif
  96722. else
  96723. return tostr(s);
  96724. endif
  96725. .
  96726. #44:7
  96727. "english_time(time [,reference time]): returns the time as a string of";
  96728. "years, months, days, minutes and seconds using the reference time as the";
  96729. "start time and incrementing forwards. it can be given in either ctime() or";
  96730. "time() format. if a reference time is not given, it is set to time().";
  96731. "suspend(0)";
  96732. if ((_time = args[1]) < 1)
  96733. return "0 seconds";
  96734. endif
  96735. reftime = ((length(args) > 1) ? args[2] | time());
  96736. _ctime = ((typeof(reftime) == NUM) ? ctime(reftime) | reftime);
  96737. seclist = {60, 60, 24};
  96738. units = {"year", "month", "day", "hour", "minute", "second"};
  96739. timelist = {};
  96740. for unit in (seclist)
  96741. timelist = {_time % unit, @timelist};
  96742. _time = (_time / unit);
  96743. endfor
  96744. months = 0;
  96745. month = (_ctime[5..7] in $time_utils.monthabbrs);
  96746. year = tonum(_ctime[21..24]);
  96747. "the following should really be a verb/property. attribution: the ";
  96748. "algorithm used is from the eminently eminent g7.";
  96749. monthlen = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
  96750. while (_time >= (days = (monthlen[month] + (((month == 2) && ((year % 4) == 0)) && (!((year % 400) in {100, 200, 300}))))))
  96751. _time = (_time - days);
  96752. months = (months + 1);
  96753. if ((month = (month + 1)) > 12)
  96754. year = (year + 1);
  96755. month = 1;
  96756. endif
  96757. endwhile
  96758. timelist = {months / 12, months % 12, _time, @timelist};
  96759. for unit in (units)
  96760. i = (unit in units);
  96761. if (timelist[i] > 0)
  96762. units[i] = (((tostr(timelist[i]) + " ") + units[i]) + ((timelist[i] == 1) ? "" | "s"));
  96763. else
  96764. units = listdelete(units, i);
  96765. timelist = listdelete(timelist, i);
  96766. endif
  96767. endfor
  96768. "suspend(0)";
  96769. return $string_utils:english_list(units);
  96770. .
  96771. #44:8
  96772. "from_day(day_of_week,which)";
  96773. "numeric time (seconds since 1970) corresponding to midnight (PST) of the given weekday.  Use either the name of the day or a 1..7 number (1==Sunday,...)";
  96774. "  which==-1 => use most recent such day.";
  96775. "  which==+1 => use first upcoming such day.";
  96776. "  which==0  => use closest such day.";
  96777. "larger (absolute) values for which specify a certain number of weeks into the future or past.";
  96778. if (!(tonum(day = args[1]) || (day = $string_utils:find_prefix(day, this.days))))
  96779. return E_DIV;
  96780. endif
  96781. delta = {288000, 374400, 460800, 547200, 28800, 115200, 201600}[tonum(day)];
  96782. time = (time() - delta);
  96783. dir = {@args, 0}[2];
  96784. if (dir)
  96785. time = ((time / 604800) + ((dir > 0) ? dir | (dir + 1)));
  96786. else
  96787. time = ((time + 302400) / 604800);
  96788. endif
  96789. return (time * 604800) + delta;
  96790. .
  96791. #44:9
  96792. "from_month(month,which[,d])";
  96793. "numeric time (seconds since 1970) corresponding to midnight (PST) of the dth (first) day of the given month.  Use either the month name or a 1..12 number (1==January,...)";
  96794. "  which==-1 => use most recent such month.";
  96795. "  which==+1 => use first upcoming such month.";
  96796. "  which==0  => use closest such month.";
  96797. "larger (absolute) values for which specify a certain number of years into the future or past.";
  96798. if (!(tonum(month = args[1]) || (month = $string_utils:find_prefix(month, this.months))))
  96799. return E_DIV;
  96800. endif
  96801. delta = (({0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334}[month] + {@args, 1}[3]) - 1);
  96802. day = ((time() - 28800) / 86400);
  96803. day = ((day - ((day + 672) / 1461)) - delta);
  96804. dir = {@args, 0}[2];
  96805. if (dir)
  96806. day = (((day / 365) + dir) + (dir <= 0));
  96807. else
  96808. day = (((2 * day) + 365) / 730);
  96809. endif
  96810. day = ((day * 365) + delta);
  96811. day = (day + ((day + 671) / 1460));
  96812. return (day * 86400) + 28800;
  96813. .
  96814. #44:10
  96815. "Takes a time that is midnight PST and converts it to the nearest PDT midnight time if it's during that part of the year where we use PDT.";
  96816. time = args[1];
  96817. return time - (3600 * (((tonum(ctime(time)[12..13]) + 12) % 24) - 12));
  96818. .
  96819. #44:11
  96820. "Works like pronoun substitution, but substitutes time stuff.";
  96821. "Call with time_sub(string, time). returns a string.";
  96822. "time is an optional integer in time() format.  If omitted, time() is used.";
  96823. "Macros which are unknown are ignored. $Q -> the empty string.";
  96824. "Terminal $ are ignored.";
  96825. "$H -> hour #. $M -> min #. $S -> second #. 24-hour format, fixed width.";
  96826. "$h, $m, $s same x/c have not-fixed format. 00:03:24 vs. 0:3:24";
  96827. "$O/$o -> numeric hour in 12-hour format.";
  96828. "$D -> long day name. $d -> short day name.";
  96829. "$N -> long month name. $n -> short month name.";
  96830. "$Y -> long year # (e.g. '1991'). $y -> short year # (e.g. '91')";
  96831. "$P/$p -> AM/PM, or am/pm.";
  96832. "$T -> date number. $t -> date number with no extra whitespace etc.";
  96833. "$$ -> $.";
  96834. "";
  96835. "This verb stolen from Ozymandias's #4835:time_subst.";
  96836. res = "";
  96837. thestr = args[1];
  96838. if (length(args) > 1)
  96839. thetime = tonum(args[2]);
  96840. else
  96841. thetime = time();
  96842. endif
  96843. if ((typeof(thestr) != STR) || (typeof(thetime) != NUM))
  96844. player:tell("Bad arguments to time_subst.");
  96845. return;
  96846. endif
  96847. itslength = length(thestr);
  96848. if (!itslength)
  96849. return "";
  96850. endif
  96851. done = 0;
  96852. curchar = 1;
  96853. cctime = ctime(thetime);
  96854. while (!done)
  96855. if (thestr[curchar] != "$")
  96856. res = (res + thestr[curchar]);
  96857. else
  96858. "Now we begin substitution.";
  96859. curchar = (curchar + 1);
  96860. thechar = thestr[curchar];
  96861. if (curchar > length(thestr))
  96862. return res;
  96863. endif
  96864. if (thechar == "$")
  96865. res = (res + "$");
  96866. elseif (!strcmp(thechar, "h"))
  96867. res = (res + $string_utils:trim(tostr(tonum(cctime[12..13]))));
  96868. elseif (thechar == "H")
  96869. res = (res + cctime[12..13]);
  96870. elseif (!strcmp(thechar, "m"))
  96871. res = (res + $string_utils:trim(tostr(tonum(cctime[15..16]))));
  96872. elseif (thechar == "M")
  96873. res = (res + cctime[15..16]);
  96874. elseif (!strcmp(thechar, "s"))
  96875. res = (res + $string_utils:trim(tostr(tonum(cctime[18..19]))));
  96876. elseif (thechar == "S")
  96877. res = (res + cctime[18..19]);
  96878. elseif (!strcmp(thechar, "D"))
  96879. res = (res + $time_utils:day(thetime));
  96880. elseif (thechar == "d")
  96881. res = (res + cctime[1..3]);
  96882. elseif (!strcmp(thechar, "N"))
  96883. res = (res + $time_utils:month(thetime));
  96884. elseif (thechar == "n")
  96885. res = (res + cctime[5..7]);
  96886. elseif (!strcmp(thechar, "T"))
  96887. res = (res + cctime[9..10]);
  96888. elseif (thechar == "t")
  96889. res = (res + $string_utils:trim(cctime[9..10]));
  96890. elseif (thechar == "O")
  96891. res = (res + tostr(((tonum(cctime[12..13]) + 11) % 12) + 1));
  96892. elseif (!strcmp(thechar, "p"))
  96893. res = (res + ((tonum(cctime[12..13]) >= 12) ? "pm" | "am"));
  96894. elseif (thechar == "P")
  96895. res = (res + ((tonum(cctime[12..13]) >= 12) ? "PM" | "AM"));
  96896. elseif (!strcmp(thechar, "y"))
  96897. res = (res + cctime[23..24]);
  96898. elseif (thechar == "Y")
  96899. res = (res + cctime[21..24]);
  96900. endif
  96901. endif
  96902. curchar = (curchar + 1);
  96903. if (curchar > itslength)
  96904. done = 1;
  96905. endif
  96906. endwhile
  96907. return res;
  96908. .
  96909. #44:12
  96910. "Copied from Archer (#52775):mmddyy Tue Apr  6 17:04:26 1993 PDT";
  96911. "Given a time() or ctime()-style date and an optional separator, this returns the MM/DD/YY or DD/MM/YY form of the date (depending on the verb called.)  The default seperator is '/'";
  96912. if (typeof(args[1]) == NUM)
  96913. time = ctime(args[1]);
  96914. elseif (typeof(args[1]) == STR)
  96915. time = args[1];
  96916. else
  96917. return E_TYPE;
  96918. endif
  96919. date = $string_utils:explode(time);
  96920. day = tonum(date[3]);
  96921. month = (date[2] in $time_utils.monthabbrs);
  96922. year = date[5];
  96923. daystr = ((day < 10) ? "0" + tostr(day) | tostr(day));
  96924. monthstr = ((month < 10) ? "0" + tostr(month) | tostr(month));
  96925. yearstr = tostr(year)[3..4];
  96926. divstr = ((length(args) == 1) ? "/" | args[2]);
  96927. if (verb == "mmddyy")
  96928. return tostr(monthstr, divstr, daystr, divstr, yearstr);
  96929. else
  96930. return tostr(daystr, divstr, monthstr, divstr, yearstr);
  96931. endif
  96932. .
  96933. #44:13
  96934. "$time_utils:parse_english_time_interval(n1,u1,n2,u2,...)";
  96935. "or $time_utils:parse_english_time_interval(\"n1 u1[,] [and] n2[,] u2 [and] ...\")";
  96936. "There must be an even number of arguments, all of which must be strings,";
  96937. " or there must be just one argument which is the entire string to be parsed.";
  96938. "The n's are are numeric strings, and the u's are unit names.";
  96939. "The known units are in $time_utils.time_units,";
  96940. " which must be kept sorted with bigger times at the head.";
  96941. "Returns the time represented by those words.";
  96942. "For example,";
  96943. " $time_utils:parse_english_time_interval(\"30\",\"secs\",\"2\",\"minutes\",\"31\",\"seconds\") => 181";
  96944. if ((length(args) == 1) && index(args[1], " "))
  96945. return $time_utils:parse_english_time_interval(@$string_utils:words(args[1]));
  96946. endif
  96947. a = $list_utils:setremove_all(args, "and");
  96948. nargs = length(a);
  96949. if (nargs % 2)
  96950. return E_ARGS;
  96951. endif
  96952. nsec = 0;
  96953. n = 0;
  96954. for i in [1..nargs]
  96955. if ((i % 2) == 1)
  96956. if ($string_utils:is_numeric(a[i]))
  96957. n = tonum(a[i]);
  96958. elseif (a[i] in {"a", "an"})
  96959. n = 1;
  96960. elseif (a[i] in {"no"})
  96961. n = 0;
  96962. else
  96963. return E_INVARG;
  96964. endif
  96965. else
  96966. unit = a[i];
  96967. if (unit[length(unit)] == ",")
  96968. unit = unit[1..length(unit) - 1];
  96969. endif
  96970. ok = 0;
  96971. for entry in ($time_utils.time_units)
  96972. if ((!ok) && (unit in entry[2..length(entry)]))
  96973. nsec = (nsec + (entry[1] * n));
  96974. ok = 1;
  96975. endif
  96976. endfor
  96977. if (!ok)
  96978. return E_INVARG;
  96979. endif
  96980. endif
  96981. endfor
  96982. return nsec;
  96983. .
  96984. #44:14
  96985. "Copied from Ballroom Complex (#29992):from_date by Keelah! (#30246) Tue Jul 13 19:42:32 1993 PDT";
  96986. ":seconds_until_date(month,day,time,which)";
  96987. "month is a string or the numeric representation of the month, day is a number, time is a string in the following format, hh:mm:ss.";
  96988. "which==-1 => use most recent such month.";
  96989. "which==+1 => use first upcoming such month.";
  96990. "which==0 => use closest such month.";
  96991. "This will return the number of seconds until the month, day and time given to it.";
  96992. "Written by Keelah, on July 5, 1993.";
  96993. month = args[1];
  96994. day = args[2];
  96995. which = args[4];
  96996. time = args[3];
  96997. converted = 0;
  96998. converted = (converted + $time_utils:from_month(month, which, day));
  96999. current = this:seconds_until_time("12:00:00");
  97000. get_seconds = this:seconds_until_time(time);
  97001. if (get_seconds < 0)
  97002. get_seconds = ((get_seconds + 39600) - current);
  97003. else
  97004. get_seconds = ((get_seconds + 39600) - current);
  97005. endif
  97006. converted = ((converted + get_seconds) - time());
  97007. return converted;
  97008. .
  97009. #44:15
  97010. "Copied from Ballroom Complex (#29992):seconds_until by Keelah! (#30246) Tue Jul 13 19:42:37 1993 PDT";
  97011. ":seconds_until_time(hh:mm:ss)";
  97012. "Given the string hh:mm:ss, this returns the number of seconds until that hh:mm:ss. If the hh:mm:ss is before the current time(), the number returned is a negative, else the number is a positive.";
  97013. "Written by Keelah, on July 4, 1993.";
  97014. current = $time_utils:to_seconds(ctime()[12..19]);
  97015. time = $time_utils:to_seconds(args[1]);
  97016. return tonum(time) - tonum(current);
  97017. .
  97018. #46:0
  97019. "For changing mailing list aliases, we check to make sure that none of the aliases match existing mailing list aliases.  Aliases containing spaces are not used in addresses and so are not subject to this restriction ($mail_agent:match will not match on them, however, so they only match if used in the immediate room, e.g., with match_object() or somesuch).";
  97020. "  => E_PERM   if you don't own this";
  97021. if (!$perm_utils:controls(caller_perms(), this))
  97022. return E_PERM;
  97023. elseif (this.location != $mail_agent)
  97024. "... we don't care...";
  97025. return pass(@args);
  97026. else
  97027. for a in (aliases = args[1])
  97028. if (index(a, " "))
  97029. "... we don't care...";
  97030. elseif (rp = $mail_agent:reserved_pattern(a))
  97031. player:tell("Mailing list name \"", a, "\" uses a reserved pattern: ", rp[1]);
  97032. aliases = setremove(aliases, a);
  97033. elseif (valid(p = $mail_agent:match(a, #-1)) && ((p != this) && (a in p.aliases)))
  97034. player:tell("Mailing list name \"", a, "\" in use on ", p.name, "(", p, ")");
  97035. aliases = setremove(aliases, a);
  97036. endif
  97037. endfor
  97038. if (aliases)
  97039. return pass(aliases);
  97040. else
  97041. return 1;
  97042. endif
  97043. endif
  97044. .
  97045. #46:1
  97046. namelist = ("*" + ((names = this:mail_names()) ? $string_utils:from_list(names, ", *") | tostr(this)));
  97047. if (typeof(fwd = this:mail_forward()) != LIST)
  97048. fwd = {};
  97049. endif
  97050. if (this:is_writable_by(player))
  97051. if (player in fwd)
  97052. read = " [Writable/Subscribed]";
  97053. else
  97054. read = " [Writable]";
  97055. endif
  97056. elseif (typeof(this.readers) != LIST)
  97057. read = tostr(" [Public", (player in fwd) ? "/Subscribed]" | "]");
  97058. elseif (player in fwd)
  97059. read = " [Subscribed]";
  97060. elseif (this:is_readable_by(player))
  97061. read = " [Readable]";
  97062. else
  97063. read = "";
  97064. endif
  97065. if (this:is_usable_by($no_one))
  97066. mod = "";
  97067. elseif (this:is_usable_by(player))
  97068. mod = " [Approved]";
  97069. else
  97070. mod = " [Moderated]";
  97071. endif
  97072. player:tell(namelist, "  (", this, ")", read, mod);
  97073. d = this:description();
  97074. if (typeof(d) == STR)
  97075. d = {d};
  97076. endif
  97077. for l in (d)
  97078. if (length(l) <= 75)
  97079. ls = {l};
  97080. else
  97081. ls = $generic_editor:fill_string(l, 76);
  97082. endif
  97083. for line in (ls)
  97084. player:tell("    ", line);
  97085. endfor
  97086. endfor
  97087. .
  97088. #46:2
  97089. return $perm_utils:controls(who = args[1], this) || (who in this.writers);
  97090. .
  97091. #46:3
  97092. return (typeof(this.readers) != LIST) || (((who = args[1]) in this.readers) || (this:is_writable_by(who) || $mail_agent:sends_to(1, this, who)));
  97093. .
  97094. #46:4
  97095. who = args[1];
  97096. if (this.moderated)
  97097. return (who in this.moderated) || (this:is_writable_by(who) || who.wizard);
  97098. else
  97099. return this.guests_can_send_here || (!$object_utils:isa(who, $guest));
  97100. endif
  97101. .
  97102. #46:5
  97103. if ((args && (!this:is_usable_by(args[1]))) && (!args[1].wizard))
  97104. return this:moderator_notify(@args);
  97105. else
  97106. return this.(verb);
  97107. endif
  97108. .
  97109. #46:6
  97110. if ((args && (!this:is_usable_by(args[1]))) && (!args[1].wizard))
  97111. return this:moderator_forward(@args);
  97112. elseif (typeof(mf = this.(verb)) == STR)
  97113. return $string_utils:pronoun_sub(mf, @args);
  97114. else
  97115. return mf;
  97116. endif
  97117. .
  97118. #46:7
  97119. if (typeof(mf = this.(verb)) == STR)
  97120. return $string_utils:pronoun_sub(mf, args ? args[1] | $player);
  97121. else
  97122. return mf;
  97123. endif
  97124. .
  97125. #46:8
  97126. ":add_forward(recip[,recip...]) adds new recipients to this list.  Returns a string error message or a list of results (recip => success, E_PERM => not allowed, E_INVARG => not a valid recipient, string => other kind of failure)";
  97127. if (caller == $mail_editor)
  97128. perms = player;
  97129. else
  97130. perms = caller_perms();
  97131. endif
  97132. result = {};
  97133. forward_self = ((!this.mail_forward) || (this in this.mail_forward));
  97134. for recip in (args)
  97135. if ((!valid(recip)) || ((!is_player(recip)) && (!($mail_recipient in $object_utils:ancestors(recip)))))
  97136. r = E_INVARG;
  97137. elseif ($perm_utils:controls(perms, this) || ((typeof(this.readers) != LIST) && $perm_utils:controls(perms, recip)))
  97138. this.mail_forward = setadd(this.mail_forward, recip);
  97139. r = recip;
  97140. else
  97141. r = E_PERM;
  97142. endif
  97143. result = listappend(result, r);
  97144. endfor
  97145. if ((length(this.mail_forward) > 1) && ($nothing in this.mail_forward))
  97146. this.mail_forward = setremove(this.mail_forward, $nothing);
  97147. endif
  97148. if (forward_self)
  97149. this.mail_forward = setadd(this.mail_forward, this);
  97150. endif
  97151. return result;
  97152. .
  97153. #46:9
  97154. ":delete_forward(recip[,recip...]) removes recipients to this list.  Returns a list of results (E_PERM => not allowed, E_INVARG => not on list)";
  97155. if (caller == $mail_editor)
  97156. perms = player;
  97157. else
  97158. perms = caller_perms();
  97159. endif
  97160. result = {};
  97161. forward_self = ((!this.mail_forward) || (this in this.mail_forward));
  97162. for recip in (args)
  97163. if (!(recip in this.mail_forward))
  97164. r = E_INVARG;
  97165. elseif (((!valid(recip)) || $perm_utils:controls(perms, recip)) || $perm_utils:controls(perms, this))
  97166. if (recip == this)
  97167. forward_self = 0;
  97168. endif
  97169. this.mail_forward = setremove(this.mail_forward, recip);
  97170. r = recip;
  97171. else
  97172. r = E_PERM;
  97173. endif
  97174. result = listappend(result, r);
  97175. endfor
  97176. if (!(forward_self || this.mail_forward))
  97177. this.mail_forward = {$nothing};
  97178. elseif (this.mail_forward == {this})
  97179. this.mail_forward = {};
  97180. endif
  97181. return result;
  97182. .
  97183. #46:10
  97184. ":add_notify(recip[,recip...]) adds new notifiees to this list.  Returns a list of results (recip => success, E_PERM => not allowed, E_INVARG => not a valid recipient)";
  97185. if (caller == $mail_editor)
  97186. perms = player;
  97187. else
  97188. perms = caller_perms();
  97189. endif
  97190. result = {};
  97191. for recip in (args)
  97192. if ((!valid(recip)) || (recip == this))
  97193. r = E_INVARG;
  97194. elseif ($perm_utils:controls(perms, this) || (this:is_readable_by(perms) && $perm_utils:controls(perms, recip)))
  97195. this.mail_notify = setadd(this.mail_notify, recip);
  97196. r = recip;
  97197. else
  97198. r = E_PERM;
  97199. endif
  97200. result = listappend(result, r);
  97201. endfor
  97202. return result;
  97203. .
  97204. #46:11
  97205. ":delete_notify(recip[,recip...]) removes notifiees from this list.  Returns a list of results (E_PERM => not allowed, E_INVARG => not on list)";
  97206. if (caller == $mail_editor)
  97207. perms = player;
  97208. else
  97209. perms = caller_perms();
  97210. endif
  97211. result = {};
  97212. rmthis = 0;
  97213. for recip in (args)
  97214. if (!(recip in this.mail_notify))
  97215. r = E_INVARG;
  97216. elseif ((!valid(recip)) || ($perm_utils:controls(perms, recip) || $perm_utils:controls(perms, this)))
  97217. if (recip == this)
  97218. rmthis = 1;
  97219. endif
  97220. this.mail_notify = setremove(this.mail_notify, recip);
  97221. r = recip;
  97222. else
  97223. r = E_PERM;
  97224. endif
  97225. result = listappend(result, r);
  97226. endfor
  97227. return result;
  97228. .
  97229. #46:12
  97230. if (!this:ok_write(caller, caller_perms()))
  97231. return E_PERM;
  97232. else
  97233. this.messages = {@this.messages, {new = this:new_message_num(), args[1]}};
  97234. this.last_msg_date = args[1][1];
  97235. this.last_used_time = time();
  97236. return new;
  97237. endif
  97238. .
  97239. #46:13
  97240. ":ok(caller,callerperms) => true iff caller can do read operations";
  97241. return (args[1] in {this, $mail_agent}) || (args[2].wizard || this:is_readable_by(args[2]));
  97242. .
  97243. #46:14
  97244. ":ok_write(caller,callerperms) => true iff caller can do write operations";
  97245. return (args[1] in {this, $mail_agent}) || (args[2].wizard || this:is_writable_by(args[2]));
  97246. .
  97247. #46:15
  97248. ":parse_message_seq(strings,cur) => msg_seq";
  97249. "";
  97250. ":from_msg_seq(olist)     => msg_seq of messages from those people";
  97251. ":%from_msg_seq(strings)  => msg_seq of messages with strings in the From: line";
  97252. ":to_msg_seq(olist)       => msg_seq of messages to those people";
  97253. ":%to_msg_seq(strings)    => msg_seq of messages with strings in the To: line";
  97254. ":subject_msg_seq(target) => msg_seq of messages with target in the Subject:";
  97255. ":body_msg_seq(target)    => msg_seq of messages with target in the body";
  97256. ":new_message_num()    => number that the next incoming message will receive.";
  97257. ":length_num_le(num)   => number of messages in folder numbered <= num";
  97258. ":length_date_le(date) => number of messages in folder dated <= date";
  97259. ":length_all_msgs()    => number of messages in folder";
  97260. ":exists_num_eq(num)   => index of message in folder numbered == num, or 0";
  97261. "";
  97262. ":display_seq_headers(msg_seq[,cur])   display message summary lines";
  97263. ":display_seq_full(msg_seq[,preamble]) display entire messages";
  97264. "            => number of final message displayed";
  97265. ":list_rmm() displays contents of .messages_going.";
  97266. "            => the number of messages in .messages_going.";
  97267. "";
  97268. ":messages_in_seq(msg_seq) => list of messages in msg_seq on folder";
  97269. "";
  97270. "See the corresponding routines on $mail_agent for more detail.";
  97271. return this:ok(caller, caller_perms()) ? $mail_agent:(verb)(@args) | E_PERM;
  97272. .
  97273. #46:16
  97274. ":length_date_le(date) => number of messages in folder dated > date";
  97275. "";
  97276. if (this:ok(caller, caller_perms()))
  97277. date = args[1];
  97278. return (this.last_msg_date <= date) ? 0 | $mail_agent:(verb)(date);
  97279. else
  97280. return E_PERM;
  97281. endif
  97282. .
  97283. #46:17
  97284. ":rm_message_seq(msg_seq) removes the given sequence of from folder";
  97285. "               => string giving msg numbers removed";
  97286. "See the corresponding routine on $mail_agent.";
  97287. if (this:ok_write(caller, caller_perms()))
  97288. return $mail_agent:(verb)(@args);
  97289. elseif (this:ok(caller, caller_perms()) && (seq = this:own_messages_filter(caller_perms(), @args)))
  97290. return $mail_agent:(verb)(@listset(args, seq, 1));
  97291. else
  97292. return E_PERM;
  97293. endif
  97294. .
  97295. #46:18
  97296. ":rm_message_seq(msg_seq) removes the given sequence of from folder";
  97297. "               => string giving msg numbers removed";
  97298. ":list_rmm()    displays contents of .messages_going.";
  97299. "               => number of messages in .messages_going.";
  97300. ":undo_rmm()    restores previously deleted messages from .messages_going.";
  97301. "               => msg_seq of restored messages";
  97302. ":expunge_rmm() destroys contents of .messages_going once and for all.";
  97303. "               => number of messages in .messages_going.";
  97304. ":renumber([cur])  renumbers all messages";
  97305. "               => {number of messages,new cur}.";
  97306. "";
  97307. "See the corresponding routines on $mail_agent.";
  97308. return this:ok_write(caller, caller_perms()) ? $mail_agent:(verb)(@args) | E_PERM;
  97309. .
  97310. #46:19
  97311. ":own_messages_filter(who,msg_seq) => subsequence of msg_seq consisting of those messages that <who> is actually allowed to remove (on the assumption that <who> is not one of the allowed writers of this folder.";
  97312. if (!this.rmm_own_msgs)
  97313. return E_PERM;
  97314. elseif ((typeof(seq = this:from_msg_seq({args[1]}, args[2])) != LIST) || (seq != args[2]))
  97315. return {};
  97316. else
  97317. return seq;
  97318. endif
  97319. .
  97320. #46:20
  97321. "NOTE:  this routine is obsolete, use :messages_in_seq()";
  97322. ":messages(num) => returns the message numbered num.";
  97323. ":messages()    => returns the entire list of messages (can be SLOW).";
  97324. if (!this:ok(caller, caller_perms()))
  97325. return E_PERM;
  97326. elseif (!args)
  97327. return this:messages_in_seq({1, this:length_all_msgs() + 1});
  97328. elseif (!(n = this:exists_num_eq(args[1])))
  97329. return E_RANGE;
  97330. else
  97331. return this:messages_in_seq(n)[2];
  97332. endif
  97333. .
  97334. #46:21
  97335. if (!this:ok_write(caller, caller_perms()))
  97336. return E_PERM;
  97337. endif
  97338. date_seq = {};
  97339. for msg in (this.messages)
  97340. date_seq = {@date_seq, msg[2][1]};
  97341. endfor
  97342. msg_order = $list_utils:sort($list_utils:range(n = length(msgs = this.messages)), date_seq);
  97343. newmsgs = {};
  97344. for i in [1..n]
  97345. if ($command_utils:suspend_if_needed(0))
  97346. player:tell("...", i);
  97347. endif
  97348. newmsgs = {@newmsgs, {i, msgs[msg_order[i]][2]}};
  97349. endfor
  97350. if (length(this.messages) != n)
  97351. "...shit, new mail received,... start again...";
  97352. fork (0)
  97353. this:date_sort();
  97354. endfork
  97355. else
  97356. this.messages = newmsgs;
  97357. this.last_used_time = newmsgs[length(newmsgs)][2][1];
  97358. endif
  97359. .
  97360. #46:22
  97361. mlen = this:length_all_msgs();
  97362. this.last_msg_date = (mlen && this:messages_in_seq(mlen)[2][1]);
  97363. .
  97364. #46:23
  97365. return this.(verb);
  97366. .
  97367. #46:24
  97368. return $mail_agent:msg_summary_line(@args);
  97369. .
  97370. #46:25
  97371. for m in (this.messages)
  97372. $mail_agent:__convert_new(@m[2]);
  97373. $command_utils:suspend_if_needed(0);
  97374. endfor
  97375. .
  97376. #46:26
  97377. if (!this:ok_write(caller, caller_perms()))
  97378. return E_PERM;
  97379. endif
  97380. msgs = {};
  97381. i = 1;
  97382. for m in (oldmsgs = this.messages)
  97383. msgs = {@msgs, {m[1], $mail_agent:__convert_new(@m[2])}};
  97384. if ($command_utils:running_out_of_time())
  97385. player:notify(tostr("...", i, " ", this));
  97386. suspend(0);
  97387. if (oldmsgs != this.messages)
  97388. return 0;
  97389. endif
  97390. endif
  97391. i = (i + 1);
  97392. endfor
  97393. this.messages = msgs;
  97394. return 1;
  97395. .
  97396. #46:27
  97397. if (caller_perms().wizard)
  97398. pass();
  97399. if (!(this in {$mail_recipient, $big_mail_recipient}))
  97400. "...generic mail recipients stay in #-1...";
  97401. move(this, $mail_agent);
  97402. endif
  97403. endif
  97404. .
  97405. #46:28
  97406. if ($perm_utils:controls(caller_perms(), this))
  97407. this.mail_forward = {};
  97408. return pass(@args);
  97409. endif
  97410. .
  97411. #46:29
  97412. return this.aliases[1];
  97413. .
  97414. #46:30
  97415. names = {};
  97416. for a in (this.aliases)
  97417. if (!index(a, " "))
  97418. names = setadd(names, strsub(a, "_", "-"));
  97419. endif
  97420. endfor
  97421. return names;
  97422. .
  97423. #46:31
  97424. if (caller_perms().wizard || (caller_perms() == this.owner))
  97425. "Passed security check...";
  97426. if (this.expire_period && (n = this:length_date_le(time() - this.expire_period)))
  97427. this:rm_message_seq($seq_utils:range(1, n));
  97428. return this:expunge_rmm();
  97429. endif
  97430. else
  97431. return E_PERM;
  97432. endif
  97433. .
  97434. #46:32
  97435. if (this:is_writable_by(caller_perms()) || this:is_writable_by(caller))
  97436. pass(@args);
  97437. else
  97438. return E_PERM;
  97439. endif
  97440. .
  97441. #47:0
  97442. "resolve(name,from,seen,prevrcpts,prevnotifs) => {rcpts,notifs} or E_INVARG";
  97443. "resolve(list,from,seen,prevrcpts,prevnotifs) => {bogus,rcpts,notifs}";
  97444. "Given either an address (i.e., objectid) or a list of such, traces down all .mail_forward lists and .mail_notify to determine where a message should actually go and who should be told about it.  Both forms take previous lists of recipients/notifications and add only those addresses that weren't there before.  `seen' is the stack of addresses we are currently resolving (for detecting loops).  The first form returns E_INVARG if `name' is invalid.  The second form returns all invalid addresses in the `bogus' list but still does the appropriate search on the remaining addresses.";
  97445. recip = args[1];
  97446. from = args[2];
  97447. if (length(args) == 2)
  97448. args = {@args, {}, {}, {}};
  97449. endif
  97450. seen = args[3];
  97451. sofar = args[4..5];
  97452. if (typeof(recip) == LIST)
  97453. bogus = {};
  97454. for r in (recip)
  97455. result = this:resolve_addr(r, from, seen, @sofar);
  97456. if (result)
  97457. sofar = result;
  97458. else
  97459. bogus = setadd(bogus, r);
  97460. endif
  97461. endfor
  97462. return {bogus, @sofar};
  97463. else
  97464. fwd = (include_recip = 0);
  97465. if ((recip == $nothing) || (recip in seen))
  97466. return sofar;
  97467. elseif ((!valid(recip)) || ((!(is_player(recip) || $object_utils:isa(recip, $mail_recipient))) || (typeof(fwd = recip:mail_forward(from)) != LIST)))
  97468. "recip is a non-player non-mailing-list/folder or forwarding is screwed.";
  97469. if (typeof(fwd) == STR)
  97470. player:tell(fwd);
  97471. endif
  97472. return E_INVARG;
  97473. elseif (fwd)
  97474. if (r = (recip in fwd))
  97475. include_recip = 1;
  97476. fwd = listdelete(fwd, r);
  97477. endif
  97478. result = this:resolve_addr(fwd, recip, setadd(seen, recip), @sofar);
  97479. if (bogus = result[1])
  97480. player:tell(recip.name, "(", recip, ")'s .mail_forward list includes the following bogus entr", (length(bogus) > 1) ? "ies:  " | "y:  ", $string_utils:english_list(bogus));
  97481. endif
  97482. sofar = result[2..3];
  97483. else
  97484. include_recip = 1;
  97485. endif
  97486. if ((ticks_left() < 1000) || (seconds_left() < 2))
  97487. suspend(0);
  97488. endif
  97489. biffs = sofar[2];
  97490. for n in (this:mail_notify(recip, from))
  97491. if (valid(n))
  97492. if (i = $list_utils:iassoc_suspended(n, biffs))
  97493. biffs[i] = setadd(biffs[i], recip);
  97494. else
  97495. biffs = {{n, recip}, @biffs};
  97496. endif
  97497. endif
  97498. if ((ticks_left() < 1000) || (seconds_left() < 2))
  97499. suspend(0);
  97500. endif
  97501. endfor
  97502. return {include_recip ? setadd(sofar[1], recip) | sofar[1], biffs};
  97503. endif
  97504. .
  97505. #47:1
  97506. "sends_to(from,addr,rcpt[,seen]) ==> true iff mail sent to addr passes through rcpt.";
  97507. if ((addr = args[2]) == (rcpt = args[3]))
  97508. return 1;
  97509. elseif (!(addr in (seen = ((length(args) >= 4) ? args[4] | {}))))
  97510. seen = {@seen, addr};
  97511. for a in ((typeof(fwd = this:mail_forward(addr, @args[1] ? {} | {args[1]})) == LIST) ? fwd | {})
  97512. if (this:sends_to(addr, a, rcpt, seen))
  97513. return 1;
  97514. endif
  97515. $command_utils:suspend_if_needed(0);
  97516. endfor
  97517. endif
  97518. return 0;
  97519. .
  97520. #47:2
  97521. "send_message(from,rcpt-list,hdrs,msg) -- formats and sends a mail message.  hders is either the text of the subject line, or a {subject,{reply-to,...}} list.";
  97522. "Return E_PERM if from isn't owned by the caller.";
  97523. "Return {0, @invalid_rcpts} if rcpt-list contains any invalid addresses.  No mail is sent in this case.";
  97524. "Return {1, @actual_rcpts} if successful.";
  97525. from = args[1];
  97526. to = args[2];
  97527. hdrs = args[3];
  97528. msg = args[4];
  97529. if ($perm_utils:controls(caller_perms(), from))
  97530. text = $mail_agent:make_message(from, to, hdrs, msg);
  97531. return this:raw_send(text, to, from);
  97532. else
  97533. return E_PERM;
  97534. endif
  97535. .
  97536. #47:3
  97537. "WIZARDLY";
  97538. "raw_send(text,rcpts,sender) -- does the actual sending of a message.  Assumes that text has already been formatted correctly.  Decides who to send it to and who wants to be notified about it and does so.";
  97539. "Return {E_PERM} if the caller is not entitled to use this verb.";
  97540. "Return {0, @invalid_rcpts} if rcpts contains any invalid addresses.  No mail is sent in this case.";
  97541. "Return {1, @actual_rcpts} if successful.";
  97542. text = args[1];
  97543. rcpts = args[2];
  97544. from = args[3];
  97545. if (typeof(rcpts) != LIST)
  97546. rcpts = {rcpts};
  97547. endif
  97548. if (!(caller in {$mail_agent, $mail_editor}))
  97549. return {E_PERM};
  97550. elseif (bogus = (resolve = this:resolve_addr(rcpts, from))[1])
  97551. return {0, bogus};
  97552. else
  97553. this:touch(rcpts);
  97554. actual_rcpts = resolve[2];
  97555. biffs = resolve[3];
  97556. results = {};
  97557. for recip in (actual_rcpts)
  97558. if ((ticks_left() < 10000) || (seconds_left() < 2))
  97559. player:notify(tostr("...", recip));
  97560. suspend(1);
  97561. endif
  97562. if (typeof(e = recip:receive_message(text, from)) in {ERR, STR})
  97563. "...receive_message bombed...";
  97564. player:notify(tostr(recip, ":receive_message:  ", e));
  97565. e = 0;
  97566. elseif ((!is_player(recip)) || (!e))
  97567. "...not a player or receive_message isn't giving out the message number";
  97568. "...no need to force a notification...";
  97569. elseif (i = $list_utils:iassoc(recip, biffs))
  97570. "...player-recipient was already getting a notification...";
  97571. "...make sure notification includes a mention of him/her/itself.";
  97572. if (!(recip in listdelete(biffs[i], 1)))
  97573. biffs[i][2..1] = {recip};
  97574. endif
  97575. else
  97576. "...player-recipient wasn't originally being notified at all...";
  97577. biffs = {{recip, recip}, @biffs};
  97578. endif
  97579. results = {@results, e};
  97580. endfor
  97581. fork (0)
  97582. for b in (biffs)
  97583. if ((ticks_left() < 10000) || (seconds_left() < 2))
  97584. suspend(1);
  97585. endif
  97586. if ($object_utils:has_callable_verb(b[1], "notify_mail"))
  97587. mnums = {};
  97588. for r in (listdelete(b, 1))
  97589. mnums = {@mnums, (rn = (r in actual_rcpts)) && results[rn]};
  97590. endfor
  97591. b[1]:notify_mail(from, listdelete(b, 1), mnums);
  97592. endif
  97593. endfor
  97594. endfork
  97595. if ((len = length(actual_rcpts)) > 10)
  97596. len = 10;
  97597. endif
  97598. if (len)
  97599. this.total_recipients[len] = (this.total_recipients[len] + 1);
  97600. endif
  97601. return {1, @actual_rcpts};
  97602. endif
  97603. .
  97604. #47:4
  97605. who = args[1];
  97606. if ($object_utils:has_verb(who, verb))
  97607. return who:(verb)(@listdelete(args, 1));
  97608. else
  97609. return {};
  97610. endif
  97611. .
  97612. #47:5
  97613. "touch(name or list,seen) => does .last_used_time = time() if we haven't already touched this in the last hour";
  97614. recip = args[1];
  97615. seen = ((length(args) >= 2) ? args[2] | {});
  97616. if (typeof(recip) == LIST)
  97617. for r in (recip)
  97618. result = this:touch(r, seen);
  97619. $command_utils:suspend_if_needed(0);
  97620. endfor
  97621. else
  97622. if (((!valid(recip)) || (recip in seen)) || ((!is_player(recip)) && (!($mail_recipient in $object_utils:ancestors(recip)))))
  97623. "recip is neither a player nor a mailing list/folder";
  97624. else
  97625. if (fwd = this:mail_forward(recip))
  97626. this:touch(fwd, {@seen, recip});
  97627. endif
  97628. if (!is_player(recip))
  97629. recip.last_used_time = time();
  97630. endif
  97631. endif
  97632. endif
  97633. .
  97634. #47:6
  97635. player:tell_lines(this.description);
  97636. for c in (this.contents)
  97637. c:look_self();
  97638. endfor
  97639. .
  97640. #47:7
  97641. "Only allow mailing lists/folders in here and only if their names aren't already taken.";
  97642. what = args[1];
  97643. return ($object_utils:isa(what, $mail_recipient) && this:check_names(@what.aliases)) && (what:description() != parent(what):description());
  97644. .
  97645. #47:8
  97646. "...make sure the list has at least one usable name.";
  97647. "...make sure none of the aliases are already taken.";
  97648. ok = 0;
  97649. for a in (args)
  97650. if (index(a, " "))
  97651. elseif (rp = $mail_agent:reserved_pattern(a))
  97652. player:tell("Mailing list name \"", a, "\" uses a reserved pattern: ", rp[1]);
  97653. return 0;
  97654. elseif (valid(p = $mail_agent:match(a, #-1)) && (a in p.aliases))
  97655. player:tell("Mailing list name \"", a, "\" in use on ", p.name, "(", p, ")");
  97656. return 0;
  97657. else
  97658. ok = 1;
  97659. endif
  97660. endfor
  97661. return ok;
  97662. .
  97663. #47:9
  97664. ":match(string) => mailing list object in here that matches string.";
  97665. ":match(string,player) => similar but also matches against player's private mailing lists (as kept in .mail_lists).";
  97666. if (!(string = args[1]))
  97667. return $nothing;
  97668. elseif (string[1] == "*")
  97669. string = string[2..length(string)];
  97670. endif
  97671. if (valid(o = $string_utils:literal_object(string)) && ($mail_recipient in $object_utils:ancestors(o)))
  97672. return o;
  97673. elseif (rp = this:reserved_pattern(string))
  97674. return rp[2]:match_mail_recipient(string);
  97675. else
  97676. if (valid(who = {@args, player}[2]) && (typeof(use = who.mail_lists) == LIST))
  97677. use = {@this.contents, @use};
  97678. else
  97679. use = this.contents;
  97680. endif
  97681. partial = 1;
  97682. string = strsub(string, "_", "-");
  97683. for l in (use)
  97684. if (string in l.aliases)
  97685. return l;
  97686. endif
  97687. if (partial != $ambiguous_match)
  97688. for a in (l.aliases)
  97689. if ((index(a, string) == 1) && (!index(a, " ")))
  97690. if (partial)
  97691. partial = l;
  97692. elseif (partial != l)
  97693. partial = $ambiguous_match;
  97694. endif
  97695. endif
  97696. endfor
  97697. endif
  97698. endfor
  97699. return partial && $failed_match;
  97700. endif
  97701. .
  97702. #47:10
  97703. ":match_recipient(string[,meobj]) => $player or $mail_recipient object that matches string.  Optional second argument (defaults to player) is returned in the case string==\"me\" and is also used to obtain a list of private $mail_recipients to match against.";
  97704. string = args[1];
  97705. if (!string)
  97706. return $nothing;
  97707. elseif ((string[1] == "*") && (string != "*"))
  97708. return this:match(@args);
  97709. elseif (string[1] == "`")
  97710. args[1][1..1] = "";
  97711. return $string_utils:match_player(@args);
  97712. elseif (valid(o = $string_utils:match_player(@args)) || (o == $ambiguous_match))
  97713. return o;
  97714. else
  97715. return this:match(@args);
  97716. endif
  97717. .
  97718. #47:11
  97719. match_result = args[1];
  97720. string = args[2];
  97721. cmd_id = ({@args, ""}[3] || "");
  97722. if (match_result == $nothing)
  97723. player:tell(cmd_id, "You must specify a valid mail recipient.");
  97724. elseif (match_result == $failed_match)
  97725. player:tell(cmd_id, "There is no mail recipient called \"", string, "\".");
  97726. elseif (match_result == $ambiguous_match)
  97727. if ((nostar = (index(string, "*") != 1)) && (lst = $player_db:find_all(string)))
  97728. player:tell(cmd_id, "\"", string, "\" could refer to ", (length(lst) > 20) ? tostr("any of ", length(lst), " players") | $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", lst), "no one", " or "), ".");
  97729. else
  97730. player:tell(cmd_id, "I don't know which \"", nostar ? "*" | "", string, "\" you mean.");
  97731. endif
  97732. elseif (!valid(match_result))
  97733. player:tell(cmd_id, match_result, " does not exist.");
  97734. else
  97735. return 0;
  97736. endif
  97737. return 1;
  97738. .
  97739. #47:12
  97740. ":make_message(sender,recipients,subject/replyto,body)";
  97741. " => message in the form as it will get sent.";
  97742. from = args[1];
  97743. fromline = tostr(valid(from) ? from.name | "???", " (", from, ")");
  97744. if (typeof(recips = args[2]) != LIST)
  97745. recips = {recips};
  97746. endif
  97747. recips = this:name_list(@recips);
  97748. if (typeof(hdrs = args[3]) != LIST)
  97749. subj = hdrs;
  97750. replyto = (valid(from) && ((!is_player(from)) && ((!$object_utils:isa(from, $mail_recipient)) && this:name(from.owner))));
  97751. else
  97752. subj = hdrs[1];
  97753. replyto = ({@hdrs, 0}[2] && this:name_list(@hdrs[2]));
  97754. endif
  97755. body = args[4];
  97756. if (typeof(body) != LIST)
  97757. body = (body ? {body} | {});
  97758. endif
  97759. return {time(), fromline, recips, subj || " ", @replyto ? {"Reply-to: " + replyto} | {}, "", @body};
  97760. .
  97761. #47:13
  97762. what = args[1];
  97763. return tostr(strsub(strsub($object_utils:isa(what, $player) ? what.name | tostr("*", what:mail_name()), "(", ""), ")", ""), " (", what, ")");
  97764. .
  97765. #47:14
  97766. return $string_utils:english_list($list_utils:map_arg(this, "name", args), "no one");
  97767. .
  97768. #47:15
  97769. ":parse_address_field(string) => list of objects";
  97770. "This is the standard routine for parsing address lists that appear in From:, To: and Reply-To: lines";
  97771. objects = {};
  97772. string = args[1];
  97773. while (e = index(string, ")"))
  97774. if ((s = rindex(string[1..e], "(#")) && (#0 != (o = toobj(string[s + 2..e - 1]))))
  97775. objects = {@objects, o};
  97776. endif
  97777. string = string[e + 1..length(string)];
  97778. endwhile
  97779. return objects;
  97780. .
  97781. #47:16
  97782. ":display_seq_full(msg_seq[,preamble]) => {cur, last-read-date}";
  97783. "This is the default message display routine.";
  97784. "Prints entire messages on folder (caller) to player.  msg_seq is the handle returned by :parse_message_seq(...) and indicates which messages should be printed.  preamble, if given will precede the output of the message itself, in which case the message number will be substituted for \"%d\".  Returns the number of the final message in the sequence (which can be then used as the new current message number).";
  97785. set_task_perms(caller_perms());
  97786. preamble = {@args, ""}[2];
  97787. cur = (date = 0);
  97788. for x in (msgs = caller:messages_in_seq(args[1]))
  97789. cur = x[1];
  97790. date = x[2][1];
  97791. player:display_message(preamble ? strsub(preamble, "%d", tostr(cur)) | {}, player:msg_text(@x[2]));
  97792. if ((ticks_left() < 500) || (seconds_left() < 2))
  97793. suspend(0);
  97794. endif
  97795. endfor
  97796. return {cur, date};
  97797. .
  97798. #47:17
  97799. ":display_seq_headers(msg_seq[,cur[,last_read_date]])";
  97800. "This is the default header display routine.";
  97801. "Prints a list of headers of messages on caller to player.  msg_seq is the handle returned by caller:parse_message_seq(...).  cur is the player's current message.  last_read_date is the date of the last of the already-read messages.";
  97802. set_task_perms(caller_perms());
  97803. cur = {@args, 0}[2];
  97804. last_old = {@args, $maxint, $maxint}[3];
  97805. width = (player:linelen() || 79);
  97806. for x in (msgs = caller:messages_in_seq(args[1]))
  97807. line = tostr($string_utils:right(x[1], 4, (cur == x[1]) ? ">" | " "), (x[2][1] > last_old) ? ":+ " | ":  ", caller:msg_summary_line(@x[2]));
  97808. player:tell(line[1..min(width, length(line))]);
  97809. if ((ticks_left() < 500) || (seconds_left() < 2))
  97810. suspend(0);
  97811. endif
  97812. endfor
  97813. player:tell("----+");
  97814. .
  97815. #47:18
  97816. ":rm_message_seq(msg_seq)  removes the given sequence of from folder (caller)";
  97817. "...removed messages are saved in .messages_going for possible restoration.";
  97818. set_task_perms(caller_perms());
  97819. old = caller.messages;
  97820. new = (save = (nums = {}));
  97821. next = 1;
  97822. for i in [1..length(seq = args[1]) / 2]
  97823. if ((ticks_left() < 500) || (seconds_left() < 2))
  97824. player:tell("... rmm ", old[next][1] - 1);
  97825. suspend(0);
  97826. endif
  97827. start = seq[(2 * i) - 1];
  97828. new = {@new, @old[next..start - 1]};
  97829. save = {@save, {start - next, old[start..(next = seq[2 * i]) - 1]}};
  97830. nums = {@nums, old[start][1], old[next - 1][1] + 1};
  97831. endfor
  97832. new = {@new, @old[next..length(old)]};
  97833. caller.messages_going = save;
  97834. caller.messages = new;
  97835. if ($object_utils:has_callable_verb(caller, "_fix_last_msg_date"))
  97836. caller:_fix_last_msg_date();
  97837. endif
  97838. return $seq_utils:tostr(nums);
  97839. .
  97840. #47:19
  97841. ":undo_rmm()  restores previously deleted messages in .messages_going to .messages.";
  97842. set_task_perms(caller_perms());
  97843. old = caller.messages;
  97844. new = (seq = {});
  97845. last = 0;
  97846. next = 1;
  97847. for s in (caller.messages_going)
  97848. new = {@new, @old[last + 1..last + s[1]], @s[2]};
  97849. last = (last + s[1]);
  97850. seq = {@seq, next + s[1], next = (length(new) + 1)};
  97851. endfor
  97852. caller.messages = {@new, @old[last + 1..length(old)]};
  97853. caller.messages_going = {};
  97854. if ($object_utils:has_callable_verb(caller, "_fix_last_msg_date"))
  97855. caller:_fix_last_msg_date();
  97856. endif
  97857. return seq;
  97858. .
  97859. #47:20
  97860. ":list_rmm()    displays contents of .messages_going.";
  97861. ":expunge_rmm() destroys contents of .messages_going once and for all.";
  97862. "... both return the number of messages in .messages_going.";
  97863. set_task_perms(caller_perms());
  97864. msgs = (seq = {});
  97865. for s in (caller.messages_going)
  97866. msgs = {@msgs, @s[2]};
  97867. endfor
  97868. if (verb == "expunge_rmm")
  97869. caller.messages_going = {};
  97870. else
  97871. for x in (msgs)
  97872. player:tell($string_utils:right(x[1], 4), ":  ", caller:msg_summary_line(@x[2]));
  97873. if ((ticks_left() < 500) || (seconds_left() < 2))
  97874. suspend(0);
  97875. endif
  97876. endfor
  97877. if (msgs)
  97878. player:tell("----+");
  97879. endif
  97880. endif
  97881. return length(msgs);
  97882. .
  97883. #47:21
  97884. ":renumber([cur]) -- assumes caller is a $mail_recipient or a $player.";
  97885. "...renumbers caller.messages, doing a suspend() if necessary.";
  97886. "...returns {number of messages,new cur}.";
  97887. set_task_perms(caller_perms());
  97888. cur = {@args, 0}[1];
  97889. caller.messages_going = {};
  97890. "... blow away @rmm'ed messages since there's no way to tell what their new numbers should be...";
  97891. msgs = caller.messages;
  97892. if (cur)
  97893. cur = $list_utils:iassoc_sorted(cur, msgs);
  97894. endif
  97895. while (1)
  97896. "...find first out-of-sequence message...";
  97897. l = 0;
  97898. r = ((len = length(msgs)) + 1);
  97899. while ((r - 1) > l)
  97900. if (msgs[i = ((r + l) / 2)][1] > i)
  97901. r = i;
  97902. else
  97903. l = i;
  97904. endif
  97905. endwhile
  97906. "... r == first out-of-sequence, l == last in-sequence, l+1 == r ...";
  97907. if (l >= len)
  97908. return {l, cur};
  97909. endif
  97910. "...renumber as many messages as we have time for...";
  97911. chunk = {};
  97912. while (((r <= len) && (ticks_left() > 3000)) && (seconds_left() > 2))
  97913. for x in (msgs[r..min(r + 9, len)])
  97914. chunk = {@chunk, {r, x[2]}};
  97915. r = (r + 1);
  97916. endfor
  97917. endwhile
  97918. caller.messages = {@msgs[1..l], @chunk, @msgs[r..len]};
  97919. if (chunk)
  97920. player:tell("...(renumbering ", l + 1, " -- ", r - 1, ")");
  97921. suspend(0);
  97922. else
  97923. player:tell("You lose.  This message collection is just too big.");
  97924. return;
  97925. endif
  97926. "... have to be careful since new mail may be received at this point...";
  97927. msgs = caller.messages;
  97928. endwhile
  97929. .
  97930. #47:22
  97931. ":msg_summary_line(@msg) => date/from/subject as a single string.";
  97932. body = (("" in {@args, ""}) + 1);
  97933. if ((body > length(args)) || (!(subject = args[body])))
  97934. subject = "(None.)";
  97935. endif
  97936. date = ctime(args[1])[5..16];
  97937. from = args[2];
  97938. if (args[4] != " ")
  97939. subject = args[4];
  97940. endif
  97941. return tostr(date, "   ", $string_utils:left(from, 20), "   ", subject);
  97942. .
  97943. #47:23
  97944. ":msg_summary_line(@msg) => date/from/subject as a single string.";
  97945. blank = ("" in {@args, ""});
  97946. if ((blank < length(args)) && args[blank + 1])
  97947. if (length(args[blank + 1]) <= 28)
  97948. subject = args[blank + 1];
  97949. else
  97950. subject = (args[blank + 1][1..25] + "...");
  97951. endif
  97952. else
  97953. subject = "(None.)";
  97954. endif
  97955. if (typeof(args[1]) == NUM)
  97956. date = ctime(args[1])[5..16];
  97957. start = 2;
  97958. else
  97959. date = "?Date?";
  97960. start = 1;
  97961. endif
  97962. if ((start == 2) && (index(args[2], "From:") != 1))
  97963. from = args[2];
  97964. if (args[4] != " ")
  97965. subject = args[4];
  97966. endif
  97967. else
  97968. from = "?From?";
  97969. for line in (args[start..blank - 1])
  97970. if (index(line, "Date:") == 1)
  97971. date = $string_utils:triml(line[6..length(line)])[5..16];
  97972. elseif (index(line, "From:") == 1)
  97973. from = $string_utils:triml(line[6..length(line)]);
  97974. elseif (index(line, "Subject:") == 1)
  97975. s = $string_utils:triml(line[9..length(line)]);
  97976. if (s != "(None.)")
  97977. subject = s;
  97978. endif
  97979. endif
  97980. endfor
  97981. endif
  97982. (subject && (length(subject) > 32)) && (subject = subject[1..32]);
  97983. return tostr(date, "   ", $string_utils:left(from, 20), "   ", subject);
  97984. .
  97985. #47:24
  97986. "parse_message_seq(strings,cur[,last_old])";
  97987. "This is the default <message-sequence> parsing routine for those mail commands that refer to sequences of messages (@mail, @read,...) on a folder.";
  97988. "  caller (the folder) is assumed to be a $mail_recipient or a player.";
  97989. "  strings is the <message-sequence> portion of the arg list.";
  97990. "  cur is the number of the player's current message for this folder.";
  97991. "Returns a handle (msg_seq) that will be understood by caller:display_seq_full() or caller:display_seq_headers().";
  97992. set_task_perms(caller_perms());
  97993. if (!(nummsgs = caller:length_all_msgs()))
  97994. return "%f %<has> no messages.";
  97995. elseif (typeof(strings = args[1]) != LIST)
  97996. strings = {strings};
  97997. endif
  97998. cur = {@args, 0}[2];
  97999. last_old = {@args, 0, 0}[3];
  98000. seq = (result = {});
  98001. mode = #0;
  98002. "... changes to 0 if we start seeing message numbers, to 1 if we see masks...";
  98003. keywords = ":from:%from:to:%to:subject:body:before:after:since:until:first:last";
  98004. keyalist = {{1, "from"}, {6, "%from"}, {12, "to"}, {15, "%to"}, {19, "subject"}, {27, "body"}, {32, "before"}, {39, "after"}, {45, "since"}, {51, "until"}, {57, "first"}, {63, "last"}};
  98005. strnum = 0;
  98006. for string in (strings)
  98007. strnum = (strnum + 1);
  98008. $command_utils:suspend_if_needed(0);
  98009. if (string && ((c = index(string, ":")) && ((k = index(keywords, ":" + string[1..c - 1])) && (k == rindex(keywords, ":" + string[1..c - 1])))))
  98010. "...we have a mask to apply...";
  98011. keywd = $list_utils:assoc(k, keyalist)[2];
  98012. if (mode == #0)
  98013. seq = {1, nummsgs + 1};
  98014. endif
  98015. mode = 1;
  98016. if (k <= 27)
  98017. "...from, subject, to, body...";
  98018. pattern = string[c + 1..length(string)];
  98019. if (keywd in {"subject", "body"})
  98020. elseif (keywd[1] == "%")
  98021. pattern = $string_utils:explode(pattern, "|");
  98022. else
  98023. pattern = this:((keywd == "to") ? "_parse_to" | "_parse_from")(pattern);
  98024. if (typeof(pattern) == STR)
  98025. return pattern;
  98026. endif
  98027. endif
  98028. seq = caller:(keywd + "_msg_seq")(pattern, seq);
  98029. if (typeof(seq) == STR)
  98030. if (strnum == 1)
  98031. return seq;
  98032. else
  98033. seq = {};
  98034. endif
  98035. endif
  98036. elseif (k <= 51)
  98037. "...before, since, after, until...";
  98038. if (typeof(date = this:_parse_date(string[c + 1..length(string)])) != NUM)
  98039. return tostr("Bad date `", string, "':  ", date);
  98040. endif
  98041. s = caller:length_date_le((keywd in {"before", "since"}) ? date - 1 | (date + 86399));
  98042. if (keywd in {"before", "until"})
  98043. seq = $seq_utils:remove(seq, s + 1, nummsgs);
  98044. else
  98045. seq = $seq_utils:remove(seq, 1, s);
  98046. endif
  98047. else
  98048. "...first, last...";
  98049. if (n = tonum(string[c + 1..length(string)]))
  98050. seq = $seq_utils:(keywd + "n")(seq, n);
  98051. else
  98052. return tostr("Bad number in `", string, "'");
  98053. endif
  98054. endif
  98055. else
  98056. "...continue building the present sequence...";
  98057. if (mode)
  98058. seq && (result = $seq_utils:union(result, seq));
  98059. seq = {};
  98060. endif
  98061. mode = 0;
  98062. if (!string)
  98063. "...default case for @read and @answer: get the current message but skip to the next one if it's not there...";
  98064. if (cur)
  98065. i = min(caller:length_num_le(cur - 1) + 1, nummsgs);
  98066. seq = $seq_utils:add(seq, i, i);
  98067. else
  98068. return "%f %<has> no current message";
  98069. endif
  98070. elseif (string == "next")
  98071. if ((i = (caller:length_num_le(cur) + 1)) <= nummsgs)
  98072. seq = $seq_utils:add(seq, i, i);
  98073. else
  98074. return "%f %<has> no next message.";
  98075. endif
  98076. elseif (string == "prev")
  98077. if (i = caller:length_num_le(cur - 1))
  98078. seq = $seq_utils:add(seq, i, i);
  98079. else
  98080. return "%f %<has> no previous message.";
  98081. endif
  98082. elseif (string == "new")
  98083. s = (last_old ? caller:length_date_le(last_old) | caller:length_num_le(cur));
  98084. if (s < nummsgs)
  98085. seq = $seq_utils:add(seq, s + 1, nummsgs);
  98086. else
  98087. return "%f %<has> no new messages.";
  98088. endif
  98089. elseif (n = (tonum(string) || (((string in {"last", "$"}) && -1) || ((string == "cur") && cur))))
  98090. if (n <= 0)
  98091. seq = $seq_utils:add(seq, max(0, nummsgs + n) + 1, nummsgs);
  98092. elseif (i = caller:exists_num_eq(n))
  98093. seq = $seq_utils:add(seq, i, i);
  98094. else
  98095. return (string == "cur") ? "%f's current message has been removed." | tostr("%f %<has> no message numbered `", string, "'.");
  98096. endif
  98097. elseif (((i = index(string, "..")) > 1) || ((i = index(string, "-")) > 1))
  98098. if ((start = tonum(sst = string[1..i - 1])) > 0)
  98099. s = caller:length_num_le(start - 1);
  98100. elseif (sst in {"next", "prev", "cur"})
  98101. s = max(0, caller:length_num_le(cur - (sst != "next")) - (sst == "prev"));
  98102. elseif (sst in {"last", "$"})
  98103. s = (nummsgs - 1);
  98104. else
  98105. return {$seq_utils:union(result, seq), @strings[strnum..length(strings)]};
  98106. endif
  98107. j = ((string[i] == ".") ? i + 2 | (i + 1));
  98108. if ((end = tonum(est = string[j..length(string)])) > 0)
  98109. e = caller:length_num_le(end);
  98110. elseif (est in {"next", "prev", "cur"})
  98111. e = min(nummsgs, caller:length_num_le(cur - (est == "prev")) + (est == "next"));
  98112. elseif (est in {"last", "$"})
  98113. e = nummsgs;
  98114. else
  98115. return {$seq_utils:union(result, seq), @strings[strnum..length(strings)]};
  98116. endif
  98117. if (s < e)
  98118. seq = $seq_utils:add(seq, s + 1, e);
  98119. else
  98120. return tostr("%f %<has> no messages in range ", string, ".");
  98121. endif
  98122. elseif (string == "cur")
  98123. return "%f %<has> no current message.";
  98124. else
  98125. return {$seq_utils:union(result, seq), @strings[strnum..length(strings)]};
  98126. endif
  98127. endif
  98128. endfor
  98129. return {$seq_utils:union(result, seq)};
  98130. .
  98131. #47:25
  98132. ":_parse_from(string with |'s in it) => object list";
  98133. ":_parse_to(string with |'s in it) => object list";
  98134. "  for from:string and to:string items in :parse_message_seq";
  98135. if (verb == "_parse_to")
  98136. match_obj = (fail_obj = this);
  98137. match_verb = "match_recipient";
  98138. fail_verb = "match_failed";
  98139. else
  98140. match_obj = $string_utils;
  98141. match_verb = "match_player";
  98142. fail_obj = $command_utils;
  98143. fail_verb = "player_match_failed";
  98144. endif
  98145. plist = {};
  98146. for w in ($string_utils:explode(args[1], "|"))
  98147. if (fail_obj:(fail_verb)(p = match_obj:(match_verb)(w), w))
  98148. p = $string_utils:literal_object(w);
  98149. if ((p == $failed_match) || (!$command_utils:yes_or_no("Continue? ")))
  98150. return "Bad address list:  " + args[1];
  98151. endif
  98152. endif
  98153. plist = setadd(plist, p);
  98154. endfor
  98155. return plist;
  98156. .
  98157. #47:26
  98158. words = $string_utils:explode(args[1], "-");
  98159. if (length(words) == 1)
  98160. time = $time_utils:from_day(words[1], -1);
  98161. if (typeof(time) == ERR)
  98162. time = "weekday expected.";
  98163. endif
  98164. elseif ((!words) || ((length(words) > 3) || ((!tonum(words[1])) || (E_TYPE == (year = $code_utils:tonum({@words, "-1"}[3]))))))
  98165. time = "Date should be of the form `5-Jan', `5-Jan-92', `Wed',`Wednesday'";
  98166. else
  98167. day = tonum(words[1]);
  98168. time = $time_utils:dst_midnight($time_utils:from_month(words[2], -1, day));
  98169. if (length(words) == 3)
  98170. thisyear = tonum(ctime(time)[21..24]);
  98171. if (100 > year)
  98172. year = ((thisyear + 50) - (((thisyear - year) + 50) % 100));
  98173. endif
  98174. time = $time_utils:dst_midnight($time_utils:from_month(words[2], (year - thisyear) - (year <= thisyear), day));
  98175. endif
  98176. endif
  98177. return time;
  98178. .
  98179. #47:27
  98180. ":new_message_num() => number that the next incoming message will receive.";
  98181. set_task_perms(caller_perms());
  98182. new = ((msgs = caller.messages) ? msgs[length(msgs)][1] + 1 | 1);
  98183. if (rmsgs = caller.messages_going)
  98184. lbrm = rmsgs[length(rmsgs)][2];
  98185. return max(new, lbrm[length(lbrm)][1] + 1);
  98186. else
  98187. return new;
  98188. endif
  98189. .
  98190. #47:28
  98191. set_task_perms(caller_perms());
  98192. return length(caller.messages);
  98193. .
  98194. #47:29
  98195. set_task_perms(caller_perms());
  98196. date = args[1];
  98197. msgs = caller.messages;
  98198. if ((r = length(caller.messages)) < 25)
  98199. for l in [1..r]
  98200. if (msgs[l][2][1] > date)
  98201. return l - 1;
  98202. endif
  98203. endfor
  98204. return r;
  98205. else
  98206. l = 1;
  98207. while (l <= r)
  98208. if (date < msgs[i = ((r + l) / 2)][2][1])
  98209. r = (i - 1);
  98210. else
  98211. l = (i + 1);
  98212. endif
  98213. endwhile
  98214. return r;
  98215. endif
  98216. .
  98217. #47:30
  98218. set_task_perms(caller_perms());
  98219. date = args[1];
  98220. msgs = caller.messages;
  98221. if ((len = length(caller.messages)) < 25)
  98222. for r in [0..len - 1]
  98223. if (msgs[len - r][2][1] <= date)
  98224. return r;
  98225. endif
  98226. endfor
  98227. return len;
  98228. else
  98229. l = 1;
  98230. r = len;
  98231. while (l <= r)
  98232. if (date < msgs[i = ((r + l) / 2)][2][1])
  98233. r = (i - 1);
  98234. else
  98235. l = (i + 1);
  98236. endif
  98237. endwhile
  98238. return len - r;
  98239. endif
  98240. .
  98241. #47:31
  98242. ":length_num_le(num) => number of messages in folder numbered <= num";
  98243. set_task_perms(caller_perms());
  98244. return $list_utils:iassoc_sorted(args[1], caller.messages);
  98245. .
  98246. #47:32
  98247. ":exists_num_eq(num) => index of message in folder numbered == num";
  98248. set_task_perms(caller_perms());
  98249. return (i = $list_utils:iassoc_sorted(args[1], caller.messages)) && ((caller.messages[i][1] == args[1]) && i);
  98250. .
  98251. #47:33
  98252. ":from_msg_seq(object or list[,mask])";
  98253. " => msg_seq of messages from any of these senders";
  98254. set_task_perms(caller_perms());
  98255. if (typeof(plist = args[1]) != LIST)
  98256. plist = {plist};
  98257. endif
  98258. mask = {@args, {1}}[2];
  98259. i = 1;
  98260. fseq = {};
  98261. for msg in (caller.messages)
  98262. if ((!mask) || (i < mask[1]))
  98263. elseif ((length(mask) < 2) || (i < mask[2]))
  98264. fromline = msg[2][2];
  98265. if (toobj(fromline[rindex(fromline, "(") + 1..rindex(fromline, ")") - 1]) in plist)
  98266. fseq = $seq_utils:add(fseq, i, i);
  98267. endif
  98268. else
  98269. mask = mask[3..length(mask)];
  98270. endif
  98271. i = (i + 1);
  98272. $command_utils:suspend_if_needed(0);
  98273. endfor
  98274. return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or "));
  98275. .
  98276. #47:34
  98277. ":%from_msg_seq(string or list of strings[,mask])";
  98278. " => msg_seq of messages with one of these strings in the from line";
  98279. set_task_perms(caller_perms());
  98280. if (typeof(nlist = args[1]) != LIST)
  98281. nlist = {nlist};
  98282. endif
  98283. i = 1;
  98284. fseq = {};
  98285. mask = {@args, {1}}[2];
  98286. for msg in (caller.messages)
  98287. if ((!mask) || (i < mask[1]))
  98288. elseif ((length(mask) < 2) || (i < mask[2]))
  98289. fromline = (" " + msg[2][2]);
  98290. for n in (nlist)
  98291. if (index(fromline, n))
  98292. fseq = $seq_utils:add(fseq, i, i);
  98293. endif
  98294. endfor
  98295. else
  98296. mask = mask[3..length(mask)];
  98297. endif
  98298. i = (i + 1);
  98299. $command_utils:suspend_if_needed(0);
  98300. endfor
  98301. return fseq || ("%f %<has> no messages from " + $string_utils:english_list($list_utils:map_arg($string_utils, "print", nlist), "no one", " or "));
  98302. .
  98303. #47:35
  98304. ":to_msg_seq(object or list[,mask]) => msg_seq of messages to those people";
  98305. set_task_perms(caller_perms());
  98306. if (typeof(plist = args[1]) != LIST)
  98307. plist = {plist};
  98308. endif
  98309. mask = {@args, {1}}[2];
  98310. i = 1;
  98311. seq = {};
  98312. for msg in (caller.messages)
  98313. if ((!mask) || (i < mask[1]))
  98314. elseif ((length(mask) < 2) || (i < mask[2]))
  98315. toline = msg[2][3];
  98316. for r in ($mail_agent:parse_address_field(toline))
  98317. if (r in plist)
  98318. seq = $seq_utils:add(seq, i, i);
  98319. endif
  98320. endfor
  98321. else
  98322. mask = mask[3..length(mask)];
  98323. endif
  98324. i = (i + 1);
  98325. $command_utils:suspend_if_needed(0);
  98326. endfor
  98327. return seq || ("%f %<has> no messages to " + $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", plist), "no one", " or "));
  98328. .
  98329. #47:36
  98330. ":%to_msg_seq(string or list of strings[,mask])";
  98331. " => msg_seq of messages containing one of strings in the to line";
  98332. set_task_perms(caller_perms());
  98333. if (typeof(nlist = args[1]) != LIST)
  98334. nlist = {nlist};
  98335. endif
  98336. i = 1;
  98337. seq = {};
  98338. mask = {@args, {1}}[2];
  98339. for msg in (caller.messages)
  98340. if ((!mask) || (i < mask[1]))
  98341. elseif ((length(mask) < 2) || (i < mask[2]))
  98342. toline = (" " + msg[2][3]);
  98343. for n in (nlist)
  98344. if (index(toline, n))
  98345. seq = $seq_utils:add(seq, i, i);
  98346. endif
  98347. endfor
  98348. else
  98349. mask = mask[3..length(mask)];
  98350. endif
  98351. i = (i + 1);
  98352. $command_utils:suspend_if_needed(0);
  98353. endfor
  98354. return seq || ("%f %<has> no messages to " + $string_utils:english_list($list_utils:map_arg($string_utils, "print", nlist), "no one", " or "));
  98355. .
  98356. #47:37
  98357. ":subject_msg_seq(target) => msg_seq of messages with target in the Subject:";
  98358. set_task_perms(caller_perms());
  98359. target = args[1];
  98360. i = 1;
  98361. seq = {};
  98362. mask = {@args, {1}}[2];
  98363. for msg in (caller.messages)
  98364. if ((!mask) || (i < mask[1]))
  98365. elseif ((length(mask) < 2) || (i < mask[2]))
  98366. subject = msg[2][4];
  98367. if (index(subject, target))
  98368. seq = $seq_utils:add(seq, i, i);
  98369. endif
  98370. else
  98371. mask = mask[3..length(mask)];
  98372. endif
  98373. i = (i + 1);
  98374. $command_utils:suspend_if_needed(0);
  98375. endfor
  98376. return seq || (("%f %<has> no messages with subjects containing `" + target) + "'");
  98377. .
  98378. #47:38
  98379. ":body_msg_seq(target[,mask]) => msg_seq of messages with target in the body";
  98380. set_task_perms(caller_perms());
  98381. target = args[1];
  98382. i = 1;
  98383. seq = {};
  98384. mask = {@args, {1}}[2];
  98385. for msg in (caller.messages)
  98386. if ((!mask) || (i < mask[1]))
  98387. elseif ({@mask, $maxint}[2] <= i)
  98388. mask = mask[3..length(mask)];
  98389. elseif ((bstart = ("" in (msg = msg[2]))) && ((l = length(msg)) > bstart))
  98390. while ((!index(msg[l], target)) && ((l = (l - 1)) > bstart))
  98391. $command_utils:suspend_if_needed(0);
  98392. endwhile
  98393. if (l > bstart)
  98394. seq = $seq_utils:add(seq, i, i);
  98395. endif
  98396. endif
  98397. i = (i + 1);
  98398. $command_utils:suspend_if_needed(0);
  98399. endfor
  98400. return seq || tostr("%f %<has> no messages containing `", target, "' in the body.");
  98401. .
  98402. #47:39
  98403. ":messages_in_seq(msg_seq) => list of messages in msg_seq on folder (caller)";
  98404. set_task_perms(caller_perms());
  98405. if (typeof(msgs = args[1]) != LIST)
  98406. return caller.messages[msgs];
  98407. elseif (length(msgs) == 2)
  98408. return caller.messages[msgs[1]..msgs[2] - 1];
  98409. else
  98410. return $seq_utils:extract(msgs, caller.messages);
  98411. endif
  98412. .
  98413. #47:40
  98414. ":__convert_new(@msg) => msg in new format (if it isn't already)";
  98415. "               ^ don't forget the @ here.";
  98416. "If the msg is already in the new format it passes through unchanged.";
  98417. "If the msg format is unrecognizable, warnings are printed.";
  98418. if (typeof(date = args[1]) != NUM)
  98419. date = 0;
  98420. start = 1;
  98421. else
  98422. start = 2;
  98423. if (!((colon = index(args[2], ":")) && (args[2][1..colon] in {"From:", "To:", "Subject:"})))
  98424. return args;
  98425. endif
  98426. endif
  98427. from = (to = 0);
  98428. subject = " ";
  98429. blank = ("" in {@args, ""});
  98430. newhdr = {};
  98431. for line in (args[start..blank - 1])
  98432. if (index(line, "Date:") == 1)
  98433. if (date)
  98434. player:notify("Warning: two dates?");
  98435. endif
  98436. date = $time_utils:from_ctime(line[6..length(line)]);
  98437. elseif (index(line, "From:") == 1)
  98438. if (from)
  98439. player:notify("Warning: two from-lines?");
  98440. endif
  98441. from = $string_utils:triml(line[6..length(line)]);
  98442. elseif (index(line, "To:") == 1)
  98443. if (to)
  98444. player:notify("Warning: two to-lines?");
  98445. endif
  98446. to = $string_utils:triml(line[6..length(line)]);
  98447. elseif (index(line, "Subject:") == 1)
  98448. subject = $string_utils:triml(line[9..length(line)]);
  98449. else
  98450. newhdr = {@newhdr, line};
  98451. endif
  98452. endfor
  98453. if (!from)
  98454. player:notify("Warning: no from-line.");
  98455. endif
  98456. if (!to)
  98457. player:notify("Warning: no to-line.");
  98458. endif
  98459. return {date, from, to, subject, @newhdr, @args[blank..length(args)]};
  98460. .
  98461. #47:41
  98462. ":to_text(@msg) => message in text form (suitable for printing)";
  98463. return {"Date:     " + ctime(args[1]), "From:     " + args[2], "To:       " + args[3], @(args[4] == " ") ? {} | {"Subject:  " + args[4]}, @args[5..length(args)]};
  98464. .
  98465. #47:42
  98466. what = args[1];
  98467. if ($object_utils:isa(what, $mail_recipient))
  98468. return what:(verb)(@listdelete(args, 1));
  98469. else
  98470. "...it's a player:";
  98471. "...  anyone can send mail to it.";
  98472. "...  only the player itself or a wizard can read it.";
  98473. return (verb == "is_usable_by") || $perm_utils:controls(args[2], what);
  98474. endif
  98475. .
  98476. #47:43
  98477. "WIZARDLY";
  98478. "raw_send(text,rcpts,sender) -- does the actual sending of a message.  Assumes that text has already been formatted correctly.  Decides who to send it to and who wants to be notified about it and does so.";
  98479. "Return {E_PERM} if the caller is not entitled to use this verb.";
  98480. "Return {0, @invalid_rcpts} if rcpts contains any invalid addresses.  No mail is sent in this case.";
  98481. "Return {1, @actual_rcpts} if successful.";
  98482. text = args[1];
  98483. rcpts = args[2];
  98484. from = args[3];
  98485. if (typeof(rcpts) != LIST)
  98486. rcpts = {rcpts};
  98487. endif
  98488. if (!(caller in {$mail_agent, $mail_editor}))
  98489. return {E_PERM};
  98490. elseif (bogus = (resolve = this:resolve_addr(rcpts, from))[1])
  98491. return {0, bogus};
  98492. else
  98493. this:touch(rcpts);
  98494. actual_rcpts = resolve[2];
  98495. biffs = resolve[3];
  98496. results = {};
  98497. for recip in (actual_rcpts)
  98498. if ((ticks_left() < 1000) || (seconds_left() < 5))
  98499. player:notify(tostr("...", recip));
  98500. suspend(0);
  98501. endif
  98502. if (typeof(e = recip:receive_message(text, from)) in {ERR, STR})
  98503. "...receive_message bombed...";
  98504. player:notify(tostr(recip, ":receive_message:  ", e));
  98505. e = 0;
  98506. elseif ((!is_player(recip)) || (!e))
  98507. "...not a player or receive_message isn't giving out the message number";
  98508. "...no need to force a notification...";
  98509. elseif (i = $list_utils:iassoc(recip, biffs))
  98510. "...player-recipient was already getting a notification...";
  98511. "...make sure notification includes a mention of him/her/itself.";
  98512. if (!(recip in listdelete(biffs[i], 1)))
  98513. biffs[i][2..1] = {recip};
  98514. endif
  98515. else
  98516. "...player-recipient wasn't originally being notified at all...";
  98517. biffs = {{recip, recip}, @biffs};
  98518. endif
  98519. results = {@results, e};
  98520. endfor
  98521. fork (0)
  98522. for b in (biffs)
  98523. if ((ticks_left() < 1000) || (seconds_left() < 5))
  98524. suspend(0);
  98525. endif
  98526. if ($object_utils:has_callable_verb(b[1], "notify_mail"))
  98527. mnums = {};
  98528. for r in (listdelete(b, 1))
  98529. mnums = {@mnums, (rn = (r in actual_rcpts)) && results[rn]};
  98530. endfor
  98531. b[1]:notify_mail(from, listdelete(b, 1), mnums);
  98532. endif
  98533. endfor
  98534. endfork
  98535. return {1, @actual_rcpts};
  98536. endif
  98537. .
  98538. #47:44
  98539. ":reserved_pattern(string)";
  98540. "  if string matches one of the reserved patterns for mailing list names, ";
  98541. "  we return that element of .reserved_patterns.";
  98542. string = args[1];
  98543. for p in (this.reserved_patterns)
  98544. if (match(string, p[1]))
  98545. return p;
  98546. endif
  98547. endfor
  98548. return 0;
  98549. .
  98550. #47:45
  98551. return valid(what = args[1]) && (($player in (ances = $object_utils:ancestors(what))) || ($mail_recipient in ances));
  98552. .
  98553. #48:0
  98554. return this:ok(who = args[1]) && tostr("a letter ", this.sending[who] ? "(in transit) " | "", "to ", this:recipient_names(who), (subject = this.subjects[who]) && tostr(" entitled \"", subject, "\""));
  98555. .
  98556. #48:1
  98557. "invoke(rcptstrings,verb[,subject]) for a @send";
  98558. "invoke(1,verb,rcpts,subject,replyto,body) if no parsing is needed";
  98559. "invoke(2,verb,msg,flags,replytos) for an @answer";
  98560. if (!(which = args[1]))
  98561. player:tell_lines({tostr("Usage:  ", args[2], " <list-of-recipients>"), tostr("        ", args[2], "                      to continue with a previous draft")});
  98562. elseif (typeof(which) == LIST)
  98563. "...@send...";
  98564. if (rcpts = this:parse_recipients({}, which))
  98565. if (replyto = player:mail_option("replyto"))
  98566. replyto = this:parse_recipients({}, replyto, ".mail_options: ");
  98567. endif
  98568. if (0 == (subject = {@args, 0}[3]))
  98569. if (player:mail_option("nosubject"))
  98570. subject = "";
  98571. else
  98572. player:tell("Subject:");
  98573. subject = $command_utils:read();
  98574. endif
  98575. endif
  98576. return {rcpts, subject, replyto, {}};
  98577. endif
  98578. elseif (which == 1)
  98579. return args[3..6];
  98580. elseif (!(to_subj = this:parse_msg_headers(msg = args[3], flags = args[4])))
  98581. else
  98582. include = {};
  98583. if ("include" in flags)
  98584. prefix = ">            ";
  98585. for line in ($mail_agent:to_text(@msg))
  98586. if (!line)
  98587. prefix = ">  ";
  98588. endif
  98589. include = {@include, @this:fill_string(">  " + line, 70, prefix)};
  98590. endfor
  98591. endif
  98592. return {@to_subj, args[5], include};
  98593. endif
  98594. return 0;
  98595. .
  98596. #48:2
  98597. if (this:ok(who = args[1]))
  98598. this.sending[who] = 0;
  98599. this.recipients[who] = args[2];
  98600. this.subjects[who] = args[3];
  98601. this.replytos[who] = (args[4] || {});
  98602. this:load(who, args[5]);
  98603. this.active[who]:tell("Composing ", this:working_on(who));
  98604. p = this.active[who];
  98605. if (p:mail_option("enter") && (!args[5]))
  98606. if (typeof(lines = $command_utils:read_lines()) == ERR)
  98607. p:tell(lines);
  98608. else
  98609. this:insert_line(p in this.active, lines, 0);
  98610. endif
  98611. endif
  98612. endif
  98613. .
  98614. #48:3
  98615. if (!dobjstr)
  98616. plyr = player;
  98617. elseif ($command_utils:player_match_result(plyr = $string_utils:match_player(dobjstr), dobjstr)[1])
  98618. return;
  98619. endif
  98620. if (typeof(msg = this:message_with_headers(plyr in this.active)) != LIST)
  98621. if (player == plyr)
  98622. player:tell(msg);
  98623. else
  98624. player:tell(plyr.name, "(", plyr, ") has not published anything here.");
  98625. endif
  98626. return;
  98627. else
  98628. player:display_message({((plyr == player) ? "Your" | tostr(plyr.name, "(", plyr, ")'s")) + " message so far:", ""}, player:msg_text(@msg));
  98629. endif
  98630. .
  98631. #48:4
  98632. return (this:readable(who = args[1]) || this:ok(who)) && $mail_agent:make_message(this.active[who], this.recipients[who], {this.subjects[who], this.replytos[who]}, this:text(who));
  98633. .
  98634. #48:5
  98635. if (!(who = this:loaded(player)))
  98636. player:tell(this:nothing_loaded_msg());
  98637. elseif (!argstr)
  98638. player:tell(this.subjects[who]);
  98639. elseif (ERR == typeof(subj = this:set_subject(who, argstr)))
  98640. player:tell(subj);
  98641. else
  98642. player:tell(subj ? ("Setting the subject line for your message to \"" + subj) + "\"." | "Deleting the subject line for your message.");
  98643. endif
  98644. .
  98645. #48:6
  98646. if (!(fuckup = this:ok(who = args[1])))
  98647. return fuckup;
  98648. else
  98649. this.subjects[who] = (subj = args[2]);
  98650. this:set_changed(who, 1);
  98651. return subj;
  98652. endif
  98653. .
  98654. #48:7
  98655. if (!(who = this:loaded(player)))
  98656. player:tell(this:nothing_loaded_msg());
  98657. elseif (!args)
  98658. player:tell("Your message is currently to ", this:recipient_names(who), ".");
  98659. else
  98660. this.recipients[who] = this:parse_recipients({}, args);
  98661. this:set_changed(who, 1);
  98662. player:tell("Your message is now to ", this:recipient_names(who), ".");
  98663. endif
  98664. .
  98665. #48:8
  98666. if (!(who = this:loaded(player)))
  98667. player:tell(this:nothing_loaded_msg());
  98668. else
  98669. this.recipients[who] = this:parse_recipients(this.recipients[who], args);
  98670. this:set_changed(who, 1);
  98671. player:tell("Your message is now to ", this:recipient_names(who), ".");
  98672. endif
  98673. .
  98674. #48:9
  98675. "parse_recipients(prev_list,list_of_strings) -- parses list of strings and adds any resulting player objects to prev_list.  Optional 3rd arg is prefixed to any mismatch error messages";
  98676. recips = args[1];
  98677. cmd_id = ({@args, ""}[3] || "");
  98678. pstrings = (mdrops = {});
  98679. for s in ((typeof(l = args[2]) == LIST) ? l | {l})
  98680. if (typeof(s) != STR)
  98681. if ($mail_agent:is_recipient(s))
  98682. mdrops = {@mdrops, s};
  98683. else
  98684. player:tell(cmd_id, s, " is not a valid mail recipient.");
  98685. endif
  98686. elseif ((!s) || (s[1] != "*"))
  98687. pstrings = {@pstrings, s};
  98688. elseif (!$mail_agent:match_failed(md = $mail_agent:match(s), s, cmd_id))
  98689. mdrops = {@mdrops, md};
  98690. endif
  98691. endfor
  98692. newreps = $string_utils:match_player(pstrings);
  98693. pmr = $command_utils:player_match_result({@recips, @newreps, @mdrops}, {@recips, @pstrings, @mdrops}, cmd_id);
  98694. return listdelete(pmr, 1);
  98695. .
  98696. #48:10
  98697. return this:ok(who = args[1]) && $mail_agent:name_list(@this.recipients[who]);
  98698. .
  98699. #48:11
  98700. return $mail_agent:make_message(@args);
  98701. .
  98702. #48:12
  98703. "(obsolete verb... see $mail_agent:name_list)";
  98704. return $mail_agent:(verb)(@args[1]);
  98705. .
  98706. #48:13
  98707. "parse_msg_headers(msg,flags)";
  98708. "  parses msg to extract reply recipients and construct a subject line";
  98709. "  if the \"all\" flag is present, reply goes to all of the original recipients";
  98710. "  returns a list {recipients, subjectline} or 0 in case of error.";
  98711. msg = args[1];
  98712. replyall = ("all" in args[2]);
  98713. objects = $mail_agent:parse_address_field(msg[2] + (replyall ? msg[3] | ""));
  98714. for line in (msg[5..("" in {@msg, ""}) - 1])
  98715. if (rt = (index(line, "Reply-to:") == 1))
  98716. objects = $mail_agent:parse_address_field(line);
  98717. endif
  98718. endfor
  98719. recips = {};
  98720. for o in (objects)
  98721. if (o == #0)
  98722. player:tell("Sorry, but I can't parse the header of that message.");
  98723. return 0;
  98724. elseif ((!valid(o)) || (!(is_player(o) || ($mail_recipient in $object_utils:ancestors(o)))))
  98725. player:tell(o, " is no longer a valid player or maildrop; ignoring that recipient.");
  98726. elseif (o != player)
  98727. recips = setadd(recips, o);
  98728. endif
  98729. endfor
  98730. subject = msg[4];
  98731. if (subject == " ")
  98732. subject = "";
  98733. elseif (subject && (index(subject, "Re: ") != 1))
  98734. subject = ("Re: " + subject);
  98735. endif
  98736. return {recips, subject};
  98737. .
  98738. #48:14
  98739. flags = {};
  98740. for o in ({"all", "include"})
  98741. if (player:mail_option(o))
  98742. flags = {@flags, o};
  98743. endif
  98744. endfor
  98745. reply_to = (player:mail_option("replyto") || {});
  98746. flaglist = "+1#include -1#noinclude +2#all -2#sender 0#replyto ";
  98747. for a in (args)
  98748. if (i = index(a, "="))
  98749. value = a[i + 1..length(a)];
  98750. a = a[1..i - 1];
  98751. else
  98752. value = "";
  98753. endif
  98754. if ((typeof(a) != STR) || ((i = index(flaglist, "#" + a)) < 3))
  98755. player:tell("Unrecognized answer/reply option:  ", a);
  98756. return 0;
  98757. elseif (i != rindex(flaglist, "#" + a))
  98758. player:tell("Ambiguous answer/reply option:  ", a);
  98759. return 0;
  98760. elseif (j = (index("0123456789", flaglist[i - 1]) - 1))
  98761. if (value)
  98762. player:tell("Flag does not take a value:  ", a);
  98763. return 0;
  98764. endif
  98765. f = {"include", "all"}[j];
  98766. flags = ((flaglist[i - 2] == "+") ? setadd(flags, f) | setremove(flags, f));
  98767. elseif ((!value) || (value = this:parse_recipients({}, $string_utils:explode(value), "replyto flag:  ")))
  98768. reply_to = (value || {});
  98769. endif
  98770. endfor
  98771. return {flags, reply_to};
  98772. .
  98773. #48:15
  98774. if (!(who = this:loaded(player)))
  98775. player:tell(this:nothing_loaded_msg());
  98776. else
  98777. if (args)
  98778. this.replytos[who] = (rt = this:parse_recipients({}, args));
  98779. this:set_changed(who, 1);
  98780. else
  98781. rt = this.replytos[who];
  98782. endif
  98783. player:tell(rt ? ("Replies will go to " + $mail_agent:name_list(@this.replytos[who])) + "." | "Reply-to field is empty.");
  98784. endif
  98785. .
  98786. #48:16
  98787. "WIZARDLY";
  98788. if (!(who = this:loaded(player)))
  98789. player:notify(this:nothing_loaded_msg());
  98790. elseif (!(recips = this.recipients[who]))
  98791. player:notify("Umm... your message isn't addressed to anyone.");
  98792. elseif (this.sending[who])
  98793. player:notify("Again? ... relax... it'll get there eventually.");
  98794. else
  98795. msg = this:message_with_headers(who);
  98796. this.sending[who] = (old_sending = task_id());
  98797. this:set_changed(who, 0);
  98798. player:notify("Sending...");
  98799. "... this sucker can suspend BIG TIME...";
  98800. result = $mail_agent:raw_send(msg, recips, player);
  98801. "... the world changes...";
  98802. who = (player in this.active);
  98803. if (who && (this.sending[who] == old_sending))
  98804. "... same editing session; no problemo...";
  98805. previous = "";
  98806. this.sending[who] = 0;
  98807. else
  98808. "... uh oh, different session... tiptoe quietly out...";
  98809. "... Don't mess with the session.";
  98810. previous = "(prior send) ";
  98811. endif
  98812. if (!(e = result[1]))
  98813. player:notify(tostr(previous, (typeof(e) == ERR) ? e | ("Bogus recipients:  " + $string_utils:from_list(result[2]))));
  98814. player:notify(tostr(previous, "Mail not sent."));
  98815. previous || this:set_changed(who, 1);
  98816. elseif (length(result) == 1)
  98817. player:notify(tostr(previous, "Mail not actually sent to anyone."));
  98818. previous || this:set_changed(who, 1);
  98819. else
  98820. player:notify(tostr(previous, "Mail actually sent to ", $mail_agent:name_list(@listdelete(result, 1))));
  98821. if (previous)
  98822. "...don't even think about it...";
  98823. elseif (player.location == this)
  98824. if (ticks_left() < 10000)
  98825. suspend(0);
  98826. endif
  98827. this:done();
  98828. elseif (!this:changed(who))
  98829. "... player is gone, no further edits...";
  98830. this:kill_session(who);
  98831. endif
  98832. endif
  98833. endif
  98834. .
  98835. #48:17
  98836. if (dobjstr)
  98837. if (!(recips = this:parse_recipients({}, args)))
  98838. "parse_recipients has already complained about anything it doesn't like";
  98839. return;
  98840. endif
  98841. elseif (caller != player)
  98842. return E_PERM;
  98843. elseif (!(who = this:loaded(player)))
  98844. player:tell(this:nothing_loaded_msg());
  98845. return;
  98846. else
  98847. recips = this.recipients[who];
  98848. endif
  98849. resolve = $mail_agent:resolve_addr(recips, player);
  98850. if (resolve[1])
  98851. player:tell("Bogus addresses:  ", $string_utils:english_list(resolve[1]));
  98852. else
  98853. player:tell(dobjstr ? ("Mail to " + $mail_agent:name_list(@recips)) + " actually goes to " | "Your mail will actually go to ", $mail_agent:name_list(@resolve[2]));
  98854. endif
  98855. .
  98856. #48:18
  98857. player:tell_lines({"Available aliases:", ""});
  98858. for c in ((dobjstr == "all") ? $object_utils:descendants($mail_recipient) | $mail_agent.contents)
  98859. if (c:is_usable_by(player) || c:is_readable_by(player))
  98860. c:look_self();
  98861. endif
  98862. endfor
  98863. .
  98864. #48:19
  98865. if (!iobjstr)
  98866. player:tell("Usage:  ", verb, " [<list-of-people/lists>] to <list>");
  98867. return;
  98868. elseif ($mail_agent:match_failed(iobj = $mail_agent:match(iobjstr), iobjstr))
  98869. return;
  98870. endif
  98871. rstrs = (dobjstr ? $string_utils:explode(dobjstr) | {"me"});
  98872. recips = this:parse_recipients({}, rstrs);
  98873. outcomes = iobj:add_forward(@recips);
  98874. if (typeof(outcomes) != LIST)
  98875. player:tell(outcomes);
  98876. return;
  98877. endif
  98878. added = {};
  98879. for r in [1..length(recips)]
  98880. if ((t = typeof(e = outcomes[r])) == OBJ)
  98881. added = setadd(added, recips[r]);
  98882. else
  98883. player:tell(verb, " ", recips[r].name, " to ", iobj.name, ":  ", e);
  98884. endif
  98885. endfor
  98886. if (added)
  98887. player:tell($string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%(name) (%#)", added)), " added to ", iobj.name, " (", iobj, ")");
  98888. endif
  98889. .
  98890. #48:20
  98891. if (!iobjstr)
  98892. player:tell("Usage:  ", verb, " [<list-of-people/lists>] from <list>");
  98893. return;
  98894. elseif ($mail_agent:match_failed(iobj = $mail_agent:match(iobjstr), iobjstr))
  98895. return;
  98896. endif
  98897. rstrs = (dobjstr ? $string_utils:explode(dobjstr) | {"me"});
  98898. recips = this:parse_recipients({}, rstrs);
  98899. outcomes = iobj:delete_forward(@recips);
  98900. if (typeof(outcomes) != LIST)
  98901. player:tell(outcomes);
  98902. return;
  98903. endif
  98904. removed = {};
  98905. for r in [1..length(recips)]
  98906. if (typeof(e = outcomes[r]) == ERR)
  98907. player:tell(verb, " ", recips[r].name, " from ", iobj.name, ":  ", (e == E_INVARG) ? "Not on list." | e);
  98908. else
  98909. removed = setadd(removed, recips[r]);
  98910. endif
  98911. endfor
  98912. if (removed)
  98913. player:tell($string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%(name) (%#)", removed)), " removed from ", iobj.name, " (", iobj, ")");
  98914. endif
  98915. .
  98916. #48:21
  98917. "parse_msg_headers(msg,flags)";
  98918. "  parses msg to extract reply recipients and construct a subject line";
  98919. "  if the \"all\" flag is present, reply goes to all of the original recipients";
  98920. "  returns a list {recipients, subjectline} or 0 in case of error.";
  98921. msg = args[1];
  98922. replyall = ("all" in args[2]);
  98923. recipients = $mail_agent:parse_address_field(msg[2] + (replyall ? msg[3] | ""));
  98924. subject = msg[4];
  98925. if (subject == " ")
  98926. subject = "";
  98927. endif
  98928. noreplyto = 1;
  98929. for line in (msg[1..("" in msg) || length(msg)])
  98930. if (typeof(line) != STR)
  98931. "Skip it";
  98932. elseif (index(line, "Subject:") == 1)
  98933. subject = $string_utils:triml(line[9..length(line)]);
  98934. elseif ((rt = (index(line, "Reply-to:") == 1)) || (noreplyto && ((index(line, "From:") == 1) || (replyall && (index(line, "To:") == 1)))))
  98935. if (rt)
  98936. noreplyto = 0;
  98937. recipients = {};
  98938. endif
  98939. recipients = {@recipients, @$mail_agent:parse_address_field(line)};
  98940. endif
  98941. endfor
  98942. if (subject && (index(subject, "Re: ") != 1))
  98943. subject = ("Re: " + subject);
  98944. endif
  98945. recips = {};
  98946. for o in (recipients)
  98947. if (o == #0)
  98948. player:tell("Sorry, but I can't parse the header of that message.");
  98949. return 0;
  98950. elseif ((!valid(o)) || (!(is_player(o) || ($mail_recipient in $object_utils:ancestors(o)))))
  98951. player:tell(o, " is no longer a valid player or maildrop; ignoring that recipient.");
  98952. elseif (o != player)
  98953. recips = setadd(recips, o);
  98954. endif
  98955. endfor
  98956. return {recips, subject};
  98957. .
  98958. #48:22
  98959. return this:ok(who = args[1]) && (this.sending[who] || pass(@args));
  98960. .
  98961. #48:23
  98962. "recall that this only gets called if :retain_session_on_exit returns true";
  98963. return (this:ok(who = (player in this.active)) && (!this:changed(who))) ? {"Your message is in transit."} | this.(verb);
  98964. .
  98965. #49:0
  98966. if (this:changed(who = (player in this.active)))
  98967. player:tell("You are still editing ", this:working_on(who), ".  Please type ABORT or SAVE first.");
  98968. elseif (spec = this:parse_invoke(dobjstr, verb))
  98969. this:init_session(who, @spec);
  98970. endif
  98971. .
  98972. #49:1
  98973. if (!(who = this:loaded(player)))
  98974. player:tell(this:nothing_loaded_msg());
  98975. return;
  98976. endif
  98977. if (!dobjstr)
  98978. note = this.objects[who];
  98979. elseif (1 == (note = this:note_match_failed(dobjstr)))
  98980. return;
  98981. else
  98982. this.objects[who] = note;
  98983. endif
  98984. text = this:text(who);
  98985. strmode = ((length(text) <= 1) && this.strmode[who]);
  98986. if (strmode)
  98987. text = (text ? text[1] | "");
  98988. endif
  98989. if (ERR == typeof(result = this:set_note_text(note, text)))
  98990. player:tell("Text not saved to ", this:working_on(who), ":  ", result);
  98991. if ((result == E_TYPE) && (typeof(note) == OBJ))
  98992. player:tell("Do `mode list' and try saving again.");
  98993. elseif (!dobjstr)
  98994. player:tell("Use `save' with an argument to save the text elsewhere.");
  98995. endif
  98996. else
  98997. player:tell("Text written to ", this:working_on(who), strmode ? " as a single string." | ".");
  98998. this:set_changed(who, 0);
  98999. endif
  99000. .
  99001. #49:2
  99002. if (this:ok(who = args[1]))
  99003. this.strmode[who] = (strmode = (typeof(text = args[3]) == STR));
  99004. this:load(who, strmode ? text ? {text} | {} | text);
  99005. this.objects[who] = args[2];
  99006. player:tell("Now editing ", this:working_on(who), ".", strmode ? "  [string mode]" | "");
  99007. endif
  99008. .
  99009. #49:3
  99010. if (!(who = args[1]))
  99011. return "????";
  99012. endif
  99013. spec = this.objects[who];
  99014. if (typeof(spec) == LIST)
  99015. object = spec[1];
  99016. prop = spec[2];
  99017. else
  99018. object = spec;
  99019. prop = 0;
  99020. endif
  99021. return valid(object) ? tostr("\"", object.name, "\"(", object, ")", prop ? "." + prop | "") | tostr(prop ? ("." + prop) + " on " | "", "invalid object (", object, ")");
  99022. .
  99023. #49:4
  99024. ":parse_invoke(string,verb)";
  99025. " string is the actual commandline string indicating what we are to edit";
  99026. " verb is the command verb that is attempting to invoke the editor";
  99027. if (!(string = args[1]))
  99028. player:tell_lines({("Usage:  " + args[2]) + " <note>   (where <note> is some note object)", ("        " + args[2]) + "          (continues editing an unsaved note)"});
  99029. elseif (1 == (note = this:note_match_failed(string)))
  99030. elseif (ERR == typeof(text = this:note_text(note)))
  99031. player:tell("Couldn't retrieve text:  ", text);
  99032. else
  99033. return {note, text};
  99034. endif
  99035. return 0;
  99036. .
  99037. #49:5
  99038. "WIZARDLY";
  99039. if ((caller != $note_editor) || (caller_perms() != $note_editor.owner))
  99040. return E_PERM;
  99041. endif
  99042. set_task_perms(player);
  99043. if (typeof(spec = args[1]) == OBJ)
  99044. text = spec:text();
  99045. else
  99046. text = spec[1].(spec[2]);
  99047. endif
  99048. if (((tt = typeof(text)) in {ERR, STR}) || ((tt == LIST) && ((!text) || (typeof(text[1]) == STR))))
  99049. return text;
  99050. else
  99051. return E_TYPE;
  99052. endif
  99053. .
  99054. #49:6
  99055. "WIZARDLY";
  99056. if ((caller != $note_editor) || (caller_perms() != $note_editor.owner))
  99057. return E_PERM;
  99058. endif
  99059. set_task_perms(player);
  99060. if (typeof(spec = args[1]) == OBJ)
  99061. return spec:set_text(args[2]);
  99062. else
  99063. return spec[1].(spec[2]) = args[2];
  99064. endif
  99065. .
  99066. #49:7
  99067. if (pp = $code_utils:parse_propref(string = args[1]))
  99068. object = pp[1];
  99069. prop = pp[2];
  99070. else
  99071. object = string;
  99072. prop = 0;
  99073. endif
  99074. if ($command_utils:object_match_failed(note = player:my_match_object(object, this:get_room(player)), object))
  99075. elseif (prop)
  99076. if (!$object_utils:has_property(note, prop))
  99077. player:tell(object, " has no \".", prop, "\" property.");
  99078. else
  99079. return {note, prop};
  99080. endif
  99081. elseif ((!$object_utils:has_callable_verb(note, "text")) || (!$object_utils:has_callable_verb(note, "set_text")))
  99082. player:tell(object, "(", note, ") doesn't look like a note.");
  99083. else
  99084. return note;
  99085. endif
  99086. return 1;
  99087. .
  99088. #49:8
  99089. pass(@args);
  99090. if ((who = this:loaded(player)) && this.strmode[who])
  99091. player:tell("Text will be stored as a single string instead of a list when possible.");
  99092. endif
  99093. .
  99094. #49:9
  99095. "mode [string|list]";
  99096. if (!(who = this:loaded(player)))
  99097. player:tell(this:nothing_loaded_msg());
  99098. return;
  99099. endif
  99100. if (index("string", dobjstr) == 1)
  99101. this.strmode[who] = (mode = 1);
  99102. player:tell("Now in string mode:");
  99103. elseif (index("list", dobjstr) == 1)
  99104. this.strmode[who] = (mode = 0);
  99105. player:tell("Now in list mode:");
  99106. elseif (dobjstr)
  99107. player:tell("Unrecognized mode:  ", dobjstr);
  99108. player:tell("Should be one of `string' or `list'");
  99109. return;
  99110. else
  99111. player:tell("Currently in ", mode = (this.strmode[who] ? "string " | "list "), "mode:");
  99112. endif
  99113. if (mode)
  99114. player:tell("  store text as a single string instead of a list when possible.");
  99115. else
  99116. player:tell("  always store text as a list of strings.");
  99117. endif
  99118. .
  99119. #49:10
  99120. what = args[1];
  99121. text = args[2];
  99122. cmd = ((typeof(text) == STR) ? "@set-note-string" | "@set-note-text");
  99123. name = ((typeof(what) == OBJ) ? what.name | tostr(what[1].name, ".", what[2]));
  99124. note = ((typeof(what) == OBJ) ? what | tostr(what[1], ".", what[2]));
  99125. return {name, text, tostr(cmd, " ", note)};
  99126. .
  99127. #50:0
  99128. if (!args)
  99129. player:tell("edit what?");
  99130. else
  99131. this:invoke(argstr, verb);
  99132. endif
  99133. .
  99134. #50:1
  99135. if (!(who = this:loaded(player)))
  99136. player:tell(this:nothing_loaded_msg());
  99137. return;
  99138. elseif (!(prepstr && iobjstr))
  99139. object = this.objects[who];
  99140. vname = this.verbnames[who];
  99141. changeverb = 0;
  99142. elseif ((prepstr != "as") || (!(spec = $code_utils:parse_verbref(iobjstr))))
  99143. player:tell("Usage: ", verb, " [as <object>:<verb>]");
  99144. return;
  99145. elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1], this:get_room(player)), spec[1]))
  99146. return;
  99147. else
  99148. vname = spec[2];
  99149. changeverb = 1;
  99150. endif
  99151. iobjstr = ((tostr(object) + ":") + this:verb_name(object, vname));
  99152. if (player.eval_subs && player:edit_option("eval_subs"))
  99153. text = {};
  99154. for x in (this:text(who))
  99155. text = {@text, $code_utils:substitute(x, player.eval_subs)};
  99156. endfor
  99157. else
  99158. text = this:text(who);
  99159. endif
  99160. if (result = this:set_verb_code(object, vname, text))
  99161. player:tell(iobjstr, " not compiled because:");
  99162. for x in (result)
  99163. player:tell("  ", x);
  99164. endfor
  99165. elseif (typeof(result) == ERR)
  99166. player:tell({result, ("You do not have write permission on " + iobjstr) + ".", ("The verb " + iobjstr) + " does not exist (!?!)", ("The object " + tostr(object)) + " does not exist (!?!)"}[1 + (result in {E_PERM, E_VERBNF, E_INVARG})]);
  99167. if (!prepstr)
  99168. player:tell("Do 'compile as <object>:<verb>' to write your code to another verb.");
  99169. endif
  99170. changeverb = 0;
  99171. else
  99172. player:tell(iobjstr, " successfully compiled.");
  99173. this:set_changed(who, 0);
  99174. endif
  99175. if (changeverb)
  99176. this.objects[who] = object;
  99177. this.verbnames[who] = vname;
  99178. endif
  99179. .
  99180. #50:2
  99181. return this:ok(who = args[1]) && tostr(this.objects[who], ":", this:verb_name(this.objects[who], this.verbnames[who]), " ", this:verb_args(this.objects[who], this.verbnames[who]));
  99182. "return this:ok(who = args[1]) && tostr(this.objects[who]) + \":\" + this.verbnames[who];";
  99183. .
  99184. #50:3
  99185. if (this:ok(who = args[1]))
  99186. object = args[2];
  99187. vname = args[3];
  99188. this:load(who, args[4]);
  99189. this.verbnames[who] = vname;
  99190. this.objects[who] = object;
  99191. this.active[who]:tell("Now editing ", this:working_on(who), ".");
  99192. "this.active[who]:tell(\"Now editing \", object, \":\", vname, \".\");";
  99193. endif
  99194. .
  99195. #50:4
  99196. ":parse_invoke(string,v)";
  99197. "  string is the commandline string to parse to obtain the obj:verb to edit";
  99198. "  v is the actual command verb used to invoke the editor";
  99199. " => {object, verbname, verb_code} or error";
  99200. vref = $string_utils:words(args[1]);
  99201. if ((!vref) || (!(spec = $code_utils:parse_verbref(vref[1]))))
  99202. player:tell("Usage: ", args[2], " object:verb");
  99203. return;
  99204. endif
  99205. if (argspec = listdelete(vref, 1))
  99206. if (typeof(pas = $code_utils:parse_argspec(@argspec)) == LIST)
  99207. if (pas[2])
  99208. player:tell("Don't know what to do with \"", $string_utils:from_list(pas[2], " "), "\"");
  99209. return;
  99210. endif
  99211. argspec = pas[1];
  99212. argspec[2] = ($code_utils:full_prep(argspec[2]) || argspec[2]);
  99213. else
  99214. player:tell(pas);
  99215. return;
  99216. endif
  99217. endif
  99218. if (!$command_utils:object_match_failed(object = player:my_match_object(spec[1], this:get_room(player)), spec[1]))
  99219. if (argspec)
  99220. vnum = $code_utils:find_verb_named(object, spec[2], 0);
  99221. while ((vnum >= 0) && (verb_args(object, vname = tostr(vnum)) != argspec))
  99222. vnum = $code_utils:find_verb_named(object, spec[2], vnum + 1);
  99223. endwhile
  99224. if (vnum >= 0)
  99225. code = this:fetch_verb_code(object, vname);
  99226. else
  99227. code = E_VERBNF;
  99228. endif
  99229. else
  99230. vname = tostr($code_utils:find_verb_named(object, spec[2], 0));
  99231. code = this:fetch_verb_code(object, vname);
  99232. endif
  99233. if (typeof(code) == ERR)
  99234. player:tell((code != E_VERBNF) ? code | "That object does not define that verb", argspec ? " with those args." | ".");
  99235. return code;
  99236. else
  99237. return {object, vname, code};
  99238. endif
  99239. endif
  99240. return 0;
  99241. .
  99242. #50:5
  99243. "WIZARDLY";
  99244. if ((caller != $verb_editor) || (caller_perms() != $verb_editor.owner))
  99245. return E_PERM;
  99246. else
  99247. set_task_perms(player);
  99248. return verb_code(args[1], args[2], 1);
  99249. endif
  99250. .
  99251. #50:6
  99252. "WIZARDLY";
  99253. if ((caller != $verb_editor) || (caller_perms() != $verb_editor.owner))
  99254. return E_PERM;
  99255. else
  99256. set_task_perms(player);
  99257. return set_verb_code(args[1], args[2], args[3]);
  99258. endif
  99259. .
  99260. #50:7
  99261. if (caller == $verb_editor)
  99262. set_task_perms(player);
  99263. endif
  99264. object = args[1];
  99265. vname = args[2];
  99266. code = args[3];
  99267. vname = strsub($string_utils:explode(verb_info(object, vname)[3])[1], "*", "");
  99268. name = tostr(object.name, ":", vname);
  99269. vargs = verb_args(object, vname);
  99270. prep = $string_utils:explode(vargs[2], "/")[1];
  99271. return {name, code, tostr("@program ", object, ":", vname, " ", vargs[1], " \"", prep, "\" ", vargs[3])};
  99272. .
  99273. #50:8
  99274. "verb_name(object, vname)";
  99275. "Find vname on object and return its full name (quoted).";
  99276. "This is useful for when we're working with verb numbers.";
  99277. if ((caller != $verb_editor) || (caller_perms() != $verb_editor.owner))
  99278. return E_PERM;
  99279. else
  99280. set_task_perms(player);
  99281. return tostr("\"", verb_info(args[1], args[2])[3], "\"");
  99282. endif
  99283. .
  99284. #50:9
  99285. "verb_name(object, vname)";
  99286. "Find vname on object and return its full name (quoted).";
  99287. "This is useful for when we're working with verb numbers.";
  99288. if ((caller != $verb_editor) || (caller_perms() != $verb_editor.owner))
  99289. return E_PERM;
  99290. else
  99291. set_task_perms(player);
  99292. return $string_utils:from_list(verb_args(args[1], args[2]), " ");
  99293. endif
  99294. .
  99295. #51:0
  99296. if ((caller != player) && (caller_perms() != player))
  99297. return E_PERM;
  99298. endif
  99299. if (!(who = this:loaded(player)))
  99300. player:tell(this:nothing_loaded_msg());
  99301. else
  99302. this:insert_line(who, argstr);
  99303. endif
  99304. .
  99305. #51:1
  99306. if ((caller != player) && (caller_perms() != player))
  99307. return E_PERM;
  99308. endif
  99309. if (!(who = this:loaded(player)))
  99310. player:tell(this:nothing_loaded_msg());
  99311. else
  99312. this:append_line(who, argstr);
  99313. endif
  99314. .
  99315. #51:2
  99316. if (!this:loaded(player))
  99317. player:tell(this:nothing_loaded_msg());
  99318. else
  99319. lines = $command_utils:read_lines();
  99320. if (typeof(lines) == ERR)
  99321. player:notify(tostr(lines));
  99322. return;
  99323. endif
  99324. this:insert_line(this:loaded(player), lines, 0);
  99325. endif
  99326. .
  99327. #51:3
  99328. nonum = 0;
  99329. if (verb == "view")
  99330. if (!args)
  99331. l = {};
  99332. for i in [1..length(this.active)]
  99333. if (this.readable[i])
  99334. l = {@l, this.active[i]};
  99335. endif
  99336. endfor
  99337. if (l)
  99338. player:tell("Players having readable texts in this editor:  ", $string_utils:names_of(l));
  99339. else
  99340. player:tell("No one has published anything in this editor.");
  99341. endif
  99342. return;
  99343. elseif ($command_utils:player_match_result(plyr = $string_utils:match_player(args[1]), args[1])[1])
  99344. "...no such player";
  99345. return;
  99346. elseif ((!(who = this:loaded(plyr))) || (!this:readable(who)))
  99347. player:tell(plyr.name, "(", plyr, ") has not published anything in this editor.");
  99348. return;
  99349. endif
  99350. args = listdelete(args, 1);
  99351. elseif (!(who = this:loaded(player)))
  99352. player:tell(this:nothing_loaded_msg());
  99353. return;
  99354. endif
  99355. len = length(this.texts[who]);
  99356. ins = this.inserting[who];
  99357. window = 8;
  99358. if (len < (2 * window))
  99359. default = {"1-$"};
  99360. elseif (ins <= window)
  99361. default = {tostr("1-", 2 * window)};
  99362. else
  99363. default = {tostr(window, "_-", window, "^"), tostr(2 * window, "$-$")};
  99364. endif
  99365. if (typeof(range = this:parse_range(who, default, @args)) != LIST)
  99366. player:tell(tostr(range));
  99367. elseif (range[3] && (!(nonum = ("nonum" == $string_utils:trim(range[3])))))
  99368. player:tell("Don't understand this:  ", range[3]);
  99369. elseif (nonum)
  99370. player:tell_lines(this.texts[who][range[1]..range[2]]);
  99371. else
  99372. for line in [range[1]..range[2]]
  99373. this:list_line(who, line);
  99374. if ($command_utils:running_out_of_time())
  99375. suspend(0);
  99376. if (!(who = this:loaded(player)))
  99377. player:tell("ack!  something bad happened during a suspend...");
  99378. return;
  99379. endif
  99380. endif
  99381. endfor
  99382. if ((ins > len) && (len == range[2]))
  99383. player:tell("^^^^");
  99384. endif
  99385. endif
  99386. .
  99387. #51:4
  99388. if (i = index(argstr, "\""))
  99389. text = argstr[i + 1..length(argstr)];
  99390. argstr = argstr[1..i - 1];
  99391. else
  99392. text = 0;
  99393. endif
  99394. spec = $string_utils:trim(argstr);
  99395. if (index("next", verb) == 1)
  99396. verb = "next";
  99397. spec = ("+" + (spec || "1"));
  99398. elseif (index("prev", verb) == 1)
  99399. verb = "prev";
  99400. spec = ("-" + (spec || "1"));
  99401. else
  99402. spec = (spec || ".");
  99403. endif
  99404. if (!(who = this:loaded(player)))
  99405. player:tell(this:nothing_loaded_msg());
  99406. elseif (ERR == typeof(number = this:parse_insert(who, spec)))
  99407. if (verb in {"next", "prev"})
  99408. player:tell("Argument must be a number.");
  99409. else
  99410. player:tell("You must specify an integer or `$' for the last line.");
  99411. endif
  99412. elseif ((number > (max = (length(this.texts[who]) + 1))) || (number < 1))
  99413. player:tell("That would take you out of range (to line ", number, "?).");
  99414. else
  99415. this.inserting[who] = number;
  99416. if (typeof(text) == STR)
  99417. this:insert_line(who, text);
  99418. else
  99419. if (verb != "next")
  99420. (number > 1) ? this:list_line(who, number - 1) | player:tell("____");
  99421. endif
  99422. if (verb != "prev")
  99423. (number < max) ? this:list_line(who, number) | player:tell("^^^^");
  99424. endif
  99425. endif
  99426. endif
  99427. .
  99428. #51:5
  99429. if (!(who = this:loaded(player)))
  99430. player:tell(this:nothing_loaded_msg());
  99431. elseif (typeof(range = this:parse_range(who, {"_", "1"}, @args)) != LIST)
  99432. player:tell(range);
  99433. elseif (range[3])
  99434. player:tell("Junk at end of cmd:  ", range[3]);
  99435. else
  99436. player:tell_lines((text = this.texts[who])[from = range[1]..to = range[2]]);
  99437. player:tell("---Line", (to > from) ? "s" | "", " deleted.  Insertion point is before line ", from, ".");
  99438. this.texts[who] = {@text[1..from - 1], @text[to + 1..length(text)]};
  99439. if (!this.changes[who])
  99440. this.changes[who] = 1;
  99441. this.times[who] = time();
  99442. endif
  99443. this.inserting[who] = from;
  99444. endif
  99445. .
  99446. #51:6
  99447. if (callers() && (caller != this))
  99448. return E_PERM;
  99449. endif
  99450. if (!(who = this:loaded(player)))
  99451. player:tell(this:nothing_loaded_msg());
  99452. elseif (typeof(subst = this:parse_subst(argstr && (argstr[1] + argstr), "c", "Empty search string?")) != LIST)
  99453. player:tell(tostr(subst));
  99454. elseif (typeof(start = (subst[4] ? this:parse_insert(who, subst[4]) | this.inserting[who])) == ERR)
  99455. player:tell("Starting from where?", subst[4] ? ("  (can't parse " + subst[4]) + ")" | "");
  99456. else
  99457. search = subst[2];
  99458. case = (!index(subst[3], "c", 1));
  99459. text = this.texts[who];
  99460. tlen = length(text);
  99461. while ((start <= tlen) && (!index(text[start], search, case)))
  99462. start = (start + 1);
  99463. endwhile
  99464. if (start > tlen)
  99465. player:tell("`", search, "' not found.");
  99466. else
  99467. this.inserting[who] = (start + 1);
  99468. this:list_line(who, start);
  99469. endif
  99470. endif
  99471. .
  99472. #51:7
  99473. if (callers() && (caller != this))
  99474. return E_PERM;
  99475. endif
  99476. if (!(who = this:loaded(player)))
  99477. player:tell(this:nothing_loaded_msg());
  99478. elseif (typeof(subst = this:parse_subst(argstr)) != LIST)
  99479. player:tell(tostr(subst));
  99480. elseif (typeof(range = this:parse_range(who, {"_", "1"}, @$string_utils:explode(subst[4]))) != LIST)
  99481. player:tell(range);
  99482. elseif (range[3])
  99483. player:tell("Junk at end of cmd:  ", range[3]);
  99484. else
  99485. fromstr = subst[1];
  99486. tostr = subst[2];
  99487. global = index(subst[3], "g", 1);
  99488. case = (!index(subst[3], "c", 1));
  99489. munged = {};
  99490. text = this.texts[who];
  99491. changed = {};
  99492. for line in [from = range[1]..to = range[2]]
  99493. t = (t0 = text[line]);
  99494. if (!fromstr)
  99495. t = (tostr + t);
  99496. elseif (global)
  99497. t = strsub(t, fromstr, tostr, case);
  99498. elseif (i = index(t, fromstr, case))
  99499. t = ((t[1..i - 1] + tostr) + t[i + length(fromstr)..length(t)]);
  99500. endif
  99501. if (strcmp(t0, t))
  99502. changed = {@changed, line};
  99503. endif
  99504. munged = {@munged, t};
  99505. endfor
  99506. if (!changed)
  99507. player:tell("No changes in line", (from == to) ? tostr(" ", from) | tostr("s ", from, "-", to), ".");
  99508. else
  99509. this.texts[who] = {@text[1..from - 1], @munged, @text[to + 1..length(text)]};
  99510. if (!this.changes[who])
  99511. this.changes[who] = 1;
  99512. this.times[who] = time();
  99513. endif
  99514. for line in (changed)
  99515. this:list_line(who, line);
  99516. endfor
  99517. endif
  99518. endif
  99519. .
  99520. #51:8
  99521. verb = ((is_move = (verb[1] == "m")) ? "move" | "copy");
  99522. if (!(who = this:loaded(player)))
  99523. player:tell(this:nothing_loaded_msg());
  99524. return;
  99525. endif
  99526. wargs = args;
  99527. t = (to_pos = 0);
  99528. while (t = ("to" in (wargs = wargs[t + 1..length(wargs)])))
  99529. to_pos = (to_pos + t);
  99530. endwhile
  99531. range_args = args[1..to_pos - 1];
  99532. if ((!to_pos) || (ERR == typeof(dest = this:parse_insert(who, $string_utils:from_list(wargs, " ")))))
  99533. player:tell(verb, " to where? ");
  99534. elseif ((dest < 1) || (dest > ((last = length(this.texts[who])) + 1)))
  99535. player:tell("Destination (", dest, ") out of range.");
  99536. elseif (("from" in range_args) || ("to" in range_args))
  99537. player:tell("Don't use that kind of range specification with this command.");
  99538. elseif (typeof(range = this:parse_range(who, {"_", "^"}, @args[1..to_pos - 1])) != LIST)
  99539. player:tell(range);
  99540. elseif (range[3])
  99541. player:tell("Junk before `to':  ", range[3]);
  99542. elseif ((is_move && (dest >= range[1])) && (dest <= (range[2] + 1)))
  99543. player:tell("Destination lies inside range of lines to be moved.");
  99544. else
  99545. from = range[1];
  99546. to = range[2];
  99547. ins = this.inserting[who];
  99548. text = this.texts[who];
  99549. if (!is_move)
  99550. this.texts[who] = {@text[1..dest - 1], @text[from..to], @text[dest..last]};
  99551. if (ins >= dest)
  99552. this.inserting[who] = (((ins + to) - from) + 1);
  99553. endif
  99554. else
  99555. "oh shit... it's a move";
  99556. if (dest < from)
  99557. newtext = {@text[1..dest - 1], @text[from..to], @text[dest..from - 1], @text[to + 1..last]};
  99558. if ((ins >= dest) && (ins <= to))
  99559. ins = ((ins > from) ? (ins - from) + dest | (((ins + to) - from) + 1));
  99560. endif
  99561. else
  99562. newtext = {@text[1..from - 1], @text[to + 1..dest - 1], @text[from..to], @text[dest..last]};
  99563. if ((ins > from) && (ins < dest))
  99564. ins = ((ins <= to) ? ((ins + dest) - to) - 1 | (((ins - to) + from) - 1));
  99565. endif
  99566. endif
  99567. this.texts[who] = newtext;
  99568. this.inserting[who] = ins;
  99569. endif
  99570. if (!this.changes[who])
  99571. this.changes[who] = 1;
  99572. this.times[who] = time();
  99573. endif
  99574. player:tell("Lines ", is_move ? "moved." | "copied.");
  99575. endif
  99576. .
  99577. #51:9
  99578. if (!(who = this:loaded(player)))
  99579. player:tell(this:nothing_loaded_msg());
  99580. elseif (typeof(range = this:parse_range(who, {"_-^", "_", "^"}, @args)) != LIST)
  99581. player:tell(range);
  99582. elseif (range[3])
  99583. player:tell("Junk at end of cmd:  ", range[3]);
  99584. elseif (!(result = this:join_lines(who, @range[1..2], length(verb) <= 4)))
  99585. player:tell((result == 0) ? "Need at least two lines to join." | result);
  99586. else
  99587. this:list_line(who, range[1]);
  99588. endif
  99589. .
  99590. #51:10
  99591. fill_column = 70;
  99592. if (!(who = this:loaded(player)))
  99593. player:tell(this:nothing_loaded_msg());
  99594. elseif (typeof(range = this:parse_range(who, {"_", "1"}, @args)) != LIST)
  99595. player:tell(range);
  99596. elseif (range[3] && ((range[3][1] != "@") || ((fill_column = tonum(range[3][2..length(range[3])])) < 10)))
  99597. player:tell("Usage:  fill [<range>] [@ column]   (where column >= 10).");
  99598. else
  99599. join = this:join_lines(who, @range[1..2], 1);
  99600. newlines = this:fill_string((text = this.texts[who])[from = range[1]], fill_column);
  99601. if (fill = (((nlen = length(newlines)) > 1) || (newlines[1] != text[from])))
  99602. this.texts[who] = {@text[1..from - 1], @newlines, @text[from + 1..length(text)]};
  99603. if (((insert = this.inserting[who]) > from) && (nlen > 1))
  99604. this.inserting[who] = ((insert + nlen) - 1);
  99605. endif
  99606. endif
  99607. if (fill || join)
  99608. for line in [from..(from + nlen) - 1]
  99609. this:list_line(who, line);
  99610. endfor
  99611. else
  99612. player:tell("No changes.");
  99613. endif
  99614. endif
  99615. .
  99616. #51:11
  99617. if (!(who = this:loaded(player)))
  99618. player:tell(this:nothing_loaded_msg());
  99619. return;
  99620. endif
  99621. if (typeof(e = this:set_readable(who, index("publish", verb) == 1)) == ERR)
  99622. player:tell(e);
  99623. elseif (e)
  99624. player:tell("Your text is now globally readable.");
  99625. else
  99626. player:tell("Your text is read protected.");
  99627. endif
  99628. .
  99629. #51:12
  99630. if (!(this:ok(who = (player in this.active)) && (typeof(this.texts[who]) == LIST)))
  99631. player:tell(this:nothing_loaded_msg());
  99632. else
  99633. player:tell("You are editing ", this:working_on(who), ".");
  99634. player:tell("Your insertion point is ", (this.inserting[who] > length(this.texts[who])) ? "after the last line: next line will be #" | "before line ", this.inserting[who], ".");
  99635. player:tell(this.changes[who] ? this:change_msg() | this:no_change_msg());
  99636. if (this.readable[who])
  99637. player:tell("Your text is globally readable.");
  99638. endif
  99639. endif
  99640. .
  99641. #51:13
  99642. if (!this.changes[who = (player in this.active)])
  99643. player:tell("No changes to throw away.  Editor cleared.");
  99644. else
  99645. player:tell("Throwing away session for ", this:working_on(who), ".");
  99646. endif
  99647. this:reset_session(who);
  99648. if (this.exit_on_abort)
  99649. this:done();
  99650. endif
  99651. .
  99652. #51:14
  99653. if (!(caller in {this, player}))
  99654. return E_PERM;
  99655. elseif (!valid(origin = this.original[who = (player in this.active)]))
  99656. player:tell("I don't know where you came here from.");
  99657. else
  99658. player:moveto(origin);
  99659. if (player.location == this)
  99660. player:tell("Hmmm... the place you came from doesn't want you back.");
  99661. else
  99662. if (msg = this:return_msg())
  99663. player.location:announce($string_utils:pronoun_sub(msg));
  99664. endif
  99665. return;
  99666. endif
  99667. endif
  99668. player:tell("You'll have to use 'home' or a teleporter.");
  99669. .
  99670. #51:15
  99671. "This catches subst and find commands that don't fit into the usual model, e.g., s/.../.../ without the space after the s, and find commands without the verb `find'.  Still behaves in annoying ways (e.g., loses if the search string contains multiple whitespace), but better than before.";
  99672. set_task_perms(caller_perms());
  99673. if ((c = callers()) && ((c[1][1] != this) || (length(c) > 1)))
  99674. return pass(@args);
  99675. endif
  99676. verb = args[1];
  99677. v = 1;
  99678. vmax = min(length(verb), 5);
  99679. while ((v <= vmax) && (verb[v] == "subst"[v]))
  99680. v = (v + 1);
  99681. endwhile
  99682. argstr = $code_utils:argstr(verb, args[2]);
  99683. if (((v > 1) && (v <= length(verb))) && (((vl = verb[v]) < "A") || (vl > "Z")))
  99684. argstr = ((verb[v..length(verb)] + (argstr && " ")) + argstr);
  99685. return this:subst();
  99686. elseif ("/" == verb[1])
  99687. argstr = ((verb + (argstr && " ")) + argstr);
  99688. return this:find();
  99689. else
  99690. pass(@args);
  99691. endif
  99692. .
  99693. #51:16
  99694. return this:ok(who = args[1]) && this.inserting[who];
  99695. .
  99696. #51:17
  99697. return this:ok(who = args[1]) && ((((ins = tonum(args[2])) < 1) ? E_INVARG | ((ins <= (max = (length(this.texts[who]) + 1))) || (ins = max))) && (this.inserting[who] = ins));
  99698. .
  99699. #51:18
  99700. return this:ok(who = args[1]) && this.changes[who];
  99701. .
  99702. #51:19
  99703. return this:ok(who = args[1]) && (((unchanged = (!args[2])) || (this.times[who] = time())) && (this.changes[who] = (!unchanged)));
  99704. .
  99705. #51:20
  99706. return this:ok(who = args[1]) && this.original[who];
  99707. .
  99708. #51:21
  99709. return this:ok(who = args[1]) && (((valid(origin = args[2]) && (origin != this)) || ((origin == $nothing) || E_INVARG)) && (this.original[who] = origin));
  99710. .
  99711. #51:22
  99712. return (((who = args[1]) < 1) || (who > length(this.active))) ? E_RANGE | this.readable[who];
  99713. .
  99714. #51:23
  99715. return this:ok(who = args[1]) && (this.readable[who] = (!(!args[2])));
  99716. .
  99717. #51:24
  99718. return (this:readable(who = (args[1] || (player in this.active))) || this:ok(who)) && this.texts[who];
  99719. .
  99720. #51:25
  99721. texts = args[2];
  99722. if (!(fuckup = this:ok(who = args[1])))
  99723. return fuckup;
  99724. elseif (typeof(texts) == STR)
  99725. texts = {texts};
  99726. elseif ((typeof(texts) != LIST) || (length(texts) && (typeof(texts[1]) != STR)))
  99727. return E_TYPE;
  99728. endif
  99729. this.texts[who] = texts;
  99730. this.inserting[who] = (length(texts) + 1);
  99731. this.changes[who] = 0;
  99732. this.readable[who] = 0;
  99733. this.times[who] = time();
  99734. .
  99735. #51:26
  99736. "Dummy routine.  The child editor should provide something informative";
  99737. return this:ok(who = args[1]) && (("something [in " + this.name) + "]");
  99738. .
  99739. #51:27
  99740. who = args[1];
  99741. if ((who < 1) || (who > length(this.active)))
  99742. return E_RANGE;
  99743. elseif ((length(c = callers()) < 2) ? player == this.active[who] | ((c[2][1] == this) || ($perm_utils:controls(c[2][3], this.active[who]) || (c[2][3] == $generic_editor.owner))))
  99744. return 1;
  99745. else
  99746. return E_PERM;
  99747. endif
  99748. .
  99749. #51:28
  99750. return ((who = (args[1] in this.active)) && (typeof(this.texts[who]) == LIST)) && who;
  99751. .
  99752. #51:29
  99753. if (this:ok(who = args[1]))
  99754. f = (1 + ((line = args[2]) in {(ins = this.inserting[who]) - 1, ins}));
  99755. player:tell($string_utils:right(line, 3, " _^"[f]), ":_^"[f], " ", this.texts[who][line]);
  99756. endif
  99757. .
  99758. #51:30
  99759. ":insert_line([who,] line or list of lines [,quiet])";
  99760. "  inserts the given text at the insertion point.";
  99761. "  returns E_NONE if the session has no text loaded yet.";
  99762. if (typeof(who = args[1]) != NUM)
  99763. args = {player in this.active, @args};
  99764. endif
  99765. if (!(fuckup = this:ok(who = args[1])))
  99766. return fuckup;
  99767. elseif (typeof(text = this.texts[who]) != LIST)
  99768. return E_NONE;
  99769. else
  99770. if (typeof(lines = args[2]) != LIST)
  99771. lines = {lines};
  99772. endif
  99773. p = this.active[who];
  99774. quiet = ((length(args) >= 3) ? args[3] | p:edit_option("quiet_insert"));
  99775. insert = this.inserting[who];
  99776. this.texts[who] = {@text[1..insert - 1], @lines, @text[insert..length(text)]};
  99777. this.inserting[who] = (insert + length(lines));
  99778. if (lines)
  99779. if (!this.changes[who])
  99780. this.changes[who] = 1;
  99781. this.times[who] = time();
  99782. endif
  99783. if (!quiet)
  99784. if (length(lines) != 1)
  99785. p:tell("Lines ", insert, "-", (insert + length(lines)) - 1, " added.");
  99786. else
  99787. p:tell("Line ", insert, " added.");
  99788. endif
  99789. endif
  99790. else
  99791. p:tell("No lines added.");
  99792. endif
  99793. endif
  99794. .
  99795. #51:31
  99796. ":append_line([who,] string)";
  99797. "  appends the given string to the line before the insertion point.";
  99798. "  returns E_NONE if the session has no text loaded yet.";
  99799. if (typeof(who = args[1]) != NUM)
  99800. args = {player in this.active, @args};
  99801. endif
  99802. if (!(fuckup = this:ok(who = args[1])))
  99803. return fuckup;
  99804. elseif ((append = (this.inserting[who] - 1)) < 1)
  99805. return this:insert_line(who, {args[2]});
  99806. elseif (typeof(text = this.texts[who]) != LIST)
  99807. return E_NONE;
  99808. else
  99809. this.texts[who][append] = (text[append] + args[2]);
  99810. if (!this.changes[who])
  99811. this.changes[who] = 1;
  99812. this.times[who] = time();
  99813. endif
  99814. p = this.active[who];
  99815. if (!p:edit_option("quiet_insert"))
  99816. p:tell("Appended to line ", append, ".");
  99817. endif
  99818. endif
  99819. .
  99820. #51:32
  99821. if (!(fuckup = this:ok(who = args[1])))
  99822. return fuckup;
  99823. elseif ((from = args[2]) >= (to = args[3]))
  99824. return 0;
  99825. else
  99826. nline = "";
  99827. for line in ((text = this.texts[who])[from..to])
  99828. if (!(english = args[4]))
  99829. nline = (nline + line);
  99830. else
  99831. len = (length(line) + 1);
  99832. while ((len = (len - 1)) && (line[len] == " "))
  99833. endwhile
  99834. if (len > 0)
  99835. nline = ((nline + line) + (index(".:", line[len]) ? "  " | " "));
  99836. endif
  99837. endif
  99838. endfor
  99839. this.texts[who] = {@text[1..from - 1], nline, @text[to + 1..length(text)]};
  99840. if ((insert = this.inserting[who]) > from)
  99841. this.inserting[who] = ((insert <= to) ? from + 1 | ((insert - to) + from));
  99842. endif
  99843. if (!this.changes[who])
  99844. this.changes[who] = 1;
  99845. this.times[who] = time();
  99846. endif
  99847. return to - from;
  99848. endif
  99849. .
  99850. #51:33
  99851. "parse_number(who,string,before)   interprets string as a line number.  In the event that string is `.', `before' tells us which line to use.  Return 0 if string is bogus.";
  99852. if (!(fuckup = this:ok(who = args[1])))
  99853. return fuckup;
  99854. endif
  99855. last = length(this.texts[who]);
  99856. ins = (this.inserting[who] - 1);
  99857. string = args[2];
  99858. after = (!args[3]);
  99859. if (!string)
  99860. return 0;
  99861. elseif ("." == string)
  99862. return ins + after;
  99863. elseif (!(i = index("_^$", string[slen = length(string)])))
  99864. return tonum(string);
  99865. else
  99866. start = {ins + 1, ins, last + 1}[i];
  99867. n = 1;
  99868. if ((slen > 1) && (!(n = tonum(string[1..slen - 1]))))
  99869. return 0;
  99870. elseif (i % 2)
  99871. return start - n;
  99872. else
  99873. return start + n;
  99874. endif
  99875. endif
  99876. .
  99877. #51:34
  99878. "parse_range(who,default,@args) => {from to rest}";
  99879. numargs = length(args);
  99880. if (!(fuckup = this:ok(who = args[1])))
  99881. return fuckup;
  99882. elseif (!(last = length(this.texts[who])))
  99883. return this:no_text_msg();
  99884. endif
  99885. default = args[2];
  99886. r = 0;
  99887. while (default && (LIST != typeof(r = this:parse_range(who, {}, default[1]))))
  99888. default = listdelete(default, 1);
  99889. endwhile
  99890. if (typeof(r) == LIST)
  99891. from = r[1];
  99892. to = r[2];
  99893. else
  99894. from = (to = 0);
  99895. endif
  99896. saw_from_to = 0;
  99897. not_done = 1;
  99898. a = 2;
  99899. while (((a = (a + 1)) <= numargs) && not_done)
  99900. if (args[a] == "from")
  99901. if ((a == numargs) || (!(from = this:parse_number(who, args[a = (a + 1)], 0))))
  99902. return "from ?";
  99903. endif
  99904. saw_from_to = 1;
  99905. elseif (args[a] == "to")
  99906. if ((a == numargs) || (!(to = this:parse_number(who, args[a = (a + 1)], 1))))
  99907. return "to ?";
  99908. endif
  99909. saw_from_to = 1;
  99910. elseif (saw_from_to)
  99911. a = (a - 1);
  99912. not_done = 0;
  99913. elseif (i = index(args[a], "-"))
  99914. from = this:parse_number(who, args[a][1..i - 1], 0);
  99915. to = this:parse_number(who, args[a][i + 1..length(args[a])], 1);
  99916. not_done = 0;
  99917. elseif (f = this:parse_number(who, args[a], 0))
  99918. from = f;
  99919. if ((a == numargs) || (!(to = this:parse_number(who, args[a + 1], 1))))
  99920. to = from;
  99921. else
  99922. a = (a + 1);
  99923. endif
  99924. not_done = 0;
  99925. else
  99926. a = (a - 1);
  99927. not_done = 0;
  99928. endif
  99929. endwhile
  99930. if (from < 1)
  99931. return tostr("from ", from, "?  (out of range)");
  99932. elseif (to > last)
  99933. return tostr("to ", to, "?  (out of range)");
  99934. elseif (from > to)
  99935. return tostr("from ", from, " to ", to, "?  (backwards range)");
  99936. else
  99937. return {from, to, $string_utils:from_list(args[a..numargs], " ")};
  99938. endif
  99939. .
  99940. #51:35
  99941. "parse_ins(who,string)  interprets string as an insertion point, i.e., a position between lines and returns the number of the following line or 0 if bogus.";
  99942. if (!(fuckup = this:ok(who = args[1])))
  99943. return fuckup;
  99944. endif
  99945. who = args[1];
  99946. last = (length(this.texts[who]) + 1);
  99947. ins = this.inserting[who];
  99948. string = args[2];
  99949. if (i = index("-+", string[1]))
  99950. rest = string[2..length(string)];
  99951. return ((n = tonum(rest)) || (rest == "0")) ? {ins - n, ins + n}[i] | E_INVARG;
  99952. else
  99953. if (!(j = (index(string, "^") || index(string, "_"))))
  99954. offset = 0;
  99955. else
  99956. offset = ((j == 1) || tonum(string[1..j - 1]));
  99957. if (!offset)
  99958. return E_INVARG;
  99959. elseif (string[j] == "^")
  99960. offset = (-offset);
  99961. endif
  99962. endif
  99963. rest = string[j + 1..length(string)];
  99964. if (i = (rest in {".", "$"}))
  99965. return offset + {ins, last}[i];
  99966. elseif (!(n = tonum(rest)))
  99967. return E_INVARG;
  99968. else
  99969. return (offset + (j && (string[j] == "^"))) + n;
  99970. endif
  99971. endif
  99972. .
  99973. #51:36
  99974. recognized_flags = ((length(args) >= 2) ? args[2] | "gc");
  99975. null_subst_msg = ((length(args) >= 3) ? args[3] | "Null substitution?");
  99976. cmd = args[1];
  99977. if (!cmd)
  99978. return "/xxx/yyy[/[g][c]] [<range>] expected..";
  99979. endif
  99980. bchar = cmd[1];
  99981. cmd = cmd[2..length(cmd)];
  99982. fromstr = cmd[1..(b2 = index(cmd + bchar, bchar, 1)) - 1];
  99983. cmd = cmd[b2 + 1..length(cmd)];
  99984. tostr = cmd[1..(b2 = index(cmd + bchar, bchar, 1)) - 1];
  99985. cmd = cmd[b2 + 1..length(cmd)];
  99986. cmdlen = length(cmd);
  99987. b2 = 0;
  99988. while (((b2 = (b2 + 1)) <= cmdlen) && index(recognized_flags, cmd[b2]))
  99989. endwhile
  99990. return ((fromstr == "") && (tostr == "")) ? null_subst_msg | {fromstr, tostr, cmd[1..b2 - 1], cmd[b2..cmdlen]};
  99991. .
  99992. #51:37
  99993. ":invoke(...)";
  99994. "to find out what arguments this verb expects,";
  99995. "see this editor's parse_invoke verb.";
  99996. new = args[1];
  99997. if ((!(caller in {this, player})) && (!$perm_utils:controls(caller_perms(), player)))
  99998. "...non-editor/non-player verb trying to send someone to the editor...";
  99999. return E_PERM;
  100000. endif
  100001. if ((who = this:loaded(player)) && this:changed(who))
  100002. if (!new)
  100003. if (this:suck_in(player))
  100004. player:tell("You are working on ", this:working_on(who));
  100005. endif
  100006. return;
  100007. elseif (player.location == this)
  100008. player:tell("You are still working on ", this:working_on(who));
  100009. if (msg = this:previous_session_msg())
  100010. player:tell(msg);
  100011. endif
  100012. return;
  100013. endif
  100014. "... we're not in the editor and we're about to start something new,";
  100015. "... but there's still this pending session...";
  100016. player:tell("You were working on ", this:working_on(who));
  100017. if (!$command_utils:yes_or_no("Do you wish to delete that session?"))
  100018. if (this:suck_in(player))
  100019. player:tell("Continuing with ", this:working_on(player in this.active));
  100020. if (msg = this:previous_session_msg())
  100021. player:tell(msg);
  100022. endif
  100023. endif
  100024. return;
  100025. endif
  100026. "... note session number may have changed => don't trust `who'";
  100027. this:kill_session(player in this.active);
  100028. endif
  100029. spec = this:parse_invoke(@args);
  100030. if (typeof(spec) == LIST)
  100031. if ((player:edit_option("local") && $object_utils:has_verb(this, "local_editing_info")) && (info = this:local_editing_info(@spec)))
  100032. this:invoke_local_editor(@info);
  100033. elseif (this:suck_in(player))
  100034. this:init_session(player in this.active, @spec);
  100035. endif
  100036. endif
  100037. .
  100038. #51:38
  100039. "The correct way to move someone into the editor.";
  100040. if (((loc = (who_obj = args[1]).location) != this) && (caller == this))
  100041. this.invoke_task = task_id();
  100042. "make sure accept gets called... argh!";
  100043. who_obj.wizard && this:accept(who_obj);
  100044. who_obj:moveto(this);
  100045. if (who_obj.location == this)
  100046. fork (0)
  100047. "...forked, just in case loc:announce is broken...";
  100048. if (valid(loc) && (msg = this:depart_msg()))
  100049. loc:announce($string_utils:pronoun_sub(msg));
  100050. endif
  100051. endfork
  100052. else
  100053. who_obj:tell("For some reason, I can't move you.   (?)");
  100054. this:exitfunc(who_obj);
  100055. endif
  100056. this.invoke_task = 0;
  100057. endif
  100058. return who_obj.location == this;
  100059. .
  100060. #51:39
  100061. "WIZARDLY";
  100062. who_obj = args[1];
  100063. from = args[2];
  100064. if ($object_utils:isa(from, $generic_editor))
  100065. "... never put an editor in .original, ...";
  100066. if (w = (who_obj in from.active))
  100067. from = from.original[w];
  100068. else
  100069. from = #-1;
  100070. endif
  100071. endif
  100072. if (caller != this)
  100073. return E_PERM;
  100074. elseif (who = ((who_obj = args[1]) in this.active))
  100075. "... edit in progress here...";
  100076. if (valid(from))
  100077. this.original[who] = from;
  100078. endif
  100079. return -1;
  100080. else
  100081. for p in ({{"active", who_obj}, {"original", valid(from) ? from | $nothing}, {"times", time()}, @this.stateprops})
  100082. this.(p[1]) = {@this.(p[1]), p[2]};
  100083. endfor
  100084. return length(this.active);
  100085. endif
  100086. .
  100087. #51:40
  100088. "WIZARDLY";
  100089. if (!(fuckup = this:ok(who = args[1])))
  100090. return fuckup;
  100091. else
  100092. for p in ({@this.stateprops, {"original"}, {"active"}, {"times"}})
  100093. this.(p[1]) = listdelete(this.(p[1]), who);
  100094. endfor
  100095. return who;
  100096. endif
  100097. .
  100098. #51:41
  100099. "WIZARDLY";
  100100. if (!(fuckup = this:ok(who = args[1])))
  100101. return fuckup;
  100102. else
  100103. for p in (this.stateprops)
  100104. this.(p[1])[who] = p[2];
  100105. endfor
  100106. this.times[who] = time();
  100107. return who;
  100108. endif
  100109. .
  100110. #51:42
  100111. "WIZARDLY";
  100112. if ((caller != this) && (!caller_perms().wizard))
  100113. return E_PERM;
  100114. else
  100115. for victim in (this.contents)
  100116. victim:tell("Sorry, ", this.name, " is going down.  Your editing session is hosed.");
  100117. victim:moveto(((who = (victim in this.active)) && valid(origin = this.original[who])) ? origin | (valid(victim.home) ? victim.home | $player_start));
  100118. endfor
  100119. for p in ({@this.stateprops, {"original"}, {"active"}, {"times"}})
  100120. this.(p[1]) = {};
  100121. endfor
  100122. return 1;
  100123. endif
  100124. .
  100125. #51:43
  100126. return (is_player(who_obj = args[1]) && (who_obj.wizard || pass(@args))) && this:new_session(who_obj, who_obj.location);
  100127. .
  100128. #51:44
  100129. who_obj = args[1];
  100130. if (who_obj.wizard && (!(who_obj in this.active)))
  100131. this:accept(who_obj);
  100132. endif
  100133. pass(@args);
  100134. if (this.invoke_task == task_id())
  100135. "Means we're about to load something, so be quiet.";
  100136. this.invoke_task = 0;
  100137. elseif (who = this:loaded(who_obj))
  100138. who_obj:tell("You are working on ", this:working_on(who), ".");
  100139. elseif (msg = this:nothing_loaded_msg())
  100140. who_obj:tell(msg);
  100141. endif
  100142. .
  100143. #51:45
  100144. if (!(who = ((who_obj = args[1]) in this.active)))
  100145. elseif (this:retain_session_on_exit(who))
  100146. if (msg = this:no_littering_msg())
  100147. who_obj:tell_lines(msg);
  100148. endif
  100149. else
  100150. this:kill_session(who);
  100151. endif
  100152. pass(@args);
  100153. .
  100154. #51:46
  100155. "@flush <editor>";
  100156. "@flush <editor> at <month> <day>";
  100157. "@flush <editor> at <weekday>";
  100158. "The first form removes all sessions from the editor; the other two forms remove everything older than the given date.";
  100159. if (!$perm_utils:controls(player, this))
  100160. player:tell("Only the owner of the editor can do a ", verb, ".");
  100161. return;
  100162. endif
  100163. if (!prepstr)
  100164. player:tell("Trashing all sessions.");
  100165. this:kill_all_sessions();
  100166. elseif (prepstr != "at")
  100167. player:tell("Usage:  ", verb, " ", dobjstr, " [at [mon day|weekday]]");
  100168. else
  100169. p = (prepstr in args);
  100170. if (t = $time_utils:from_day(iobjstr, -1))
  100171. elseif (t = $time_utils:from_month(args[p + 1], -1))
  100172. if (length(args) > (p + 1))
  100173. if (!(n = tonum(args[p + 2])))
  100174. player:tell(args[p + 1], " WHAT?");
  100175. return;
  100176. endif
  100177. t = (t + ((n - 1) * 86400));
  100178. endif
  100179. else
  100180. player:tell("couldn't parse date");
  100181. return;
  100182. endif
  100183. for i in [-length(this.active)..-1]
  100184. if (this.times[-i] < t)
  100185. player:tell(this.active[-i].name, "(", this.active[-i], ") ", ctime(this.times[-i]));
  100186. this:kill_session(-i);
  100187. endif
  100188. endfor
  100189. endif
  100190. .
  100191. #51:47
  100192. if (!$perm_utils:controls(player, this))
  100193. player:tell(E_PERM);
  100194. return;
  100195. endif
  100196. if (i = index(dobjstr, "="))
  100197. default = dobjstr[i + 1..length(dobjstr)];
  100198. prop = dobjstr[1..i - 1];
  100199. if (argstr[1 + index(argstr, "=")] == "\"")
  100200. elseif (default[1] == "#")
  100201. default = toobj(default);
  100202. elseif (index("0123456789", default[1]))
  100203. default = tonum(default);
  100204. elseif (default == "{}")
  100205. default = {};
  100206. endif
  100207. else
  100208. default = 0;
  100209. prop = dobjstr;
  100210. endif
  100211. if (typeof(result = this:set_stateprops(prop, default)) == ERR)
  100212. player:tell((result == E_RANGE) ? tostr(".", prop, " needs to hold a list of the same length as .active (", length(this.active), ").") | ((result != E_NACC) ? result | (prop + " is already a property on an ancestral editor.")));
  100213. else
  100214. player:tell("Property added.");
  100215. endif
  100216. .
  100217. #51:48
  100218. if (!$perm_utils:controls(player, this))
  100219. player:tell(E_PERM);
  100220. elseif (typeof(result = this:set_stateprops(dobjstr)) == ERR)
  100221. player:tell((result != E_NACC) ? result | (dobjstr + " is already a property on an ancestral editor."));
  100222. else
  100223. player:tell("Property removed.");
  100224. endif
  100225. .
  100226. #51:49
  100227. if ($perm_utils:controls(caller_perms(), this))
  100228. pass(@args);
  100229. this:kill_all_sessions();
  100230. endif
  100231. .
  100232. #51:50
  100233. if (caller_perms().wizard)
  100234. pass();
  100235. this:kill_all_sessions();
  100236. this.help = $editor_help;
  100237. endif
  100238. .
  100239. #51:51
  100240. remove = (length(args) < 2);
  100241. if ((caller != this) && (!$perm_utils:controls(caller_perms(), this)))
  100242. return E_PERM;
  100243. elseif (!(length(args) in {1, 2}))
  100244. return E_ARGS;
  100245. elseif (typeof(prop = args[1]) != STR)
  100246. return E_TYPE;
  100247. elseif (i = $list_utils:iassoc(prop, this.stateprops))
  100248. if (!remove)
  100249. this.stateprops[i] = {prop, args[2]};
  100250. elseif ($object_utils:has_property(parent(this), prop))
  100251. return E_NACC;
  100252. else
  100253. this.stateprops = listdelete(this.stateprops, i);
  100254. endif
  100255. elseif (remove)
  100256. elseif (prop in properties(this))
  100257. if (this:_stateprop_length(prop) != length(this.active))
  100258. return E_RANGE;
  100259. endif
  100260. this.stateprops = {{prop, args[2]}, @this.stateprops};
  100261. else
  100262. return $object_utils:has_property(this, prop) ? E_NACC | E_PROPNF;
  100263. endif
  100264. return 0;
  100265. .
  100266. #51:52
  100267. is_look_self = 1;
  100268. for c in (callers())
  100269. if (is_look_self && (c[2] in {"enterfunc", "confunc"}))
  100270. return {"", "Do a 'look' to get the list of commands, or 'help' for assistance.", "", @this.description};
  100271. elseif (c[2] != "look_self")
  100272. is_look_self = 0;
  100273. endif
  100274. endfor
  100275. d = {"Commands:", ""};
  100276. col = {{}, {}};
  100277. for c in [1..2]
  100278. for cmd in (this.commands2[c])
  100279. cmd = this:commands_info(cmd);
  100280. col[c] = {cmdargs = ($string_utils:left(cmd[1] + " ", 12) + cmd[2]), @col[c]};
  100281. endfor
  100282. endfor
  100283. i1 = length(col[1]);
  100284. i2 = length(col[2]);
  100285. right = 0;
  100286. while (i1 || i2)
  100287. if (!((i1 && (length(col[1][i1]) > 35)) || (i2 && (length(col[2][i2]) > 35))))
  100288. d = {@d, $string_utils:left(i1 ? col[1][i1] | "", 40) + (i2 ? col[2][i2] | "")};
  100289. i1 && (i1 = (i1 - 1));
  100290. i2 && (i2 = (i2 - 1));
  100291. right = 0;
  100292. elseif (right && i2)
  100293. d = {@d, (length(col[2][i2]) > 35) ? $string_utils:right(col[2][i2], 75) | ($string_utils:space(40) + col[2][i2])};
  100294. i2 = (i2 - 1);
  100295. right = 0;
  100296. elseif (i1)
  100297. d = {@d, col[1][i1]};
  100298. i1 = (i1 - 1);
  100299. right = 1;
  100300. else
  100301. right = 1;
  100302. endif
  100303. endwhile
  100304. return {@d, "", "----  Do `help <cmdname>' for help with a given command.  ----", "", "  <ins> ::= $ (the end) | [^]n (above line n) | _n (below line n) | . (current)", "<range> ::= <lin> | <lin>-<lin> | from <lin> | to <lin> | from <lin> to <lin>", "  <lin> ::= n | [n]$ (n from the end) | [n]_ (n before .) | [n]^ (n after .)", "`help insert' and `help ranges' describe these in detail.", @this.description};
  100305. .
  100306. #51:53
  100307. cmd = args[1];
  100308. if (pc = $list_utils:assoc(cmd, this.commands))
  100309. return pc;
  100310. elseif (this == $generic_editor)
  100311. return {cmd, "<<<<<======= Need to add this to .commands"};
  100312. else
  100313. return parent(this):commands_info(cmd);
  100314. endif
  100315. .
  100316. #51:54
  100317. who = {@args, player}[2];
  100318. objstr = args[1];
  100319. origin = this;
  100320. while ((where = (player in origin.active)) && ($recycler:valid(origin = origin.original[where]) && (origin != this)))
  100321. if (!$object_utils:isa(origin, $generic_editor))
  100322. return origin:match_object(args[1], who);
  100323. endif
  100324. endwhile
  100325. return who:my_match_object(objstr, #-1);
  100326. .
  100327. #51:55
  100328. who = args[1];
  100329. where = {#-1, @this.original}[1 + (who in this.active)];
  100330. return strsub(this.who_location_msg, "%L", where:who_location_msg(who));
  100331. return $string_utils:pronoun_sub(this.who_location_msg, who, this, where);
  100332. .
  100333. #51:56
  100334. return this.(verb);
  100335. .
  100336. #51:57
  100337. return;
  100338. .
  100339. #51:58
  100340. "fill(string,width[,prefix])";
  100341. "tries to cut <string> into substrings of length < <width> along word boundaries.  Prefix, if supplied, will be prefixed to the 2nd..last substrings.";
  100342. if (length(args) < 2)
  100343. width = (2 + player:linelen());
  100344. prefix = "";
  100345. else
  100346. width = (args[2] + 1);
  100347. prefix = {@args, ""}[3];
  100348. endif
  100349. if (width < (3 + length(prefix)))
  100350. return E_INVARG;
  100351. endif
  100352. string = (("$" + args[1]) + " $");
  100353. len = length(string);
  100354. if (len <= width)
  100355. last = (len - 1);
  100356. next = len;
  100357. else
  100358. last = rindex(string[1..width], " ");
  100359. if (last < ((width + 1) / 2))
  100360. last = (width + index(string[width + 1..len], " "));
  100361. endif
  100362. next = last;
  100363. while (string[next = (next + 1)] == " ")
  100364. endwhile
  100365. endif
  100366. while (string[last = (last - 1)] == " ")
  100367. endwhile
  100368. ret = {string[2..last]};
  100369. width = (width - length(prefix));
  100370. minlast = ((width + 1) / 2);
  100371. while (next < len)
  100372. string = ("$" + string[next..len]);
  100373. len = ((len - next) + 2);
  100374. if (len <= width)
  100375. last = (len - 1);
  100376. next = len;
  100377. else
  100378. last = rindex(string[1..width], " ");
  100379. if (last < minlast)
  100380. last = (width + index(string[width + 1..len], " "));
  100381. endif
  100382. next = last;
  100383. while (string[next = (next + 1)] == " ")
  100384. endwhile
  100385. endif
  100386. while (string[last = (last - 1)] == " ")
  100387. endwhile
  100388. if (last > 1)
  100389. ret = {@ret, prefix + string[2..last]};
  100390. endif
  100391. endwhile
  100392. return ret;
  100393. .
  100394. #51:59
  100395. "This catches subst and find commands that don't fit into the usual model, e.g., s/.../.../ without the space after the s, and find commands without the verb `find'.  Still behaves in annoying ways (e.g., loses if the search string contains multiple whitespace), but better than before.";
  100396. if ((caller != this) && (caller_perms() != player))
  100397. return E_PERM;
  100398. endif
  100399. verb = args[1];
  100400. args = args[2];
  100401. v = 1;
  100402. vmax = min(length(verb), 5);
  100403. while ((v <= vmax) && (verb[v] == "subst"[v]))
  100404. v = (v + 1);
  100405. endwhile
  100406. argstr = $code_utils:argstr(verb, args);
  100407. if ((v > 1) && ((v <= length(verb)) && (((vl = verb[v]) < "A") || (vl > "Z"))))
  100408. argstr = ((verb[v..length(verb)] + (argstr && " ")) + argstr);
  100409. this:subst();
  100410. return 1;
  100411. elseif ("/" == verb[1])
  100412. argstr = ((verb + (argstr && " ")) + argstr);
  100413. this:find();
  100414. return 1;
  100415. else
  100416. return 0;
  100417. endif
  100418. .
  100419. #51:60
  100420. return $failed_match;
  100421. .
  100422. #51:61
  100423. ":get_room([player])  => correct room to match in on invocation.";
  100424. who = {@args, player}[1];
  100425. if (who.location != this)
  100426. return who.location;
  100427. else
  100428. origin = this;
  100429. while ((where = (player in origin.active)) && (valid(origin = origin.original[where]) && (origin != this)))
  100430. if (!$object_utils:isa(origin, $generic_editor))
  100431. return origin;
  100432. endif
  100433. endwhile
  100434. return this;
  100435. endif
  100436. .
  100437. #51:62
  100438. ":invoke_local_editor(name, text, upload)";
  100439. "Spits out the magic text that invokes the local editor in the player's client.";
  100440. "NAME is a good human-readable name for the local editor to use for this particular piece of text.";
  100441. "TEXT is a string or list of strings, the initial body of the text being edited.";
  100442. "UPLOAD, a string, is a MOO command that the local editor can use to save the text when the user is done editing.  The local editor is going to send that command on a line by itself, followed by the new text lines, followed by a line containing only `.'.  The UPLOAD command should therefore call $command_utils:read_lines() to get the new text as a list of strings.";
  100443. if (caller != this)
  100444. return;
  100445. endif
  100446. name = args[1];
  100447. text = args[2];
  100448. upload = args[3];
  100449. if (typeof(text) == STR)
  100450. text = {text};
  100451. endif
  100452. notify(player, tostr("#$# edit name: ", name, " upload: ", upload));
  100453. ":dump_lines() takes care of the final `.' ...";
  100454. for line in ($command_utils:dump_lines(text))
  100455. notify(player, line);
  100456. endfor
  100457. .
  100458. #51:63
  100459. "+c properties on children cannot necessarily be read, so we need this silliness...";
  100460. if (caller != this)
  100461. return E_PERM;
  100462. else
  100463. return length(this.(args[1]));
  100464. endif
  100465. .
  100466. #51:64
  100467. txt = this:text(player in this.active);
  100468. if (typeof(txt) == LIST)
  100469. player:tell_lines(txt);
  100470. else
  100471. player:tell("Text unreadable:  ", txt);
  100472. endif
  100473. player:tell("--------------------------");
  100474. .
  100475. #52:0
  100476. ":match(string, object-list)";
  100477. "Return object in 'object-list' aliased to 'string'.";
  100478. "Matches on a wide variety of syntax, including:";
  100479. " \"5th axe\" -- The fifth object matching \"axe\" in the object list.";
  100480. " \"where's sai\" -- The only object contained in 'where' matching \"sai\" (possible $ambiguous_match).";
  100481. " \"where's second staff\" -- The second object contained in 'where' matching \"staff\".";
  100482. " \"my third dagger\" -- The third object in your inventory matching \"dagger\".";
  100483. "Ordinal matches are determined according to the match's position in 'object-list' or, if a possessive (such as \"where\" above) is given, then the ordinal is the nth match in that object's inventory.";
  100484. "In the matching room (#3879@LambdaMOO), the 'object-list' consists of first the player's contents, then the room's, and finally all exits leading from the room.";
  100485. string = args[1];
  100486. olist = args[2];
  100487. if (!string)
  100488. return $nothing;
  100489. elseif (string == "me")
  100490. return player;
  100491. elseif (string == "here")
  100492. return player.location;
  100493. elseif (valid(object = $string_utils:literal_object(string)))
  100494. return object;
  100495. elseif (valid(object = $string_utils:match(string, olist, "aliases")))
  100496. return object;
  100497. elseif (parsed = this:parse_ordinal_reference(string))
  100498. return this:match_nth(parsed[2], olist, parsed[1]);
  100499. elseif (parsed = this:parse_possessive_reference(string))
  100500. whostr = parsed[1];
  100501. objstr = parsed[2];
  100502. if (valid(whose = this:match(whostr, olist)))
  100503. return this:match(objstr, whose.contents);
  100504. else
  100505. return whose;
  100506. endif
  100507. else
  100508. return object;
  100509. endif
  100510. .
  100511. #52:1
  100512. what = args[1];
  100513. where = args[2];
  100514. n = args[3];
  100515. for v in (where)
  100516. z = 0;
  100517. for q in (v.aliases)
  100518. z = (z || index(q, what));
  100519. endfor
  100520. if (z && (!(n = (n - 1))))
  100521. return v;
  100522. endif
  100523. endfor
  100524. return $failed_match;
  100525. .
  100526. #52:2
  100527. "$match_utils:match_verb(verbname, object) => Looks for a command-line style verb named <verbname> on <object> with current values of prepstr, dobjstr, dobj, iobjstr, and iobj.  If a match is made, the verb is called and 1 is returned.  Otherwise, 0 is returned.";
  100528. vrb = args[1];
  100529. what = args[2];
  100530. if (where = $object_utils:has_verb(what, vrb))
  100531. if ((vargs = verb_args(where[1], vrb)) != {"this", "none", "this"})
  100532. if (((((((vargs[2] == "any") || ((!prepstr) && (vargs[2] == "none"))) || index(("/" + vargs[2]) + "/", ("/" + prepstr) + "/")) && (((vargs[1] == "any") || ((!dobjstr) && (vargs[1] == "none"))) || ((dobj == what) && (vargs[1] == "this")))) && (((vargs[3] == "any") || ((!iobjstr) && (vargs[3] == "none"))) || ((iobj == what) && (vargs[3] == "this")))) && index(verb_info(where[1], vrb)[2], "x")) && verb_code(where[1], vrb))
  100533. set_task_perms(caller_perms());
  100534. what:(vrb)(@args[3]);
  100535. return 1;
  100536. endif
  100537. endif
  100538. endif
  100539. .
  100540. #52:3
  100541. what = args[1];
  100542. where = args[2];
  100543. r = {};
  100544. for v in (where)
  100545. if (!(v in r))
  100546. z = 0;
  100547. for q in (v.aliases)
  100548. z = (z || (index(q, what) == 1));
  100549. endfor
  100550. if (z)
  100551. r = listappend(r, v);
  100552. endif
  100553. endif
  100554. endfor
  100555. return r;
  100556. .
  100557. #52:4
  100558. ":parse_ordref(string)";
  100559. "Parses strings referring to an 'nth' object.";
  100560. "=> {NUM n, STR object} Where 'n' is the number the ordinal represents, and 'object' is the rest of the string.";
  100561. "=> 0 If the given string is not an ordinal reference.";
  100562. "  Example:";
  100563. ":parse_ordref(\"second broadsword\") => {2, \"broadsword\"}";
  100564. ":parse_ordref(\"second\") => 0";
  100565. "  Note that there must be more to the string than the ordinal alone.";
  100566. if (m = match(args[1], ("^" + this.ordinal_regexp) + " +%([^ ].+%)$"))
  100567. o = substitute("%1", m);
  100568. n = ((o in this.ordn) || (o in this.ordw));
  100569. return n && {n, substitute("%2", m)};
  100570. else
  100571. return 0;
  100572. endif
  100573. .
  100574. #52:5
  100575. ":parse_possessive_reference(string)";
  100576. "Parses strings referring to someone's object.";
  100577. "=> {STR whose, STR object}  Where 'whose' is the possessor of 'object'.";
  100578. "=> 0 If the given string is not a possessive reference.";
  100579. "  Example:";
  100580. ":parse_possessive_reference(\"joe's cat\") => {\"joe\", \"cat\"}";
  100581. ":parse_possessive_reference(\"sis' fish\") => {\"sis\", \"fish\"}";
  100582. "  Strings are returned as a value suitable for a :match routine, thus 'my' becoming 'me'.";
  100583. ":parse_possessive_reference(\"my dog\") => {\"me\", \"dog\"}";
  100584. "  Note that there must be more to the string than the possessive alone.";
  100585. ":parse_possessive_reference(\"my\") => 0";
  100586. string = args[1];
  100587. if (m = match(string, "^my +%([^ ].+%)$"))
  100588. return {"me", substitute("%1", m)};
  100589. elseif (m = match(string, "^%([^ ]+s?%)%'s? +%([^ ].+%)$"))
  100590. return {substitute("%1", m), substitute("%2", m)};
  100591. else
  100592. return 0;
  100593. endif
  100594. .
  100595. #53:0
  100596. object = args[1];
  100597. prop = args[2];
  100598. if (prop in $code_utils.builtin_props)
  100599. return valid(object);
  100600. else
  100601. return !(!property_info(object, prop));
  100602. endif
  100603. .
  100604. #53:1
  100605. what = args[1];
  100606. if (what.owner != caller_perms())
  100607. set_task_perms(caller_perms());
  100608. endif
  100609. props = (properties(what) || {});
  100610. while (valid(what = parent(what)))
  100611. props = {@properties(what) || {}, @props};
  100612. endwhile
  100613. return props;
  100614. .
  100615. #53:2
  100616. ":has_verb(OBJ object, STR verbname)";
  100617. "Find out if an object has a verb matching the given verbname.";
  100618. "Returns {location} if so, 0 if not, where location is the object or the ancestor on which the verb is actually defined.";
  100619. object = args[1];
  100620. verbname = args[2];
  100621. while (E_VERBNF == (vi = verb_info(object, verbname)))
  100622. object = parent(object);
  100623. endwhile
  100624. return vi ? {object} | 0;
  100625. .
  100626. #53:3
  100627. "Usage:  has_callable_verb(object, verb)";
  100628. "See if an object has a verb that can be called by another verb (i.e., that has its x permission bit set).";
  100629. "Return {location}, where location is the object that defines the verb, or 0 if the object doesn't have the verb.";
  100630. object = args[1];
  100631. verbname = args[2];
  100632. while (valid(object))
  100633. if (index(verb_info(object, verbname)[2], "x") && verb_code(object, verbname))
  100634. return {object};
  100635. endif
  100636. object = parent(object);
  100637. endwhile
  100638. return 0;
  100639. .
  100640. #53:4
  100641. what = args[1];
  100642. if (what.owner != caller_perms())
  100643. set_task_perms(caller_perms());
  100644. endif
  100645. verbs = {};
  100646. while (valid(what))
  100647. verbs = {@verbs(what) || {}, @verbs};
  100648. what = parent(what);
  100649. endwhile
  100650. return verbs;
  100651. .
  100652. #53:5
  100653. ":match_verb(OBJ object, STR verb)";
  100654. "Find out if an object has a given verb, and some information about it.";
  100655. "Returns {OBJ location, STR verb} if matched, 0 if not.";
  100656. "Location is the object on which it is actually defined, verb is a name";
  100657. "for the verb which can subsequently be used in verb_info (i.e., no";
  100658. "asterisks).";
  100659. verbname = strsub(args[2], "*", "");
  100660. object = args[1];
  100661. while (E_VERBNF == (info = verb_info(object, verbname)))
  100662. object = parent(object);
  100663. endwhile
  100664. return info ? {object, verbname} | 0;
  100665. .
  100666. #53:6
  100667. ":isa(x,y) == valid(x) && (y==x || y in :ancestors(x))";
  100668. what = args[1];
  100669. targ = args[2];
  100670. while (valid(what))
  100671. if (what == targ)
  100672. return 1;
  100673. endif
  100674. what = parent(what);
  100675. endwhile
  100676. return 0;
  100677. .
  100678. #53:7
  100679. "Usage:  ancestors(object[, object...])";
  100680. "Return a list of all ancestors of the object(s) in args, with no duplicates.";
  100681. "If called with a single object, the result will be in order ascending up the inheritance hierarchy.  If called with multiple objects, it probably won't.";
  100682. ret = {};
  100683. for o in (args)
  100684. what = o;
  100685. while (valid(what = parent(what)))
  100686. ret = setadd(ret, what);
  100687. endwhile
  100688. endfor
  100689. return ret;
  100690. .
  100691. #53:8
  100692. what = args[1];
  100693. kids = children(what);
  100694. result = {};
  100695. for x in (kids)
  100696. result = {@result, @this:descendants(x)};
  100697. endfor
  100698. return {@kids, @result};
  100699. .
  100700. #53:9
  100701. set_task_perms(caller_perms());
  100702. what = args[1];
  100703. kids = children(what);
  100704. result = {};
  100705. for x in (kids)
  100706. result = {@result, @this:descendants_suspended(x)};
  100707. endfor
  100708. $command_utils:suspend_if_needed(0);
  100709. return {@kids, @result};
  100710. .
  100711. #53:10
  100712. r = {what = args[1]};
  100713. for k in (children(what))
  100714. r = {@r, @this:(verb)(k)};
  100715. endfor
  100716. return r;
  100717. .
  100718. #53:11
  100719. ":branches(object) => list of all descendants of object which have children.";
  100720. if (kids = children(object = args[1]))
  100721. s = {object};
  100722. for k in (kids)
  100723. s = {@s, @this:branches(k)};
  100724. endfor
  100725. return s;
  100726. else
  100727. return {};
  100728. endif
  100729. .
  100730. #53:12
  100731. ":branches_suspended(object) => descendants of object having children.";
  100732. "this version calls suspend(0) as needed";
  100733. set_task_perms(caller_perms());
  100734. if (kids = children(object = args[1]))
  100735. s = {object};
  100736. for k in (kids)
  100737. $command_utils:suspend_if_needed(0);
  100738. s = {@s, @this:branches_suspended(k)};
  100739. endfor
  100740. return s;
  100741. else
  100742. return {};
  100743. endif
  100744. .
  100745. #53:13
  100746. ":leaves(object) => list of all childless descendents of object";
  100747. s = {};
  100748. for k in (children(args[1]))
  100749. s = {@s, @this:leaves(k)};
  100750. endfor
  100751. return s || {args[1]};
  100752. .
  100753. #53:14
  100754. ":leaves_suspended(object) => list of all childless descendents of object";
  100755. "this versions calls suspend(0) as needed";
  100756. set_task_perms(caller_perms());
  100757. s = {};
  100758. for k in (children(args[1]))
  100759. $command_utils:suspend_if_needed(0);
  100760. s = {@s, @this:leaves_suspended(k)};
  100761. endfor
  100762. return s || {args[1]};
  100763. .
  100764. #53:15
  100765. "$object_utils:contains(obj1, obj2) -- does obj1 contain obj2?";
  100766. "";
  100767. "Return true iff obj2 is under obj1 in the containment hierarchy; that is, if obj1 is obj2's location, or its location's location, or ...";
  100768. loc = args[1];
  100769. what = args[2];
  100770. while (valid(what))
  100771. what = what.location;
  100772. if (what == loc)
  100773. return valid(loc);
  100774. return 1;
  100775. endif
  100776. endwhile
  100777. return 0;
  100778. .
  100779. #53:16
  100780. "all_contents(object)";
  100781. "Return a list of all objects contained (at some level) by object.";
  100782. res = {};
  100783. for y in (args[1].contents)
  100784. res = {@res, y, @$object_utils:all_contents(y)};
  100785. endfor
  100786. return res;
  100787. .
  100788. #53:17
  100789. "findable_properties(object)";
  100790. "Return a list of properties on those members of object's ancestor list that are readable or are owned by the caller (or all properties if the caller is a wizard).";
  100791. what = args[1];
  100792. props = {};
  100793. who = caller_perms();
  100794. while (what != $nothing)
  100795. if ((what.r || (who == what.owner)) || who.wizard)
  100796. props = {@properties(what), @props};
  100797. endif
  100798. what = parent(what);
  100799. endwhile
  100800. return props;
  100801. .
  100802. #53:18
  100803. "owned_properties(what[, who])";
  100804. "Return a list of all properties on WHAT owned by WHO.";
  100805. "Only wizardly verbs can specify WHO; mortal verbs can only search for properties owned by their own owners.  For more information, talk to Gary_Severn.";
  100806. what = (anc = args[1]);
  100807. who = (((c = caller_perms()).wizard && (length(args) > 1)) ? args[2] | c);
  100808. props = {};
  100809. while (anc != $nothing)
  100810. for k in (properties(anc))
  100811. if (property_info(what, k)[1] == who)
  100812. props = listappend(props, k);
  100813. endif
  100814. endfor
  100815. anc = parent(anc);
  100816. endwhile
  100817. return props;
  100818. .
  100819. #53:19
  100820. ":property_conflicts(object,newparent)";
  100821. "Looks for propertyname conflicts that would keep chparent(object,newparent)";
  100822. "  from working.";
  100823. "Returns a list of elements of the form {<propname>, @<objectlist>}";
  100824. "where <objectlist> is list of descendents of object defining <propname>.";
  100825. if (!valid(object = args[1]))
  100826. return E_INVARG;
  100827. elseif (!valid(newparent = args[2]))
  100828. return (newparent == #-1) ? {} | E_INVARG;
  100829. elseif (!($perm_utils:controls(caller_perms(), object) && (newparent.f || $perm_utils:controls(caller_perms(), newparent))))
  100830. "... if you couldn't chparent anyway, you don't need to know...";
  100831. return E_PERM;
  100832. endif
  100833. "... properties existing on newparent";
  100834. "... cannot be present on object or any descendent...";
  100835. props = (conflicts = {});
  100836. for o in ({object, @$object_utils:descendents_suspended(object)})
  100837. for p in (properties(o))
  100838. if (property_info(newparent, p))
  100839. if (i = (p in props))
  100840. conflicts[i] = {@conflicts[i], o};
  100841. else
  100842. props = {@props, p};
  100843. conflicts = {@conflicts, {p, o}};
  100844. endif
  100845. endif
  100846. $command_utils:suspend_if_needed(0);
  100847. endfor
  100848. $command_utils:suspend_if_needed(0);
  100849. endfor
  100850. return conflicts;
  100851. .
  100852. #53:20
  100853. ":descendants_with_property_suspended(object,property)";
  100854. " => list of descendants of object on which property is defined.";
  100855. "calls suspend(0) as needed";
  100856. object = args[1];
  100857. if ((caller == this) || (object.w || $perm_utils:controls(caller_perms(), object)))
  100858. $command_utils:suspend_if_needed(0);
  100859. if (property_info(@args))
  100860. return {object};
  100861. endif
  100862. r = {};
  100863. prop = args[2];
  100864. for c in (children(object))
  100865. r = {@r, @this:descendants_with_property_suspended(c, prop)};
  100866. endfor
  100867. return r;
  100868. else
  100869. return E_PERM;
  100870. endif
  100871. .
  100872. #53:21
  100873. "Usage:  locations(object)";
  100874. "Return a listing of the location hierarchy above object.";
  100875. ret = {};
  100876. what = args[1];
  100877. while (valid(what = what.location))
  100878. ret = {@ret, what};
  100879. endwhile
  100880. return ret;
  100881. .
  100882. #53:22
  100883. "Copied from object utilities (#3669):all_properties by Haakon (#2) Mon Dec 28 14:24:36 1992 PST";
  100884. what = args[1];
  100885. if (what.owner != caller_perms())
  100886. set_task_perms(caller_perms());
  100887. endif
  100888. props = (properties(what) || {});
  100889. while (valid(what = parent(what)))
  100890. props = {@properties(what) || {}, @props};
  100891. $command_utils:suspend_if_needed(0);
  100892. endwhile
  100893. return props;
  100894. .
  100895. #53:23
  100896. ":connected(object) => true iff object is a connected player.";
  100897. "equivalent to (object in connected_players()) perhaps with less server overhead";
  100898. return 1 + connected_seconds(@args);
  100899. .
  100900. #54:0
  100901. this.input_string = args[1];
  100902. this.input_length = length(args[1]);
  100903. this.input_index = 1;
  100904. .
  100905. #54:1
  100906. string = this.input_string;
  100907. len = this.input_length;
  100908. i = this.input_index;
  100909. while ((i <= len) && (string[i] == " "))
  100910. i = (i + 1);
  100911. endwhile
  100912. if (i > len)
  100913. return "";
  100914. elseif ((ch = string[i]) in {"(", ")", "!", "?"})
  100915. this.input_index = (i + 1);
  100916. return ch;
  100917. elseif (ch in {"&", "|"})
  100918. this.input_index = (i = (i + 1));
  100919. if ((i <= len) && (string[i] == ch))
  100920. this.input_index = (i + 1);
  100921. endif
  100922. return ch + ch;
  100923. else
  100924. start = i;
  100925. while ((i <= len) && (!((ch = string[i]) in {"(", ")", "!", "?", "&", "|"})))
  100926. i = (i + 1);
  100927. endwhile
  100928. this.input_index = i;
  100929. i = (i - 1);
  100930. while (string[i] == " ")
  100931. i = (i - 1);
  100932. endwhile
  100933. return this:canonicalize_spaces(string[start..i]);
  100934. endif
  100935. .
  100936. #54:2
  100937. name = args[1];
  100938. while (index(name, "  "))
  100939. name = strsub(name, "  ", " ");
  100940. endwhile
  100941. return name;
  100942. .
  100943. #54:3
  100944. this:init_scanner(args[1]);
  100945. this.player = args[2];
  100946. return this:parse_E();
  100947. "";
  100948. "Grammar for key expressions:";
  100949. "";
  100950. "    E ::= A       ";
  100951. "       |  E || A  ";
  100952. "       |  E && A  ";
  100953. "    A ::= ( E )   ";
  100954. "       |  ! A     ";
  100955. "       |  object  ";
  100956. "       |  ? object  ";
  100957. .
  100958. #54:4
  100959. exp = this:parse_A();
  100960. if (typeof(exp) != STR)
  100961. while ((token = this:scan_token()) in {"&&", "||"})
  100962. rhs = this:parse_A();
  100963. if (typeof(rhs) == STR)
  100964. return STR;
  100965. endif
  100966. exp = {token, exp, rhs};
  100967. endwhile
  100968. endif
  100969. return exp;
  100970. .
  100971. #54:5
  100972. token = this:scan_token();
  100973. if (token == "(")
  100974. exp = this:parse_E();
  100975. if ((typeof(exp) != STR) && (this:scan_token() != ")"))
  100976. return "Missing ')'";
  100977. else
  100978. return exp;
  100979. endif
  100980. elseif (token == "!")
  100981. exp = this:parse_A();
  100982. if (typeof(exp) == STR)
  100983. return exp;
  100984. else
  100985. return {"!", exp};
  100986. endif
  100987. elseif (token == "?")
  100988. next = this:scan_token();
  100989. if (next in {"(", ")", "!", "&&", "||", "?"})
  100990. return ("Missing object-name before '" + token) + "'";
  100991. elseif (next == "")
  100992. return "Missing object-name at end of key expression";
  100993. else
  100994. what = this:match_object(next);
  100995. if (typeof(what) == OBJ)
  100996. return {"?", this:match_object(next)};
  100997. else
  100998. return what;
  100999. endif
  101000. endif
  101001. elseif (token in {"&&", "||"})
  101002. return ("Missing expression before '" + token) + "'";
  101003. elseif (token == "")
  101004. return "Missing expression at end of key expression";
  101005. else
  101006. return this:match_object(token);
  101007. endif
  101008. .
  101009. #54:6
  101010. key = args[1];
  101011. who = args[2];
  101012. type = typeof(key);
  101013. if (!(type in {LIST, OBJ}))
  101014. return 1;
  101015. elseif (typeof(key) == OBJ)
  101016. return (who == key) || $object_utils:contains(who, key);
  101017. endif
  101018. op = key[1];
  101019. if (op == "!")
  101020. return !this:eval_key(key[2], who);
  101021. elseif (op == "?")
  101022. return key[2]:is_unlocked_for(who);
  101023. elseif (op == "&&")
  101024. return this:eval_key(key[2], who) && this:eval_key(key[3], who);
  101025. elseif (op == "||")
  101026. return this:eval_key(key[2], who) || this:eval_key(key[3], who);
  101027. else
  101028. return 1 / 0;
  101029. endif
  101030. .
  101031. #54:7
  101032. token = args[1];
  101033. if (token == "me")
  101034. return this.player;
  101035. elseif (token == "here")
  101036. if (valid(this.player.location))
  101037. return this.player.location;
  101038. else
  101039. return ("'here' has no meaning where " + this.player.name) + " is";
  101040. endif
  101041. else
  101042. what = this.player.location:match_object(token);
  101043. if (what == $failed_match)
  101044. return ("Can't find an object named '" + token) + "'";
  101045. elseif (what == $ambiguous_match)
  101046. return ("Multiple objects named '" + token) + "'";
  101047. else
  101048. return what;
  101049. endif
  101050. endif
  101051. .
  101052. #54:8
  101053. key = args[1];
  101054. type = typeof(key);
  101055. if (!(type in {LIST, OBJ}))
  101056. return "(None.)";
  101057. elseif (type == OBJ)
  101058. if (valid(key))
  101059. return tostr(key, "[", key.name, "]");
  101060. else
  101061. return tostr(key);
  101062. endif
  101063. else
  101064. op = key[1];
  101065. arg1 = this:unparse_key(key[2]);
  101066. if (op == "?")
  101067. return "?" + arg1;
  101068. elseif (op == "!")
  101069. if (typeof(key[2]) == LIST)
  101070. return ("!(" + arg1) + ")";
  101071. else
  101072. return "!" + arg1;
  101073. endif
  101074. elseif (op in {"&&", "||"})
  101075. other = ((op == "&&") ? "||" | "&&");
  101076. lhs = arg1;
  101077. rhs = this:unparse_key(key[3]);
  101078. if ((typeof(key[2]) == OBJ) || (key[2][1] != other))
  101079. exp = lhs;
  101080. else
  101081. exp = (("(" + lhs) + ")");
  101082. endif
  101083. exp = (((exp + " ") + op) + " ");
  101084. if ((typeof(key[3]) == OBJ) || (key[3][1] != other))
  101085. exp = (exp + rhs);
  101086. else
  101087. exp = (((exp + "(") + rhs) + ")");
  101088. endif
  101089. return exp;
  101090. else
  101091. return 1 / 0;
  101092. endif
  101093. endif
  101094. .
  101095. #54:9
  101096. set_task_perms($no_one);
  101097. key = args[1];
  101098. who = args[2];
  101099. type = typeof(key);
  101100. if (!(type in {LIST, OBJ}))
  101101. return 1;
  101102. elseif (typeof(key) == OBJ)
  101103. return (who == key) || $object_utils:contains(who, key);
  101104. endif
  101105. op = key[1];
  101106. if (op == "!")
  101107. return !this:eval_key(key[2], who);
  101108. elseif (op == "?")
  101109. return key[2]:is_unlocked_for(who);
  101110. elseif (op == "&&")
  101111. return this:eval_key(key[2], who) && this:eval_key(key[3], who);
  101112. elseif (op == "||")
  101113. return this:eval_key(key[2], who) || this:eval_key(key[3], who);
  101114. elseif (op == ".")
  101115. if ($object_utils:has_property(who, key[2]) && who.(key[2]))
  101116. return 1;
  101117. else
  101118. for thing in ($object_utils:all_contents(who))
  101119. if ($object_utils:has_property(thing, key[2]) && thing.(key[2]))
  101120. return 1;
  101121. endif
  101122. endfor
  101123. endif
  101124. return 0;
  101125. elseif (op == ":")
  101126. if ($object_utils:has_verb(who, key[2]) && who:(key[2])())
  101127. return 1;
  101128. else
  101129. for thing in ($object_utils:all_contents(who))
  101130. if ($object_utils:has_verb(thing, key[2]) && thing:(key[2])())
  101131. return 1;
  101132. endif
  101133. endfor
  101134. endif
  101135. return 0;
  101136. else
  101137. return 1 / 0;
  101138. endif
  101139. .
  101140. #54:10
  101141. token = this:scan_token();
  101142. if (token == "(")
  101143. exp = this:parse_E();
  101144. if ((typeof(exp) != STR) && (this:scan_token() != ")"))
  101145. return "Missing ')'";
  101146. else
  101147. return exp;
  101148. endif
  101149. elseif (token == "!")
  101150. exp = this:parse_A();
  101151. if (typeof(exp) == STR)
  101152. return exp;
  101153. else
  101154. return {"!", exp};
  101155. endif
  101156. elseif (token == "?")
  101157. next = this:scan_token();
  101158. if (next in {":", ".", "(", ")", "!", "&&", "||", "?"})
  101159. return ("Missing object-name before '" + token) + "'";
  101160. elseif (next == "")
  101161. return "Missing object-name at end of key expression";
  101162. else
  101163. what = this:match_object(next);
  101164. if (typeof(what) == OBJ)
  101165. return {"?", this:match_object(next)};
  101166. else
  101167. return what;
  101168. endif
  101169. endif
  101170. elseif (token in {":", "."})
  101171. next = this:scan_token();
  101172. if (next in {":", ".", "(", ")", "!", "&&", "||", "?"})
  101173. return ("Missing verb-or-property-name before '" + token) + "'";
  101174. elseif (next == "")
  101175. return "Missing verb-or-property-name at end of key expression";
  101176. elseif (typeof(next) != STR)
  101177. return "Non-string verb-or-property-name at end of key expression";
  101178. else
  101179. return {token, next};
  101180. endif
  101181. elseif (token in {"&&", "||"})
  101182. return ("Missing expression before '" + token) + "'";
  101183. elseif (token == "")
  101184. return "Missing expression at end of key expression";
  101185. else
  101186. return this:match_object(token);
  101187. endif
  101188. .
  101189. #55:0
  101190. result = this:do_burn();
  101191. player:tell(result ? this:burn_succeeded_msg() | this:burn_failed_msg());
  101192. if (msg = (result ? this:oburn_succeeded_msg() | this:oburn_failed_msg()))
  101193. player.location:announce(player.name, " ", msg);
  101194. endif
  101195. .
  101196. #55:1
  101197. return (msg = this.(verb)) ? $string_utils:pronoun_sub(msg) | "";
  101198. .
  101199. #55:2
  101200. c = callers();
  101201. while (c && c[1][3].wizard)
  101202. c = listdelete(c, 1);
  101203. endwhile
  101204. if (c)
  101205. who = c[1][3];
  101206. else
  101207. who = player;
  101208. endif
  101209. if ((this != $letter) && ($perm_utils:controls(who, this) || this:is_readable_by(who)))
  101210. fork (0)
  101211. $recycler:_recycle(this);
  101212. endfork
  101213. return 1;
  101214. else
  101215. return E_PERM;
  101216. endif
  101217. .
  101218. #56:0
  101219. ":make(n[,elt]) => a list of n elements, each of which == elt. elt defaults to 0.";
  101220. if ((n = args[1]) < 0)
  101221. return E_INVARG;
  101222. endif
  101223. ret = {};
  101224. build = {elt = {@args, 0}[2]};
  101225. while (1)
  101226. if (n % 2)
  101227. ret = {@ret, @build};
  101228. endif
  101229. if (n = (n / 2))
  101230. build = {@build, @build};
  101231. else
  101232. return ret;
  101233. endif
  101234. endwhile
  101235. .
  101236. #56:1
  101237. ":range([m,]n) => {m,m+1,...,n}";
  101238. if (listdelete(args, 1))
  101239. else
  101240. args = {1, @args};
  101241. endif
  101242. ret = {};
  101243. for k in [args[1]..args[2]]
  101244. ret = {@ret, k};
  101245. endfor
  101246. return ret;
  101247. .
  101248. #56:2
  101249. set_task_perms(caller_perms());
  101250. prop = args[2];
  101251. if ((len = length(objs = args[1])) > 50)
  101252. return {@this:map_prop(objs[1..len / 2], prop), @this:map_prop(objs[(len / 2) + 1..len], prop)};
  101253. endif
  101254. strs = {};
  101255. for foo in (objs)
  101256. strs = {@strs, foo.(prop)};
  101257. endfor
  101258. return strs;
  101259. .
  101260. #56:3
  101261. set_task_perms(caller_perms());
  101262. if ((len = length(objs = args[1])) > 50)
  101263. return {@this:map_verb(@listset(args, objs[1..len / 2], 1)), @this:map_verb(@listset(args, objs[(len / 2) + 1..len], 1))};
  101264. endif
  101265. vrb = args[2];
  101266. rest = args[3..length(args)];
  101267. strs = {};
  101268. for o in (objs)
  101269. strs = {@strs, o:(vrb)(@rest)};
  101270. endfor
  101271. return strs;
  101272. .
  101273. #56:4
  101274. "map_arg([n,]object,verb,@args) -- assumes the nth element of args is a list, calls object:verb(@args) with each element of the list substituted in turn, returns the list of results.  n defaults to 1.";
  101275. "map_verb_arg(o,v,{a...},a2,a3,a4,a5)={o:v(a,a2,a3,a4,a5),...}";
  101276. "map_verb_arg(4,o,v,a1,a2,a3,{a...},a5)={o:v(a1,a2,a3,a,a5),...}";
  101277. set_task_perms(caller_perms());
  101278. if (n = args[1])
  101279. object = args[2];
  101280. verb = args[3];
  101281. rest = args[4..length(args)];
  101282. else
  101283. object = n;
  101284. n = 1;
  101285. verb = args[2];
  101286. rest = args[3..length(args)];
  101287. endif
  101288. results = {};
  101289. for a in (rest[n])
  101290. results = listappend(results, object:(verb)(@listset(rest, a, n)));
  101291. endfor
  101292. return results;
  101293. .
  101294. #56:5
  101295. ":map_builtin(objectlist,func) applies func to each of the objects in turn and returns the corresponding list of results.  This function is mainly here for completeness -- in the vast majority of situations, a simple for loop is better.";
  101296. set_task_perms(caller_perms());
  101297. if (!((builtin = args[2]) in {"tostr", "tonum", "toobj", "typeof", "length", "random", "ctime", "valid", "parent", "children", "properties", "verbs", "is_player", "idle_seconds", "connected_seconds"}))
  101298. return E_INVARG;
  101299. endif
  101300. objs = args[1];
  101301. if (length(objs) > 100)
  101302. return {@this:map_builtin(objs[1..l = (length(objs) / 2)], builtin), @this:map_builtin(objs[l + 1..length(objs)], builtin)};
  101303. endif
  101304. strs = {};
  101305. for foo in (objs)
  101306. strs = {@strs, eval(tostr("return ", builtin, "(", $string_utils:from_value(foo, 1, -1), ");"))[2]};
  101307. endfor
  101308. return strs;
  101309. .
  101310. #56:6
  101311. "find_insert(sortedlist,key) => index of first element in sortedlist > key";
  101312. "  sortedlist is assumed to be sorted in increasing order and the number returned is anywhere from 1 to length(sortedlist)+1, inclusive.";
  101313. lst = args[1];
  101314. key = args[2];
  101315. if ((r = length(lst)) < 25)
  101316. for l in [1..r]
  101317. if (lst[l] > key)
  101318. return l;
  101319. endif
  101320. endfor
  101321. return r + 1;
  101322. else
  101323. l = 1;
  101324. while (r >= l)
  101325. if (key < lst[i = ((r + l) / 2)])
  101326. r = (i - 1);
  101327. else
  101328. l = (i + 1);
  101329. endif
  101330. endwhile
  101331. return l;
  101332. endif
  101333. .
  101334. #56:7
  101335. "remove_duplicates(list) => list as a set, i.e., all repeated elements removed.";
  101336. out = {};
  101337. for x in (args[1])
  101338. out = setadd(out, x);
  101339. endfor
  101340. return out;
  101341. .
  101342. #56:8
  101343. "arrayset(list,value,pos1,...,posn) -- returns list modified such that";
  101344. "  list[pos1][pos2][...][posn] == value";
  101345. if (length(args) > 3)
  101346. return listset(@listset(args[1..3], this:arrayset(@listset(listdelete(args, 3), args[1][args[3]], 1)), 2));
  101347. "... Rog's entry in the Obfuscated MOO-Code Contest...";
  101348. else
  101349. return listset(@args);
  101350. endif
  101351. .
  101352. #56:9
  101353. ":setremove_all(set,elt) => set with *all* occurences of elt removed";
  101354. set = args[1];
  101355. what = args[2];
  101356. while (w = (what in set))
  101357. set = listdelete(set, w);
  101358. endwhile
  101359. return set;
  101360. .
  101361. #56:10
  101362. "append({a,b,c},{d,e},{},{f,g,h},...) =>  {a,b,c,d,e,f,g,h}";
  101363. if ((n = length(args)) > 50)
  101364. return {@this:append(@args[1..n / 2]), @this:append(@args[(n / 2) + 1..n])};
  101365. endif
  101366. l = {};
  101367. for a in (args)
  101368. l = {@l, @a};
  101369. endfor
  101370. return l;
  101371. .
  101372. #56:11
  101373. "reverse(list) => reversed list";
  101374. return this:_reverse(@args[1]);
  101375. .
  101376. #56:12
  101377. ":_reverse(@list) => reversed list";
  101378. if ((n = length(args)) > 50)
  101379. return {@this:_reverse(@args[(n / 2) + 1..n]), @this:_reverse(@args[1..n / 2])};
  101380. endif
  101381. l = {};
  101382. for a in (args)
  101383. l = listinsert(l, a);
  101384. endfor
  101385. return l;
  101386. .
  101387. #56:13
  101388. "compress(list) => list with consecutive repeated elements removed, e.g.,";
  101389. "compress({a,b,b,c,b,b,b,d,d,e}) => {a,b,c,b,d,e}";
  101390. if (l = args[1])
  101391. out = {last = l[1]};
  101392. for x in (listdelete(l, 1))
  101393. if (x != last)
  101394. out = listappend(out, x);
  101395. last = x;
  101396. endif
  101397. endfor
  101398. return out;
  101399. else
  101400. return l;
  101401. endif
  101402. .
  101403. #56:14
  101404. "sort(list[,keys]) => sorts keys (assumed to be all numbers or strings) and returns list with the corresponding permutation applied to it.  keys defaults to the list itself.";
  101405. "sort({x1,x3,x2},{1,3,2}) => {x1,x2,x3}";
  101406. lst = args[1];
  101407. unsorted_keys = ((use_sorted_lst = (length(args) >= 2)) ? args[2] | lst);
  101408. sorted_lst = (sorted_keys = {});
  101409. for e in (unsorted_keys)
  101410. l = this:find_insert(sorted_keys, e);
  101411. sorted_keys = listinsert(sorted_keys, e, l);
  101412. if (use_sorted_lst)
  101413. sorted_lst = listinsert(sorted_lst, lst[length(sorted_keys)], l);
  101414. endif
  101415. endfor
  101416. return sorted_lst || sorted_keys;
  101417. .
  101418. #56:15
  101419. ":sort_suspended(interval,list[,keys]) => sorts keys (assumed to be all numbers or strings) and returns list with the corresponding permutation applied to it.  keys defaults to the list itself.";
  101420. "does suspend(interval) as needed.";
  101421. set_task_perms(caller_perms());
  101422. interval = args[1];
  101423. if (typeof(interval) != NUM)
  101424. return E_ARGS;
  101425. endif
  101426. lst = args[2];
  101427. unsorted_keys = ((use_sorted_lst = (length(args) >= 3)) ? args[3] | lst);
  101428. sorted_lst = (sorted_keys = {});
  101429. for e in (unsorted_keys)
  101430. l = this:find_insert(sorted_keys, e);
  101431. sorted_keys[l..l - 1] = {e};
  101432. if (use_sorted_lst)
  101433. sorted_lst[l..l - 1] = {lst[length(sorted_keys)]};
  101434. endif
  101435. $command_utils:suspend_if_needed(interval);
  101436. endfor
  101437. return sorted_lst || sorted_keys;
  101438. .
  101439. #56:16
  101440. "slice(alist[,index]) returns a list of the index-th elements of the elements of alist, e.g., ";
  101441. "    slice({{\"z\",1},{\"y\",2},{\"x\",5}},2) => {1,2,5}.";
  101442. "index defaults to 1 and may also be a nonempty list, e.g., ";
  101443. "    slice({{\"z\",1,3},{\"y\",2,4}},{2,1}) => {{1,\"z\"},{2,\"y\"}}";
  101444. slice = {};
  101445. ind = {@args, 1}[2];
  101446. if (typeof(ind) == LIST)
  101447. for elt in (args[1])
  101448. s = {elt[ind[1]]};
  101449. for i in (listdelete(ind, 1))
  101450. s = {@s, elt[i]};
  101451. endfor
  101452. slice = {@slice, s};
  101453. endfor
  101454. else
  101455. for elt in (args[1])
  101456. slice = {@slice, elt[ind]};
  101457. endfor
  101458. endif
  101459. return slice;
  101460. .
  101461. #56:17
  101462. "assoc(target,list[,index]) returns the first element of `list' whose own index-th element is target.  Index defaults to 1.";
  101463. "returns {} if no such element is found";
  101464. target = args[1];
  101465. indx = {@args, 1}[3];
  101466. for t in (args[2])
  101467. if (t[indx] == target)
  101468. "... do this test first since it's the most likely to fail; this needs -d";
  101469. if ((typeof(t) == LIST) && (length(t) >= indx))
  101470. return t;
  101471. endif
  101472. endif
  101473. endfor
  101474. return {};
  101475. .
  101476. #56:18
  101477. "iassoc(target,list[,index]) returns the index of the first element of `list' whose own index-th element is target.  Index defaults to 1.";
  101478. "returns 0 if no such element is found.";
  101479. target = args[1];
  101480. indx = {@args, 1}[3];
  101481. i = 1;
  101482. for lsti in (args[2])
  101483. if (lsti[indx] == target)
  101484. "... do this test first since it's the most likely to fail; this needs -d";
  101485. if ((typeof(lsti) == LIST) && (length(lsti) >= indx))
  101486. return i;
  101487. endif
  101488. endif
  101489. i = (i + 1);
  101490. endfor
  101491. return 0;
  101492. .
  101493. #56:19
  101494. "iassoc(target,list[,index]) returns the index of the first element of `list' whose own index-th element is target.  Index defaults to 1.";
  101495. "returns 0 if no such element is found.";
  101496. "suspends as needed.";
  101497. set_task_perms(caller_perms());
  101498. target = args[1];
  101499. indx = {@args, 1}[3];
  101500. i = 1;
  101501. for lsti in (args[2])
  101502. if (lsti[indx] == target)
  101503. "... do this test first since it's the most likely to fail; this needs -d";
  101504. if ((typeof(lsti) == LIST) && (length(lsti) >= indx))
  101505. return i;
  101506. endif
  101507. endif
  101508. i = (i + 1);
  101509. $command_utils:suspend_if_needed(1);
  101510. endfor
  101511. return 0;
  101512. .
  101513. #56:20
  101514. "assoc_prefix(target,list[,index]) returns the first element of `list' whose own index-th element has target as a prefix.  Index defaults to 1.";
  101515. target = args[1];
  101516. indx = ((length(args) >= 3) ? args[3] | 1);
  101517. for t in (args[2])
  101518. if ((typeof(t) == LIST) && ((length(t) >= indx) && (index(t[indx], target) == 1)))
  101519. return t;
  101520. endif
  101521. endfor
  101522. return {};
  101523. .
  101524. #56:21
  101525. "iassoc_prefix(target,list[,index]) returns the index of the first element of `list' whose own index-th element has target as a prefix.  Index defaults to 1.";
  101526. target = args[1];
  101527. indx = ((length(args) >= 3) ? args[3] | 1);
  101528. for i in [1..length(lst = args[2])]
  101529. if ((typeof(lsti = lst[i]) == LIST) && ((length(lsti) >= indx) && (index(lsti[indx], target) == 1)))
  101530. return i;
  101531. endif
  101532. endfor
  101533. return 0;
  101534. .
  101535. #56:22
  101536. "iassoc_sorted(target,sortedlist[,i]) => index of last element in sortedlist whose own i-th element is <= target.  i defaults to 1.";
  101537. "  sortedlist is assumed to be sorted in increasing order and the number returned is anywhere from 0 to length(sortedlist), inclusive.";
  101538. target = args[1];
  101539. indx = {@args, 1}[3];
  101540. if ((r = length(lst = args[2])) < 25)
  101541. for l in [1..r]
  101542. if (target < lst[l][indx])
  101543. return l - 1;
  101544. endif
  101545. endfor
  101546. return r;
  101547. else
  101548. l = 0;
  101549. r = (r + 1);
  101550. while ((r - 1) > l)
  101551. if (target < lst[i = ((r + l) / 2)][indx])
  101552. r = i;
  101553. else
  101554. l = i;
  101555. endif
  101556. endwhile
  101557. return l;
  101558. endif
  101559. .
  101560. #56:23
  101561. ":sort_alist(alist[,n]) sorts a list of tuples by n-th (1st) element.";
  101562. if ((alist_length = length(alist = args[1])) < 25)
  101563. "use insertion sort on short lists";
  101564. return this:sort(alist, this:slice(@args));
  101565. endif
  101566. sort_on = {@args, 1}[2];
  101567. left_index = (alist_length / 2);
  101568. right_index = ((alist_length + 1) / 2);
  101569. left_sublist = this:sort_alist(alist[1..left_index], sort_on);
  101570. right_sublist = this:sort_alist(alist[left_index + 1..alist_length], sort_on);
  101571. "...";
  101572. "... merge ...";
  101573. "...";
  101574. left_key = left_sublist[left_index][sort_on];
  101575. right_key = right_sublist[right_index][sort_on];
  101576. if (left_key > right_key)
  101577. merged_list = {};
  101578. else
  101579. "... alist_length >= 25 implies right_index >= 2...";
  101580. "... move right_index downward until left_key > right_key...";
  101581. r = (right_index - 1);
  101582. while (left_key <= (right_key = right_sublist[r][sort_on]))
  101583. if (r = (r - 1))
  101584. else
  101585. return {@left_sublist, @right_sublist};
  101586. endif
  101587. endwhile
  101588. merged_list = right_sublist[r + 1..right_index];
  101589. right_index = r;
  101590. endif
  101591. while (l = (left_index - 1))
  101592. "... left_key > right_key ...";
  101593. "... move left_index downward until left_key <= right_key...";
  101594. while ((left_key = left_sublist[l][sort_on]) > right_key)
  101595. if (l = (l - 1))
  101596. else
  101597. return {@right_sublist[1..right_index], @left_sublist[1..left_index], @merged_list};
  101598. endif
  101599. endwhile
  101600. merged_list[1..0] = left_sublist[l + 1..left_index];
  101601. left_index = l;
  101602. "... left_key <= right_key ...";
  101603. if (r = (right_index - 1))
  101604. "... move right_index downward until left_key > right_key...";
  101605. while (left_key <= (right_key = right_sublist[r][sort_on]))
  101606. if (r = (r - 1))
  101607. else
  101608. return {@left_sublist[1..left_index], @right_sublist[1..right_index], @merged_list};
  101609. endif
  101610. endwhile
  101611. merged_list[1..0] = right_sublist[r + 1..right_index];
  101612. right_index = r;
  101613. else
  101614. return {@left_sublist[1..left_index], right_sublist[1], @merged_list};
  101615. endif
  101616. endwhile
  101617. return {@right_sublist[1..right_index], left_sublist[1], @merged_list};
  101618. .
  101619. #56:24
  101620. "sort_alist_suspended(interval,alist[,n]) sorts a list of tuples by n-th element.  n defaults to 1.  Calls suspend(interval) as necessary.";
  101621. set_task_perms(caller_perms());
  101622. "... so it can be killed...";
  101623. interval = args[1];
  101624. if ((alist_length = length(alist = args[2])) < 10)
  101625. "insertion sort on short lists";
  101626. $command_utils:suspend_if_needed(interval);
  101627. return this:sort(alist, this:slice(@listdelete(args, 1)));
  101628. endif
  101629. "variables specially expanded for the anal-retentive";
  101630. sort_on = {@args, 1}[3];
  101631. left_index = (alist_length / 2);
  101632. right_index = ((alist_length + 1) / 2);
  101633. left_sublist = this:sort_alist_suspended(interval, alist[1..left_index], sort_on);
  101634. right_sublist = this:sort_alist_suspended(interval, alist[left_index + 1..alist_length], sort_on);
  101635. left_element = left_sublist[left_index];
  101636. right_element = right_sublist[right_index];
  101637. merged_list = {};
  101638. while (1)
  101639. $command_utils:suspend_if_needed(interval);
  101640. if (left_element[sort_on] > right_element[sort_on])
  101641. merged_list = {left_element, @merged_list};
  101642. if (left_index = (left_index - 1))
  101643. left_element = left_sublist[left_index];
  101644. else
  101645. return {@right_sublist[1..right_index], @merged_list};
  101646. endif
  101647. else
  101648. merged_list = {right_element, @merged_list};
  101649. if (right_index = (right_index - 1))
  101650. right_element = right_sublist[right_index];
  101651. else
  101652. return {@left_sublist[1..left_index], @merged_list};
  101653. endif
  101654. endif
  101655. endwhile
  101656. .
  101657. #56:25
  101658. ":randomly_permute(list) => list with its elements randomly permuted";
  101659. "  each of the length(list)! possible permutations is equally likely";
  101660. plist = {};
  101661. for i in [1..length(ulist = args[1])]
  101662. plist = listinsert(plist, ulist[i], random(i));
  101663. endfor
  101664. return plist;
  101665. .
  101666. #56:26
  101667. "$list_utils:count(item, list)";
  101668. "Returns the number of occurrences of item in list.";
  101669. if (length(args) != 2)
  101670. return E_ARGS;
  101671. elseif (typeof(xlist = args[2]) != LIST)
  101672. return E_INVARG;
  101673. endif
  101674. x = args[1];
  101675. counter = 0;
  101676. for elt in (xlist)
  101677. if (x == elt)
  101678. counter = (counter + 1);
  101679. endif
  101680. endfor
  101681. return counter;
  101682. .
  101683. #56:27
  101684. "Copied from $quinn_utils (#34283):unroll by Quinn (#19845) Mon Mar  8 09:29:03 1993 PST";
  101685. ":flatten(LIST list_of_lists) => LIST of all lists in given list `flattened'";
  101686. newlist = {};
  101687. for elm in (args[1])
  101688. if (typeof(elm) == LIST)
  101689. newlist = {@newlist, @this:flatten(elm)};
  101690. else
  101691. newlist = {@newlist, elm};
  101692. endif
  101693. endfor
  101694. return newlist;
  101695. .
  101696. #56:28
  101697. "Copied from APHiD (#33119):longest Sun May  9 21:00:18 1993 PDT";
  101698. "$list_utils:longest(<list>)";
  101699. "$list_utils:shortest(<list>)";
  101700. "             - Returns the shortest or longest element in the list.  Elements may be either strings or lists.";
  101701. if (typeof(all = args[1]) != LIST)
  101702. return E_TYPE;
  101703. else
  101704. result = all[1];
  101705. for things in (all)
  101706. if ((typeof(things) != LIST) && (typeof(things) != STR))
  101707. return E_TYPE;
  101708. else
  101709. result = ((((verb == "longest") && (length(result) < length(things))) || ((verb == "shortest") && (length(result) > length(things)))) ? things | result);
  101710. endif
  101711. endfor
  101712. endif
  101713. return result;
  101714. .
  101715. #56:29
  101716. "check_nonstring_tell_lines(lines)";
  101717. if (caller_perms().wizard)
  101718. "don't let a nonwizard mess up our stats";
  101719. for line in (args[1])
  101720. if (typeof(line) != STR)
  101721. this.nonstring_tell_lines = listappend(this.nonstring_tell_lines, callers());
  101722. return;
  101723. endif
  101724. endfor
  101725. endif
  101726. .
  101727. #57:0
  101728. "Usage: object_match_failed(object, string)";
  101729. "Prints a message if string does not match object.  Generally used after object is derived from a :match_object(string).";
  101730. match_result = args[1];
  101731. string = args[2];
  101732. tell = ($perm_utils:controls(caller_perms(), player) ? "notify" | "tell");
  101733. if ((index(string, "#") == 1) && ($code_utils:toobj(string) != E_TYPE))
  101734. "...avoid the `I don't know which `#-2' you mean' message...";
  101735. if (!valid(match_result))
  101736. player:(tell)(tostr(string, " does not exist."));
  101737. endif
  101738. return !valid(match_result);
  101739. elseif (match_result == $nothing)
  101740. player:(tell)("You must give the name of some object.");
  101741. elseif (match_result == $failed_match)
  101742. player:(tell)(tostr("I see no \"", string, "\" here."));
  101743. elseif (match_result == $ambiguous_match)
  101744. player:(tell)(tostr("I don't know which \"", string, "\" you mean."));
  101745. elseif (!valid(match_result))
  101746. player:(tell)(tostr(match_result, " does not exist."));
  101747. else
  101748. return 0;
  101749. endif
  101750. return 1;
  101751. .
  101752. #57:1
  101753. ":player_match_failed(result,string)";
  101754. "  is exactly like :object_match_failed(result,string)";
  101755. "  except that its messages are more suitable for player searches.";
  101756. ":player_match_result(results,strings)";
  101757. "  handles a list of results, also presumably from $string_utils:match_player(strings), printing messages to player for *each* of the nonmatching strings.  It returns a list, an overall result (true if some string didn't match --- just like player_match_failed), followed by the list players that matched.";
  101758. "";
  101759. "An optional 3rd arg gives an identifying string to prefix to each of the nasty messages.";
  101760. if (valid(player))
  101761. tell = ($perm_utils:controls(caller_perms(), player) ? "notify" | "tell");
  101762. plyr = player;
  101763. else
  101764. tell = "notify";
  101765. plyr = $login;
  101766. endif
  101767. "...";
  101768. match_results = args[1];
  101769. strings = args[2];
  101770. cmdid = ({@args, ""}[3] || "");
  101771. pmf = (verb == "player_match_failed");
  101772. if (typeof(match_results) == OBJ)
  101773. match_results = {match_results};
  101774. strings = {strings};
  101775. endif
  101776. pset = {};
  101777. bombed = 0;
  101778. for i in [1..length(match_results)]
  101779. if (valid(result = match_results[i]))
  101780. pset = setadd(pset, match_results[i]);
  101781. elseif (result == $nothing)
  101782. "... player_match_result quietly skips over blank strings";
  101783. if (pmf)
  101784. plyr:(tell)("You must give the name of some player.");
  101785. bombed = 1;
  101786. endif
  101787. elseif (result == $failed_match)
  101788. plyr:(tell)(tostr(cmdid, "\"", strings[i], "\" is not the name of any player."));
  101789. bombed = 1;
  101790. elseif (result == $ambiguous_match)
  101791. lst = $player_db:find_all(strings[i]);
  101792. plyr:(tell)(tostr(cmdid, "\"", strings[i], "\" could refer to ", (length(lst) > 20) ? tostr("any of ", length(lst), " players") | $string_utils:english_list($list_utils:map_arg(2, $string_utils, "pronoun_sub", "%n (%#)", lst), "no one", " or "), "."));
  101793. bombed = 1;
  101794. else
  101795. plyr:(tell)(tostr(result, " does not exist."));
  101796. bombed = 1;
  101797. endif
  101798. endfor
  101799. return pmf ? bombed | {bombed, @pset};
  101800. .
  101801. #57:2
  101802. "$command_utils:read() -- read a line of input from the player and return it";
  101803. "Optional argument is a prompt portion to replace `a line of input' in the prompt.";
  101804. "";
  101805. "Returns E_PERM if the current task is not a command task that has never called suspend().";
  101806. if (args && (typeof(args[1]) == STR))
  101807. prompt = args[1];
  101808. else
  101809. prompt = "a line of input";
  101810. endif
  101811. c = callers();
  101812. p = c[length(c)][5];
  101813. p:notify(tostr("[Type ", prompt, " or `@abort' to abort the command.]"));
  101814. ans = read();
  101815. if (typeof(ans) == ERR)
  101816. return ans;
  101817. elseif ($string_utils:trim(ans) == "@abort")
  101818. p:notify(">> Command Aborted <<");
  101819. kill_task(task_id());
  101820. else
  101821. return ans;
  101822. endif
  101823. .
  101824. #57:3
  101825. "$command_utils:read_lines() -- read zero or more lines of input";
  101826. "";
  101827. "Returns a list of strings, the lines typed by the player.  Returns E_PERM if the current task is not a command task that has never called suspend().";
  101828. "In order that one may enter arbitrary lines, including \"@abort\" or \".\", if the first character in an input line is `.' and there is some nonwhitespace afterwords, the `.' is dropped and the rest of the line is taken verbatim, so that, e.g., \".@abort\" enters as \"@abort\" and \"..\" enters as \".\".";
  101829. c = callers();
  101830. p = c[length(c)][5];
  101831. p:notify("[Type lines of input; use `.' to end or `@abort' to abort the command.]");
  101832. ans = {};
  101833. while (1)
  101834. if (typeof(line = read()) == ERR)
  101835. return line;
  101836. elseif ((line[1..min(6, length(line))] == "@abort") && ((tail = line[7..length(line)]) == $string_utils:space(tail)))
  101837. p:notify(">> Command Aborted <<");
  101838. kill_task(task_id());
  101839. elseif ((!line) || (line[1] != "."))
  101840. ans = {@ans, line};
  101841. elseif ((tail = line[2..length(line)]) == $string_utils:space(tail))
  101842. return ans;
  101843. else
  101844. ans = {@ans, tail};
  101845. endif
  101846. endwhile
  101847. .
  101848. #57:4
  101849. ":yes-or-no([prompt]) -- prompts the player for a yes or no answer and returns a true value iff the player enters a line of input that is some prefix of \"yes\"";
  101850. "";
  101851. "Returns E_NONE if the player enters a blank line, E_INVARG, if the player enters something that isn't a prefix of \"yes\" or \"no\", and E_PERM if the current task is not a command task that has never called suspend().";
  101852. c = callers();
  101853. p = c[length(c)][5];
  101854. p:notify(tostr(args ? args[1] + " " | "", "[Enter `yes' or `no']"));
  101855. ans = read(@((caller == p) || $perm_utils:controls(caller_perms(), p)) ? {p} | {});
  101856. if (typeof(ans) == ERR)
  101857. return ans;
  101858. elseif (ans = $string_utils:trim(ans))
  101859. if (ans == "@abort")
  101860. p:notify(">> Command Aborted <<");
  101861. kill_task(task_id());
  101862. endif
  101863. return (index("yes", ans) == 1) || ((index("no", ans) != 1) && E_INVARG);
  101864. else
  101865. return E_NONE;
  101866. endif
  101867. .
  101868. #57:5
  101869. "$command_utils:read_lines_escape(escapes[,help]) -- read zero or more lines of input";
  101870. "";
  101871. "Similar to :read_lines() except that help is available and one may specify other escape sequences to terminate the read.";
  101872. "  escapes should be either a string or list of strings; this specifies which inputs other from `.' or `@abort' should terminate the read (... don't use anything beginning with a `.').";
  101873. "  help should be a string or list of strings to be printed in response to the player typing `?'; the first line of the help text should be a general comment about what the input text should be used for.  Successive lines should describe the effects of the alternative escapes.";
  101874. "Returns {end,list-of-strings-input} where end is the particular line that terminated this input or 0 if input terminated normally with `.'.  Returns E_PERM if the current task is not a command task that has never called suspend().  ";
  101875. "@abort and lines beginning with `.' are treated exactly as with :read_lines()";
  101876. c = callers();
  101877. p = c[length(c)][5];
  101878. escapes = {".", "@abort", @(typeof(args[1]) == LIST) ? args[1] | {args[1]}};
  101879. p:notify(tostr("[Type lines of input; `?' for help; end with `", $string_utils:english_list(escapes, "", "' or `", "', `", ""), "'.]"));
  101880. ans = {};
  101881. escapes[1..0] = {"?"};
  101882. "... set up the help text...";
  101883. help = {@args, "You are currently in a read loop."}[2];
  101884. if (typeof(help) != LIST)
  101885. help = {help};
  101886. endif
  101887. help[2..1] = {"Type `.' on a line by itself to finish.", "Anything else with a leading period is entered with the period removed.", "Type `@abort' to abort the command completely."};
  101888. while (typeof(line = read()) != ERR)
  101889. if ((trimline = $string_utils:trimr(line)) in escapes)
  101890. if (trimline == ".")
  101891. return {0, ans};
  101892. elseif (trimline == "@abort")
  101893. p:notify(">> Command Aborted <<");
  101894. kill_task(task_id());
  101895. elseif (trimline == "?")
  101896. p:notify_lines(help);
  101897. else
  101898. return {trimline, ans};
  101899. endif
  101900. else
  101901. if (line && (line[1] == "."))
  101902. line[1..1] = "";
  101903. endif
  101904. ans = {@ans, line};
  101905. endif
  101906. endwhile
  101907. return line;
  101908. .
  101909. #57:6
  101910. "Suspend, using output_delimiters() in case a client needs to keep track";
  101911. "of the output of the current command.";
  101912. "Args are TIME, amount of time to suspend, and optional (misnamed) OUTPUT.";
  101913. "If given no OUTPUT, just do a suspend.";
  101914. "If OUTPUT is neither list nor string, suspend and return output_delimiters";
  101915. "If OUTPUT is a list, it should be in the output_delimiters() format:";
  101916. "  {PREFIX, SUFFIX}.  Use these to handle that client stuff.";
  101917. "If OUTPUT is a string, it should be SUFFIX (output_delimiters[2])";
  101918. "";
  101919. "Proper usage:";
  101920. "The first time you want to suspend, use";
  101921. "  output_delimiters = $command_utils:suspend(time, x);";
  101922. "where x is some non-zero number.";
  101923. "Following, use";
  101924. "  $command_utils:suspend(time, output_delimiters);";
  101925. "To wrap things up, use";
  101926. "  $command_utils:suspend(time, output_delimiters[2]);";
  101927. "You'll probably want time == 0 most of the time.";
  101928. "Note: Using this from verbs called by other verbs could get pretty weird.";
  101929. set_task_perms(caller_perms());
  101930. time = args[1];
  101931. output = ((length(args) == 2) && args[2]);
  101932. if (!output)
  101933. suspend(time);
  101934. else
  101935. if (typeof(output) == LIST)
  101936. PREFIX = output[1];
  101937. SUFFIX = output[2];
  101938. if (PREFIX)
  101939. player:tell(output[2]);
  101940. endif
  101941. suspend(time);
  101942. if (SUFFIX)
  101943. player:tell(output[1]);
  101944. endif
  101945. elseif (typeof(output) == STR)
  101946. if (output)
  101947. player:tell(output);
  101948. endif
  101949. else
  101950. output = output_delimiters(player);
  101951. suspend(time);
  101952. if (output != {"", ""})
  101953. player:tell(output[1]);
  101954. endif
  101955. return output;
  101956. endif
  101957. endif
  101958. .
  101959. #57:7
  101960. "Return true if we're running out of ticks or seconds.";
  101961. return (seconds_left() < 2) || (ticks_left() < 4000);
  101962. .
  101963. #57:8
  101964. "Usage:  $command_utils:suspend_if_needed(<time>[, @<announcement>])";
  101965. "See if we're running out of ticks or seconds, and if so suspend(<time>) and return true.  If more than one arg is given, print the remainder with player:tell.";
  101966. if (this:running_out_of_time())
  101967. " && valid(player)) -- taking check out for now ";
  101968. if (ann = listdelete(args, 1))
  101969. player:tell(@ann);
  101970. endif
  101971. data = {task_id(), callers()};
  101972. this:suspend_database_add(data);
  101973. set_task_perms(caller_perms());
  101974. suspend(args[1]);
  101975. this:suspend_database_remove(data);
  101976. return 1;
  101977. endif
  101978. .
  101979. #57:9
  101980. ":dump_lines(text) => text `.'-quoted for :read_lines()";
  101981. "  text is assumed to be a list of strings";
  101982. "Returns a corresponding list of strings which, when read via :read_lines, ";
  101983. "produces the original list of strings (essentially, any strings beginning ";
  101984. "with a period \".\" have the period doubled).";
  101985. "The list returned includes a final \".\"";
  101986. text = args[1];
  101987. newtext = {};
  101988. i = (lasti = 0);
  101989. for line in (text)
  101990. if (line && (line[1] == "."))
  101991. newtext = {@newtext, @(i > lasti) ? text[lasti + 1..i] | {}, "." + line};
  101992. lasti = (i = (i + 1));
  101993. else
  101994. i = (i + 1);
  101995. endif
  101996. endfor
  101997. return {@newtext, @(i > lasti) ? text[lasti + 1..i] | {}, "."};
  101998. .
  101999. #57:10
  102000. ":explain_syntax(here,verb,args)";
  102001. verb = args[2];
  102002. for x in ({player, args[1], @valid(dobj) ? {dobj} | {}, @valid(iobj) ? {iobj} | {}})
  102003. what = x;
  102004. while (hv = $object_utils:has_verb(what, verb))
  102005. what = hv[1];
  102006. i = 0;
  102007. while (0 <= (i = $code_utils:find_verb_named(what, verb, i)))
  102008. if (evs = $code_utils:explain_verb_syntax(x, verb, @verb_args(what, tostr(i))))
  102009. player:tell("Try this instead:  ", evs);
  102010. return 1;
  102011. endif
  102012. i = (i + 1);
  102013. endwhile
  102014. what = parent(what);
  102015. endwhile
  102016. endfor
  102017. return 0;
  102018. .
  102019. #57:11
  102020. ":do_huh(verb,args)  what :huh should do by default.";
  102021. set_task_perms(cp = caller_perms());
  102022. verb = args[1];
  102023. args = args[2];
  102024. notify = ($perm_utils:controls(cp, player) ? "notify" | "tell");
  102025. if (player:my_huh(verb, args))
  102026. "... the player found something funky to do ...";
  102027. elseif (caller:here_huh(verb, args))
  102028. "... the room found something funky to do ...";
  102029. elseif (player:last_huh(verb, args))
  102030. "... player's second round found something to do ...";
  102031. elseif (dobj == $ambiguous_match)
  102032. if (iobj == $ambiguous_match)
  102033. player:(notify)(tostr("I don't understand that (\"", dobjstr, "\" and \"", iobjstr, "\" are both ambiguous names)."));
  102034. else
  102035. player:(notify)(tostr("I don't understand that (\"", dobjstr, "\" is an ambiguous name)."));
  102036. endif
  102037. elseif (iobj == $ambiguous_match)
  102038. player:(notify)(tostr("I don't understand that (\"", iobjstr, "\" is an ambiguous name)."));
  102039. else
  102040. player:(notify)(tostr("I don't understand \"", verb, " ", argstr, "\""));
  102041. player:my_explain_syntax(caller, verb, args) || (caller:here_explain_syntax(caller, verb, args) || this:explain_syntax(caller, verb, args));
  102042. endif
  102043. .
  102044. #57:12
  102045. if (caller == this)
  102046. this.suspend_database = setadd(this.suspend_database, args[1]);
  102047. endif
  102048. .
  102049. #57:13
  102050. if (caller == this)
  102051. this.suspend_database = setremove(this.suspend_database, args[1]);
  102052. endif
  102053. .
  102054. #57:14
  102055. if (caller_perms().wizard)
  102056. q = $list_utils:slice(queued_tasks(), 1);
  102057. newdb = {};
  102058. for x in (this.suspend_database)
  102059. if (x[1] in q)
  102060. newdb = {@newdb, x};
  102061. endif
  102062. endfor
  102063. this.suspend_database = newdb;
  102064. else
  102065. return E_PERM;
  102066. endif
  102067. .
  102068. #57:15
  102069. "task_info(task id)";
  102070. "Return info (the same info supplied by queued_tasks()) about a given task id, or E_INVARG if there's no such task queued.";
  102071. "WIZARDLY";
  102072. set_task_perms(caller_perms());
  102073. tasks = queued_tasks();
  102074. task_id = args[1];
  102075. for task in (tasks)
  102076. if (task[1] == task_id)
  102077. return task;
  102078. endif
  102079. endfor
  102080. return E_INVARG;
  102081. .
  102082. #57:16
  102083. this:suspend_database_cleanup();
  102084. who = caller_perms();
  102085. for x in (this.suspend_database)
  102086. if (who.wizard || (x[2][1][3] == who))
  102087. player:tell(x[1]);
  102088. for y in (x[2])
  102089. player:tell("   ", $string_utils:print(y));
  102090. endfor
  102091. endif
  102092. endfor
  102093. .
  102094. #58:0
  102095. if ((!player.wizard) || (player != this))
  102096. player:notify("Sorry.");
  102097. return;
  102098. endif
  102099. set_task_perms(player);
  102100. args = setremove(args, "to");
  102101. if ((length(args) != 2) || (!args[2]))
  102102. player:notify(tostr("Usage:  ", verb, " <object-or-property-or-verb> <owner>"));
  102103. return;
  102104. endif
  102105. what = args[1];
  102106. owner = $string_utils:match_player(args[2]);
  102107. if ($command_utils:player_match_result(owner, args[2])[1])
  102108. elseif (index(what, ".") && (spec = $code_utils:parse_propref(what)))
  102109. object = this:my_match_object(spec[1]);
  102110. if (!$command_utils:object_match_failed(object, spec[1]))
  102111. pname = spec[2];
  102112. e = $wiz_utils:set_property_owner(object, pname, owner);
  102113. if (e == E_NONE)
  102114. player:notify("+c Property owner set.  Did you really want to do that?");
  102115. else
  102116. player:notify(tostr(e && "Property owner set."));
  102117. endif
  102118. endif
  102119. elseif (spec = $code_utils:parse_verbref(what))
  102120. object = this:my_match_object(spec[1]);
  102121. if (!$command_utils:object_match_failed(object, spec[1]))
  102122. vname = spec[2];
  102123. info = verb_info(object, vname);
  102124. if (info == E_VERBNF)
  102125. player:notify("That object does not define that verb.");
  102126. elseif (typeof(info) == ERR)
  102127. player:notify(tostr(info));
  102128. else
  102129. result = set_verb_info(object, vname, listset(info, owner, 1));
  102130. if (typeof(result) == ERR)
  102131. player:notify(tostr(result));
  102132. else
  102133. player:notify("Verb owner set.");
  102134. endif
  102135. endif
  102136. endif
  102137. else
  102138. object = this:my_match_object(what);
  102139. if (!$command_utils:object_match_failed(object, what))
  102140. player:notify(tostr($wiz_utils:set_owner(object, owner) && "Object ownership changed."));
  102141. endif
  102142. endif
  102143. .
  102144. #58:1
  102145. if ((length(args) == 1) && (argstr[1] == "\""))
  102146. argstr = args[1];
  102147. endif
  102148. for person in (connected_players())
  102149. if (person != player)
  102150. person:notify(tostr(player.name, " shouts, \"", argstr, "\""));
  102151. endif
  102152. endfor
  102153. player:notify(tostr("You shout, \"", argstr, "\""));
  102154. .
  102155. #58:2
  102156. "@grant <object> to <player>";
  102157. "@grants <object> to <player>   --- same as @grant but may suspend.";
  102158. "@transfer <expression> to <player> -- like 'grant', but evalutes a possible list of objects to transfer, and modifies quota.";
  102159. "Ownership of the object changes as in @chown and :set_owner (i.e., .owner and all c properties change).  In addition all verbs and !c properties owned by the original owner change ownership as well.  Finally, for !c properties, instances on descendant objects change ownership (as in :set_property_owner).";
  102160. if ((!player.wizard) || (player != this))
  102161. player:notify("Sorry.");
  102162. return;
  102163. endif
  102164. set_task_perms(player);
  102165. if ((!iobjstr) || (!dobjstr))
  102166. return player:notify(tostr("Usage:  ", verb, " <object> to <player>"));
  102167. endif
  102168. if ($command_utils:player_match_failed(newowner = $string_utils:match_player(iobjstr), iobjstr))
  102169. "...newowner is bogus...";
  102170. return;
  102171. endif
  102172. if (verb == "@transfer")
  102173. objlist = player:eval_cmd_string(dobjstr, 0);
  102174. if (!objlist[1])
  102175. player:notify(tostr("Had trouble reading `", dobjstr, "': "));
  102176. player:notify_lines(@objlist[2]);
  102177. return;
  102178. elseif (typeof(objlist[2]) == OBJ)
  102179. objlist = objlist[2..2];
  102180. elseif (typeof(objlist[2]) != LIST)
  102181. player:notify(tostr("Value of `", dobjstr, "' is not an object or list:  ", $string_utils:print(objlist[2])));
  102182. return;
  102183. else
  102184. objlist = objlist[2];
  102185. endif
  102186. elseif ($command_utils:object_match_failed(object = this:my_match_object(dobjstr), dobjstr))
  102187. "...object is bogus...";
  102188. return;
  102189. else
  102190. objlist = {object};
  102191. endif
  102192. if ((verb == "@transfer") && (newowner.ownership_quota < length(objlist)))
  102193. player:tell("Sorry, ", $string_utils:nn(newowner), " doesn't have enough quota.");
  102194. return;
  102195. endif
  102196. suspendok = (verb != "@grant");
  102197. player:tell("Transfering ", $string_utils:print(objlist), " to ", $string_utils:nn(newowner));
  102198. for object in (objlist)
  102199. $command_utils:suspend_if_needed(0);
  102200. same = (object.owner == newowner);
  102201. for vnum in [0..length(verbs(object)) - 1]
  102202. verb = tostr(vnum);
  102203. info = verb_info(object, verb);
  102204. if (!((info[1] != object.owner) && (valid(info[1]) && is_player(info[1]))))
  102205. same = (same && (info[1] == newowner));
  102206. set_verb_info(object, verb, listset(info, newowner, 1));
  102207. endif
  102208. endfor
  102209. for prop in (properties(object))
  102210. if (suspendok && ((ticks_left() < 5000) || (seconds_left() < 2)))
  102211. suspend(0);
  102212. endif
  102213. info = property_info(object, prop);
  102214. if (!(index(info[2], "c") || (((info[1] != object.owner) && valid(info[1])) && is_player(info[1]))))
  102215. same = (same && (info[1] == newowner));
  102216. $wiz_utils:set_property_owner(object, prop, newowner, suspendok);
  102217. endif
  102218. endfor
  102219. if (suspendok)
  102220. suspend(0);
  102221. endif
  102222. $wiz_utils:set_owner(object, newowner, suspendok);
  102223. if (same)
  102224. player:notify(tostr(newowner.name, " already owns everything ", newowner.ps, " is entitled to on ", object.name, "."));
  102225. else
  102226. player:notify(tostr("Ownership changed on ", $string_utils:nn(object), ", verb, properties and descendants' properties."));
  102227. endif
  102228. endfor
  102229. .
  102230. #58:3
  102231. set_task_perms(player);
  102232. dobj = $string_utils:match_player(dobjstr);
  102233. if (dobj == $nothing)
  102234. player:notify(tostr("Usage:  ", verb, " <playername>"));
  102235. elseif ($command_utils:player_match_result(dobj, dobjstr)[1])
  102236. elseif ((dobj.description == $player.description) && (!$command_utils:yes_or_no($string_utils:pronoun_sub("@Programmer %d despite %[dpp] lack of description?"))))
  102237. player:notify(tostr("Okay, leaving ", dobj.name, " !programmer."));
  102238. return;
  102239. elseif (result = $wiz_utils:set_programmer(dobj))
  102240. player:notify(tostr(dobj.name, " is now a programmer.  ", dobj.ppc, " quota is currently ", dobj.ownership_quota, "."));
  102241. player:notify(tostr(dobj.name, " and the other wizards have been notified."));
  102242. if (msg = this:programmer_victim_msg())
  102243. dobj:notify(msg);
  102244. endif
  102245. if ($object_utils:isa(dobj.location, $room) && (msg = this:programmer_msg()))
  102246. dobj.location:announce_all_but({dobj}, msg);
  102247. endif
  102248. elseif (result == E_NONE)
  102249. player:notify(tostr(dobj.name, " (", dobj, ") is already a programmer..."));
  102250. else
  102251. player:notify(tostr(result));
  102252. endif
  102253. .
  102254. #58:4
  102255. if (!player.wizard)
  102256. player:notify("Nice try, but permission denied.");
  102257. return;
  102258. elseif (args == {})
  102259. player:notify(tostr("Continuing with this command will destroy all but the central core of the database.  If you're really sure that you want to do this, type '", verb, " ", tonum(o = create(#1)), "' now."));
  102260. recycle(o);
  102261. return;
  102262. elseif (toobj(tonum(args[1])) != max_object())
  102263. player:notify(tostr("Nice try, but you mistyped the self-destruct password.  Type '", verb, "' again to get a new password."));
  102264. return;
  102265. elseif (verb_info($wiz, verb)[1] != player)
  102266. player:notify("Sorry, but you must own this verb in order to use it.");
  102267. return;
  102268. endif
  102269. "----------------------------------------";
  102270. player:notify("Blowing away $local...");
  102271. $local = #-1;
  102272. "----------------------------------------";
  102273. player:notify("Identifying objects to be saved...");
  102274. saved = {#0, player};
  102275. saved_props = {};
  102276. for p in (properties(#0))
  102277. v = #0.(p);
  102278. if ((typeof(v) == OBJ) && valid(v))
  102279. saved = setadd(saved, v);
  102280. saved_props = {@saved_props, p};
  102281. endif
  102282. endfor
  102283. for o in (saved)
  102284. "Also save non-$ objects that are ancestors of $ objects";
  102285. "but leave out non-$ player classes";
  102286. if (!$object_utils:isa(o, $player))
  102287. p = parent(o);
  102288. while (valid(p))
  102289. saved = setadd(saved, p);
  102290. p = parent(p);
  102291. endwhile
  102292. endif
  102293. endfor
  102294. $player_class = $player;
  102295. "----------------------------------------";
  102296. player:notify("Killing all queued tasks ...");
  102297. for t in (queued_tasks())
  102298. kill_task(t[1]);
  102299. endfor
  102300. "----------------------------------------";
  102301. player:notify("Stripping you of any personal verbs and/or properties ...");
  102302. suspend(0);
  102303. for i in [1..length(verbs(player))]
  102304. delete_verb(player, "0");
  102305. endfor
  102306. for p in (properties(player))
  102307. delete_property(player, p);
  102308. endfor
  102309. chparent(player, $wiz);
  102310. for p in ($object_utils:all_properties(player))
  102311. player.(p) = $wiz.(p);
  102312. endfor
  102313. player.name = "Wizard";
  102314. player.aliases = {"Wizard"};
  102315. player.description = "";
  102316. player.key = 0;
  102317. player.ownership_quota = 100;
  102318. player.password = 0;
  102319. $gender_utils:set(player, "neuter");
  102320. "----------------------------------------";
  102321. suspend(0);
  102322. player:notify("Making you or $hacker the owner of every saved object, verb and property ...");
  102323. for i in [1..length(saved)]
  102324. if ($command_utils:running_out_of_time())
  102325. suspend(0);
  102326. player:notify(tostr("... finished ", i - 1, " out of ", length(saved), " saved objects ..."));
  102327. endif
  102328. o = saved[i];
  102329. if (valid(o.owner) && o.owner.wizard)
  102330. o.owner = player;
  102331. else
  102332. o.owner = $hacker;
  102333. endif
  102334. old_verbs = {};
  102335. for j in [0..length(verbs(o)) - 1]
  102336. if ((seconds_left() < 2) || (ticks_left() < 2000))
  102337. suspend(0);
  102338. player:notify(tostr("... finished ", i - 1, " out of ", length(saved), " saved objects ..."));
  102339. endif
  102340. vname = tostr(j);
  102341. info = verb_info(o, vname);
  102342. if (valid(info[1]) && info[1].wizard)
  102343. info = listset(info, player, 1);
  102344. else
  102345. info = listset(info, $hacker, 1);
  102346. endif
  102347. set_verb_info(o, vname, info);
  102348. if (index(info[3], "(old)"))
  102349. old_verbs = {vname, @old_verbs};
  102350. endif
  102351. endfor
  102352. for vname in (old_verbs)
  102353. delete_verb(o, vname);
  102354. endfor
  102355. for p in ($object_utils:all_properties(o))
  102356. if ((seconds_left() < 2) || (ticks_left() < 2000))
  102357. suspend(0);
  102358. player:notify(tostr("... finished ", i - 1, " out of ", length(saved), " saved objects ..."));
  102359. endif
  102360. info = property_info(o, p);
  102361. if (valid(info[1]) && info[1].wizard)
  102362. info = listset(info, player, 1);
  102363. else
  102364. info = listset(info, $hacker, 1);
  102365. endif
  102366. set_property_info(o, p, info);
  102367. endfor
  102368. endfor
  102369. "----------------------------------------";
  102370. player:notify("Removing all unsaved :recycle and :exitfunc verbs ...");
  102371. for i in [0..tonum(max_object())]
  102372. o = toobj(i);
  102373. if (i && ((i % 1000) == 0))
  102374. player:notify(tostr("... ", o));
  102375. endif
  102376. $command_utils:suspend_if_needed(0);
  102377. if (valid(o) && (!(o in saved)))
  102378. for v in ({"recycle", "exitfunc"})
  102379. while ((hv = $object_utils:has_verb(o, v)) && (hv[1] == o))
  102380. delete_verb(o, v);
  102381. endwhile
  102382. endfor
  102383. endif
  102384. endfor
  102385. "----------------------------------------";
  102386. player:notify("Recycling unsaved objects ...");
  102387. add_property(this, "mcd_pos", 0, {player, "r"});
  102388. suspend(0);
  102389. this:mcd_2(saved, saved_props);
  102390. .
  102391. #58:5
  102392. if (!player.wizard)
  102393. player:notify("Sorry.");
  102394. return;
  102395. elseif ($code_utils:task_valid($shutdown_task))
  102396. player:notify("Shutdown already in progress.");
  102397. return;
  102398. endif
  102399. if (s = match(argstr, "^in +%([0-9]+%) +"))
  102400. bounds = s[3][1];
  102401. delay = tonum(argstr[bounds[1]..bounds[2]]);
  102402. argstr = argstr[s[2] + 1..length(argstr)];
  102403. else
  102404. delay = 2;
  102405. endif
  102406. if (!$command_utils:yes_or_no(tostr("Do you really want to shut down the server in ", delay, " minutes?")))
  102407. player:notify("Aborted.");
  102408. return;
  102409. endif
  102410. announce_times = {};
  102411. if (delay > 0)
  102412. while (delay > 0)
  102413. announce_times = {@announce_times, delay * 60};
  102414. delay = (delay / 2);
  102415. endwhile
  102416. announce_times = {@announce_times, 30, 10};
  102417. $shutdown_time = (time() + announce_times[1]);
  102418. endif
  102419. $shutdown_message = tostr(player.name, " (", player, "): ", argstr);
  102420. $shutdown_task = task_id();
  102421. for i in [1..length(announce_times)]
  102422. msg = tostr("*** The server will be shut down by ", player.name, " (", player, ") in ", $time_utils:english_time(announce_times[i]), ": ", argstr, " ***");
  102423. "...use raw notify() since :notify() verb could be broken...";
  102424. for p in (connected_players())
  102425. notify(p, msg);
  102426. endfor
  102427. suspend(announce_times[i] - {@announce_times, 0}[i + 1]);
  102428. endfor
  102429. for p in (connected_players())
  102430. notify(p, tostr("*** Server shutdown by ", player.name, " (", player, "): ", argstr, " ***"));
  102431. boot_player(p);
  102432. endfor
  102433. suspend(0);
  102434. $shutdown_task = E_NONE;
  102435. set_task_perms(player);
  102436. shutdown(argstr);
  102437. .
  102438. #58:6
  102439. set_task_perms(player);
  102440. dump_database();
  102441. player:notify("Dumping...");
  102442. .
  102443. #58:7
  102444. set_task_perms(player);
  102445. if (argstr[1] != ":")
  102446. argstr = (":" + argstr);
  102447. endif
  102448. player:notify(tostr("Searching for verbs that appear to call ", argstr, " ..."));
  102449. player:notify("");
  102450. $code_utils:find_verbs_containing(argstr + "(");
  102451. .
  102452. #58:8
  102453. if (!caller_perms().wizard)
  102454. return;
  102455. elseif (!("mcd_pos" in properties(this)))
  102456. return;
  102457. endif
  102458. start = this.mcd_pos;
  102459. saved = args[1];
  102460. saved_props = args[2];
  102461. player:notify(tostr("*** Recycling from #", start, " ..."));
  102462. suspend(0);
  102463. fork (0)
  102464. this:mcd_2(saved, saved_props);
  102465. endfork
  102466. for i in [start..tonum(max_object())]
  102467. this.mcd_pos = i;
  102468. o = toobj(i);
  102469. if ($command_utils:running_out_of_time())
  102470. return;
  102471. endif
  102472. if (valid(o) && (!(o in saved)))
  102473. for x in (o.contents)
  102474. move(x, #-1);
  102475. endfor
  102476. recycle(o);
  102477. endif
  102478. endfor
  102479. delete_property(this, "mcd_pos");
  102480. "----------------------------------------";
  102481. suspend(0);
  102482. player:notify("Killing queued tasks ...");
  102483. for t in (queued_tasks())
  102484. kill_task(t[1]);
  102485. endfor
  102486. "----------------------------------------";
  102487. player:notify("Compacting object numbers ...");
  102488. alist = {};
  102489. for p in (saved_props)
  102490. $command_utils:suspend_if_needed(0);
  102491. if (pair = $list_utils:assoc(#0.(p), alist))
  102492. #0.(p) = pair[2];
  102493. elseif (#0.(p) != player)
  102494. old = #0.(p);
  102495. #0.(p) = renumber(#0.(p));
  102496. alist = {@alist, {old, #0.(p)}};
  102497. endif
  102498. endfor
  102499. for o in (saved)
  102500. if (valid(o) && (o != player))
  102501. renumber(o);
  102502. endif
  102503. endfor
  102504. reset_max_object();
  102505. "----------------------------------------";
  102506. player:notify("Performing miscellaneous cleanups ...");
  102507. for i in [0..tonum(max_object())]
  102508. $command_utils:suspend_if_needed(0);
  102509. o = toobj(i);
  102510. move(o, ((o == player) || (o == $news)) ? $player_start | #-1);
  102511. if ($object_utils:has_callable_verb(o, "init_for_core"))
  102512. o:init_for_core();
  102513. endif
  102514. endfor
  102515. player:notify("Core database extraction is complete.  Type @shutdown to save it.");
  102516. .
  102517. #58:9
  102518. "@toad[!][!] <player> [blacklist|redlist|graylist] [commentary]";
  102519. whostr = args[1];
  102520. comment = $string_utils:first_word(argstr)[2];
  102521. if (verb == "@toad!!")
  102522. listname = "redlist";
  102523. elseif (verb == "@toad!")
  102524. listname = "blacklist";
  102525. elseif ((ln = {@args, ""}[2]) && (index(listname = $login:listname(ln), ln) == 1))
  102526. "...first word of coment is one of the magic words...";
  102527. comment = $string_utils:first_word(comment)[2];
  102528. else
  102529. listname = "";
  102530. endif
  102531. if ((!player.wizard) || (player != this))
  102532. player:notify("Yeah, right... you wish.");
  102533. return;
  102534. elseif ($command_utils:player_match_failed(who = $string_utils:match_player(whostr), whostr))
  102535. return;
  102536. elseif (((whostr != who.name) && (!(whostr in who.aliases))) && (whostr != tostr(who)))
  102537. player:notify(tostr("Must be a full name or an object number:  ", who.name, "(", who, ")"));
  102538. return;
  102539. elseif (who == player)
  102540. player:notify("If you want to toad yourself, you have to do it by hand.");
  102541. return;
  102542. endif
  102543. dobj = who;
  102544. if (msg = player:toad_victim_msg())
  102545. notify(who, msg);
  102546. endif
  102547. if ($wiz_utils:rename_all_instances(who, "disfunc", "toad_disfunc"))
  102548. player:notify(tostr(who, ":disfunc renamed."));
  102549. endif
  102550. if ($wiz_utils:rename_all_instances(who, "recycle", "toad_recycle"))
  102551. player:notify(tostr(who, ":recycle renamed."));
  102552. endif
  102553. e = $wiz_utils:unset_player(who, $hacker);
  102554. player:notify(e ? tostr(who.name, "(", who, ") is now a toad.") | tostr(e));
  102555. if (e && ($object_utils:isa(who.location, $room) && (msg = player:toad_msg())))
  102556. who.location:announce_all_but({who}, msg);
  102557. endif
  102558. if (listname && (!$login:(listname + "ed")(cname = $string_utils:connection_hostname(who.last_connect_place))))
  102559. $login:(listname + "_add")(cname);
  102560. player:notify(tostr("Site ", cname, " ", listname, "ed."));
  102561. else
  102562. cname = "";
  102563. endif
  102564. $mail_agent:send_message(player, $toad_log, tostr("@toad ", who.name, " (", who, ")"), {$string_utils:from_list(who.all_connect_places, " "), @cname ? {$string_utils:capitalize(listname + "ed:  ") + cname} | {}, @comment ? {comment} | {}});
  102565. .
  102566. #58:10
  102567. "@untoad <object> [as namespec]";
  102568. "Turns object into a player.  Anything that isn't a guest is chowned to itself.";
  102569. if (!player.wizard)
  102570. player:notify("Yeah, right... you wish.");
  102571. elseif (prepstr && (prepstr != "as"))
  102572. player:notify(tostr("Usage:  ", verb, " <object> [as name,alias,alias...]"));
  102573. elseif ($command_utils:object_match_failed(dobj, dobjstr))
  102574. elseif (prepstr && (!(e = $building_utils:set_names(dobj, iobjstr))))
  102575. player:notify(tostr("Initial rename failed:  ", e));
  102576. elseif (e = $wiz_utils:set_player(dobj, g = $object_utils:isa(dobj, $guest)))
  102577. player:notify(tostr(dobj.name, "(", dobj, ") is now a ", g ? "usable guest." | "player."));
  102578. elseif (e == E_INVARG)
  102579. player:notify(tostr(dobj.name, "(", dobj, ") is not of an appropriate player class."));
  102580. player:notify("@chparent it to $player or some descendant.");
  102581. elseif (e == E_NONE)
  102582. player:notify(tostr(dobj.name, "(", dobj, ") is already a player."));
  102583. elseif (e == E_NACC)
  102584. player:notify("Wait until $player_db is finished updating...");
  102585. elseif (e == E_RECMOVE)
  102586. player:notify(tostr("The name `", dobj.name, "' is currently unavailable."));
  102587. player:notify(tostr("Try again with   ", verb, " ", dobj, " as <newname>"));
  102588. else
  102589. player:notify(tostr(e));
  102590. endif
  102591. .
  102592. #58:11
  102593. "@quota <player> is <number> [<reason>]";
  102594. "  changes a player's quota.  sends mail to the wizards.";
  102595. set_task_perms(player);
  102596. dobj = $string_utils:match_player(dobjstr);
  102597. if ($command_utils:player_match_result(dobj, dobjstr)[1])
  102598. return;
  102599. elseif (!valid(dobj))
  102600. player:notify("Set whose quota?");
  102601. return;
  102602. endif
  102603. new = tonum(qstr = iobjstr[1..(n = index(iobjstr + " ", " ")) - 1]);
  102604. reason = (iobjstr[n + 1..length(iobjstr)] || "(none)");
  102605. if (tostr(new) != qstr)
  102606. player:notify(tostr("Set ", dobj.name, "'s quota to what?"));
  102607. return;
  102608. endif
  102609. old = dobj.ownership_quota;
  102610. result = (dobj.ownership_quota = new);
  102611. if (typeof(result) == ERR)
  102612. player:notify(tostr(result));
  102613. else
  102614. player:notify(tostr(dobj.name, "'s quota set to ", new, "."));
  102615. endif
  102616. $mail_agent:send_message(player, $quota_log, tostr("@quota ", dobj.name, " (", dobj, ") ", new, " (from ", old, ")"), tostr("Reason for quota ", ((new - old) < 0) ? "decrease: " | "increase: ", reason, "."));
  102617. .
  102618. #58:12
  102619. set_task_perms(player);
  102620. "The time below is Oct. 1, 1990, roughly the birthdate of the LambdaMOO server.";
  102621. start = 654768000;
  102622. now = time();
  102623. day = ((24 * 60) * 60);
  102624. week = (7 * day);
  102625. month = (30 * day);
  102626. days_objects = (days_players = {0, 0, 0, 0, 0, 0, 0});
  102627. weeks_objects = (weeks_players = {0, 0, 0, 0});
  102628. months_objects = (months_players = {});
  102629. nonplayer_objects = (invalid_objects = 0);
  102630. always_objects = (always_players = 0);
  102631. never_objects = (never_players = 0);
  102632. numo = 0;
  102633. if (argstr)
  102634. if (((!dobjstr) && (prepstr == "with")) && (index("objects", iobjstr) == 1))
  102635. with_objects = 1;
  102636. else
  102637. player:notify(tostr("Usage:  ", verb, " [with objects]"));
  102638. return;
  102639. endif
  102640. else
  102641. with_objects = 0;
  102642. players = players();
  102643. endif
  102644. for i in [1..with_objects ? tonum(max_object()) + 1 | length(players)]
  102645. if (with_objects)
  102646. o = toobj(i - 1);
  102647. else
  102648. o = players[i];
  102649. endif
  102650. if ($command_utils:running_out_of_time())
  102651. player:notify(tostr("... ", o));
  102652. suspend(0);
  102653. endif
  102654. if (valid(o))
  102655. numo = (numo + 1);
  102656. p = (is_player(o) ? o | o.owner);
  102657. if (!valid(p))
  102658. invalid_objects = (invalid_objects + 1);
  102659. elseif (!$object_utils:isa(p, $player))
  102660. nonplayer_objects = (nonplayer_objects + 1);
  102661. else
  102662. seconds = (now - p.last_connect_time);
  102663. days = (seconds / day);
  102664. weeks = (seconds / week);
  102665. months = (seconds / month);
  102666. if (seconds < 0)
  102667. if (is_player(o))
  102668. always_players = (always_players + 1);
  102669. else
  102670. always_objects = (always_objects + 1);
  102671. endif
  102672. elseif (seconds > (now - start))
  102673. if (is_player(o))
  102674. never_players = (never_players + 1);
  102675. else
  102676. never_objects = (never_objects + 1);
  102677. endif
  102678. elseif (months > 0)
  102679. while (months > length(months_players))
  102680. months_players = {@months_players, 0};
  102681. months_objects = {@months_objects, 0};
  102682. endwhile
  102683. if (is_player(o))
  102684. months_players[months] = (months_players[months] + 1);
  102685. endif
  102686. months_objects[months] = (months_objects[months] + 1);
  102687. elseif (weeks > 0)
  102688. if (is_player(o))
  102689. weeks_players[weeks] = (weeks_players[weeks] + 1);
  102690. endif
  102691. weeks_objects[weeks] = (weeks_objects[weeks] + 1);
  102692. else
  102693. if (is_player(o))
  102694. days_players[days + 1] = (days_players[days + 1] + 1);
  102695. endif
  102696. days_objects[days + 1] = (days_objects[days + 1] + 1);
  102697. endif
  102698. endif
  102699. endif
  102700. endfor
  102701. player:notify("");
  102702. player:notify(tostr("Last connected"));
  102703. player:notify(tostr("at least this     Num.     Cumul.   Cumul. %", with_objects ? "     Num.     Cumul.   Cumul. %" | ""));
  102704. player:notify(tostr("long ago        players   players   players ", with_objects ? "   objects   objects   objects" | ""));
  102705. player:notify(tostr("---------------------------------------------", with_objects ? "--------------------------------" | ""));
  102706. su = $string_utils;
  102707. col1 = 14;
  102708. col2 = 7;
  102709. col3 = 10;
  102710. col4 = 9;
  102711. col5 = 11;
  102712. col6 = 11;
  102713. col7 = 10;
  102714. nump = length(players());
  102715. totalp = (totalo = 0);
  102716. for x in ({{days_players, days_objects, "day", 1}, {weeks_players, weeks_objects, "week", 0}, {months_players, months_objects, "month", 0}})
  102717. pcounts = x[1];
  102718. ocounts = x[2];
  102719. unit = x[3];
  102720. offset = x[4];
  102721. for i in [1..length(pcounts)]
  102722. $command_utils:suspend_if_needed(0);
  102723. j = (i - offset);
  102724. player:notify(tostr(su:left(tostr(j, " ", unit, (j == 1) ? ":" | "s:"), col1), su:right(pcounts[i], col2), su:right(totalp = (totalp + pcounts[i]), col3), su:right((totalp * 100) / nump, col4), "%", with_objects ? tostr(su:right(ocounts[i], col5), su:right(totalo = (totalo + ocounts[i]), col6), su:right((totalo * 100) / numo, col7), "%") | ""));
  102725. endfor
  102726. player:notify("");
  102727. endfor
  102728. player:notify(tostr(su:left("Never:", col1), su:right(never_players, col2), su:right(totalp = (totalp + never_players), col3), su:right((totalp * 100) / nump, col4), "%", with_objects ? tostr(su:right(never_objects, col5), su:right(totalo = (totalo + never_objects), col6), su:right((totalo * 100) / numo, col7), "%") | ""));
  102729. player:notify(tostr(su:left("Always:", col1), su:right(always_players, col2), su:right(totalp = (totalp + always_players), col3), su:right((totalp * 100) / nump, col4), "%", with_objects ? tostr(su:right(always_objects, col5), su:right(totalo = (totalo + always_objects), col6), su:right((totalo * 100) / numo, col7), "%") | ""));
  102730. with_objects && player:notify(tostr(su:left("Non-player owner:", (((col1 + col2) + col3) + col4) + 1), su:right(nonplayer_objects, col5), su:right(totalo = (totalo + nonplayer_objects), col6), su:right((totalo * 100) / numo, col7), "%"));
  102731. with_objects && player:notify(tostr(su:left("Invalid owner:", (((col1 + col2) + col3) + col4) + 1), su:right(invalid_objects, col5), su:right(totalo = (totalo + invalid_objects), col6), su:right((totalo * 100) / numo, col7), "%"));
  102732. player:notify("");
  102733. .
  102734. #58:13
  102735. "Auxiliary verb for parsing @kill soon [#-of-seconds] [player | everyone]";
  102736. "Args[1] is either # of seconds or player/everyone.";
  102737. "Args[2], if it exists, is player/everyone, and forces args[1] to have been # of seconds.";
  102738. "Return value: {# of seconds [default 60] , 1 for all, object for player.}";
  102739. set_task_perms(caller_perms());
  102740. nargs = length(args);
  102741. soon = tonum(args[1]);
  102742. if (nargs > 1)
  102743. everyone = args[2];
  102744. elseif (soon <= 0)
  102745. everyone = args[1];
  102746. else
  102747. everyone = 0;
  102748. endif
  102749. if (everyone == "everyone")
  102750. everyone = 1;
  102751. elseif (typeof(everyone) == STR)
  102752. result = $string_utils:match_player(everyone);
  102753. if ($command_utils:player_match_failed(result, everyone))
  102754. player:notify(tostr("Usage:  ", callers()[1][2], " soon [number of seconds] [\"everyone\" | player name]"));
  102755. return {-1, -1};
  102756. else
  102757. return {soon ? soon | 60, result};
  102758. endif
  102759. endif
  102760. return {soon ? soon | 60, everyone ? everyone | player};
  102761. .
  102762. #58:14
  102763. set_task_perms(player);
  102764. if (!args)
  102765. player:notify(tostr("Usage:  ", verb, " <pattern>"));
  102766. return;
  102767. endif
  102768. pattern = argstr;
  102769. regexp = (verb == "@egrepcore");
  102770. player:notify(tostr("Searching for core verbs ", regexp ? "matching the regular expression " | "containing the string ", $string_utils:print(pattern), " ..."));
  102771. player:notify("");
  102772. $code_utils:(regexp ? "find_verbs_matching" | "find_verbs_containing")(pattern, #0:core_objects());
  102773. .
  102774. #58:15
  102775. "@net-who prints all connected users and hosts.";
  102776. "@net-who player player player prints specified users and current or most recent connected host.";
  102777. "@net-who from hoststring prints all players who have connected from that host or host substring.  Substring can include *'s, e.g. @net-who from *.foo.edu.";
  102778. set_task_perms(player);
  102779. su = $string_utils;
  102780. if ((prepstr == "from") && dobjstr)
  102781. player:notify(tostr("Usage:  ", verb, " from <host string>"));
  102782. elseif (((prepstr != "from") || dobjstr) || (!iobjstr))
  102783. "Not parsing 'from' here...  Instead printing connected/recent users.";
  102784. if (!(pstrs = args))
  102785. unsorted = connected_players();
  102786. else
  102787. unsorted = listdelete($command_utils:player_match_result(su:match_player(pstrs), pstrs), 1);
  102788. endif
  102789. if (!unsorted)
  102790. return;
  102791. endif
  102792. $wiz_utils:show_netwho_listing(player, unsorted);
  102793. else
  102794. $wiz_utils:show_netwho_from_listing(player, iobjstr);
  102795. endif
  102796. .
  102797. #58:16
  102798. "Creates a player.";
  102799. "Syntax:  @make-player name email-address comments....";
  102800. "Generates a random password for the player.";
  102801. if ((!player.wizard) || callers())
  102802. return E_PERM;
  102803. endif
  102804. return $wiz_utils:do_make_player(@args);
  102805. .
  102806. #58:17
  102807. if (!player.wizard)
  102808. player:notify("Sorry.");
  102809. elseif (!$code_utils:task_valid($shutdown_task))
  102810. player:notify("No server shutdown in progress.");
  102811. $shutdown_task = E_NONE;
  102812. else
  102813. "... Reset time so that $login:check_for_shutdown shuts up...";
  102814. kill_task($shutdown_task);
  102815. $shutdown_task = E_NONE;
  102816. $shutdown_time = (time() - 1);
  102817. for p in (connected_players())
  102818. notify(p, tostr("*** Server shutdown ABORTED by ", player.name, " (", player, ")", argstr && (":  " + argstr), " ***"));
  102819. endfor
  102820. endif
  102821. .
  102822. #58:18
  102823. "This is the canonical doing-something-to-somebody message.";
  102824. "The corresponding property can either be";
  102825. "   string             msg for all occasions";
  102826. "   list of 2 strings  {we-are-there-msg,we-are-elsewhere-msg}";
  102827. m = this.(verb);
  102828. if (typeof(m) != LIST)
  102829. return $string_utils:pronoun_sub(m);
  102830. elseif ((this.location == dobj.location) || (length(m) < 2))
  102831. return $string_utils:pronoun_sub(m[1]);
  102832. else
  102833. return $string_utils:pronoun_sub(m[2]);
  102834. endif
  102835. .
  102836. #58:19
  102837. set_task_perms((caller in {this, $generic_editor, $verb_editor, $mail_editor, $note_editor}) ? this.owner | caller_perms());
  102838. return move(this, args[1]);
  102839. .
  102840. #58:20
  102841. "@newt <player> [commentary]";
  102842. "turns a player into a newt.  It can get better...";
  102843. "Installs $wiz_utils:newt_confunc on a user as :confunc.  It saves any existing :confunc the user may have as :denewt_confunc.  @denewt checks that their :confunc is the same as $wiz_utils:newt_confunc (if not it renames it to :newt_confunc and complains).  If so, it deletes it, and renames any :denewt_confunc to :confunc.";
  102844. "Sends mail to $newt_log giving .all_connect_places and commentary.";
  102845. whostr = args[1];
  102846. comment = $string_utils:first_word(argstr)[2];
  102847. if (!player.wizard)
  102848. player:notify("Yeah, right.");
  102849. elseif ($command_utils:player_match_failed(who = $string_utils:match_player(whostr), whostr))
  102850. return;
  102851. elseif (((whostr != who.name) && (!(whostr in who.aliases))) && (whostr != tostr(who)))
  102852. player:notify(tostr("Must be a full name or an object number:  ", who.name, "(", who, ")"));
  102853. return;
  102854. elseif (who == player)
  102855. player:notify("If you want to newt yourself, you have to do it by hand.");
  102856. return;
  102857. elseif ($wiz_utils:isnewt(who))
  102858. player:notify(tostr(who.name, " appears to already be a newt."));
  102859. return;
  102860. else
  102861. if ($wiz_utils:rename_all_instances(who, "confunc", "denewt_confunc"))
  102862. player:notify(tostr(who, ":confunc renamed to :denewt_confunc."));
  102863. endif
  102864. add_verb(who, {player, "x", "confunc"}, {"this", "none", "this"});
  102865. set_verb_code(who, "confunc", verb_code($wiz_utils, "newt_confunc"));
  102866. if (msg = player:newt_victim_msg())
  102867. notify(who, msg);
  102868. endif
  102869. notify(who, $login:newt_registration_string());
  102870. boot_player(who);
  102871. player:notify(tostr(who.name, " (", who, ") has been turned into a newt."));
  102872. $mail_agent:send_message(player, $newt_log, tostr("@newt ", who.name, " (", who, ")"), {$string_utils:from_list(who.all_connect_places, " "), @comment ? {comment} | {}});
  102873. if ($object_utils:isa(who.location, $room) && (msg = player:newt_msg()))
  102874. who.location:announce_all_but({who}, msg);
  102875. endif
  102876. endif
  102877. .
  102878. #58:21
  102879. "@denewt <player> [commentary]";
  102880. "Renames the player's :confunc to :newt_confunc, then checks that it is is the same as $wiz_utils:newt_confunc, if not complains.  If so, it deletes it, and renames any :denewt_confunc to :confunc.";
  102881. "Sends mail to $newt_log with commentary.";
  102882. whostr = args[1];
  102883. comment = $string_utils:first_word(argstr)[2];
  102884. if (!player.wizard)
  102885. player:notify("Yeah, right.");
  102886. elseif ($command_utils:player_match_failed(who = $string_utils:match_player(whostr), whostr))
  102887. return;
  102888. else
  102889. "Should parse email address and register user in some clever way.  Ick.";
  102890. if (!(inf = verb_info(who, "confunc")))
  102891. player:notify(tostr(who.name, " does not appear to be a newt."));
  102892. else
  102893. set_verb_info(who, "confunc", {inf[1], inf[2], "newt_confunc"});
  102894. wiz = verb_code($wiz_utils, "newt_confunc");
  102895. user = verb_code(who, "newt_confunc");
  102896. if (wiz == user)
  102897. delete_verb(who, "newt_confunc");
  102898. else
  102899. player:notify(tostr(who.name, "'s :confunc was not identical to $wiz_utils:newt_confunc.  Not automatically rmverbed.  Verify and manually @rmverb it."));
  102900. endif
  102901. if (inf = verb_info(who, "denewt_confunc"))
  102902. set_verb_info(who, "denewt_confunc", {inf[1], inf[2], "confunc"});
  102903. endif
  102904. player:notify(tostr(who.name, " (", who, ") got better."));
  102905. $mail_agent:send_message(player, $newt_log, tostr("@denewt ", who.name, " (", who, ")"), comment ? {comment} | {});
  102906. endif
  102907. endif
  102908. .
  102909. #58:22
  102910. "Registers a player.";
  102911. "Syntax:  @register name email-address [additional commentary]";
  102912. "Email-address is stored in $registration_db and on the player object.";
  102913. if (!player.wizard)
  102914. return player:tell(E_PERM);
  102915. endif
  102916. $wiz_utils:do_register(@args);
  102917. .
  102918. #58:23
  102919. "@newpassword player is [string]";
  102920. "Set's a player's password; omit string to have one randomly generated.";
  102921. "Offer to email the password.";
  102922. if (!player.wizard)
  102923. return E_PERM;
  102924. endif
  102925. $wiz_utils:do_new_password(dobjstr, iobjstr);
  102926. .
  102927. #58:24
  102928. "@log [<string>]    enters a comment in the server log.";
  102929. "If no string is given, you are prompted to enter one or more lines for an extended comment.";
  102930. set_task_perms(player);
  102931. whostr = tostr("from ", player.name, " (", player, ")");
  102932. if ((!player.wizard) || (player != caller))
  102933. player:notify("Yeah, right.");
  102934. elseif (argstr)
  102935. server_log(tostr("COMMENT: [", whostr, "]  ", argstr));
  102936. player:notify("One-line comment logged.");
  102937. elseif (lines = $command_utils:read_lines())
  102938. server_log(tostr("COMMENT: [", whostr, "]"));
  102939. for l in (lines)
  102940. server_log(l);
  102941. endfor
  102942. server_log(tostr("END_COMMENT."));
  102943. player:notify(tostr(length(lines), " lines logged as extended comment."));
  102944. endif
  102945. .
  102946. #58:25
  102947. set_task_perms(player);
  102948. n = ((dobjstr == "all") ? 0 | $code_utils:tonum(dobjstr || "20"));
  102949. if (caller != this)
  102950. player:notify("You lose.");
  102951. elseif ((n == E_TYPE) && (index("now", dobjstr) != 1))
  102952. player:notify(tostr("Usage:  ", verb, " <number>  (where <number> indicates how many entries to look at in the guest log)"));
  102953. player:notify(tostr("Usage:  ", verb, " now (to see information about currently connected guests only)"));
  102954. elseif ((!dobjstr) || (index("now", dobjstr) != 1))
  102955. $guest_log:last(n);
  102956. else
  102957. "*way* too much copied code in here from @who...  Sorry.  --yduJ";
  102958. su = $string_utils;
  102959. conn = connected_players();
  102960. unsorted = {};
  102961. for g in (children($guest))
  102962. if (g in conn)
  102963. unsorted = {@unsorted, g};
  102964. endif
  102965. endfor
  102966. if (!unsorted)
  102967. player:tell("No guests found.");
  102968. return;
  102969. endif
  102970. footnotes = {};
  102971. alist = {};
  102972. nwidth = length("Player name");
  102973. for u in (unsorted)
  102974. pref = (u.programmer ? "% " | "  ");
  102975. u.programmer && (footnotes = setadd(footnotes, "prog"));
  102976. u3 = {tostr(pref, u.name, " (", u, ")"), su:from_seconds(connected_seconds(u)), su:from_seconds(idle_seconds(u)), where = $string_utils:connection_hostname(connection_name(u))};
  102977. nwidth = max(length(u3[1]), nwidth);
  102978. if ($login:blacklisted(where))
  102979. where = ("(*) " + where);
  102980. footnotes = setadd(footnotes, "black");
  102981. elseif ($login:graylisted(where))
  102982. where = ("(+) " + where);
  102983. footnotes = setadd(footnotes, "gray");
  102984. endif
  102985. alist = {@alist, u3};
  102986. endfor
  102987. alist = $list_utils:sort_alist_suspended(0, alist, 3);
  102988. $command_utils:suspend_if_needed(0);
  102989. headers = {"Player name", "Connected", "Idle Time", "From Where"};
  102990. time_width = (length("59 minutes") + 2);
  102991. before = {0, w1 = (nwidth + 3), w2 = (w1 + time_width), w3 = (w2 + time_width)};
  102992. tell1 = ("  " + headers[1]);
  102993. tell2 = ("  " + su:space(headers[1], "-"));
  102994. for j in [2..4]
  102995. tell1 = (su:left(tell1, before[j]) + headers[j]);
  102996. tell2 = (su:left(tell2, before[j]) + su:space(headers[j], "-"));
  102997. endfor
  102998. player:notify(tell1);
  102999. player:notify(tell2);
  103000. active = 0;
  103001. for a in (alist)
  103002. $command_utils:suspend_if_needed(0);
  103003. tell1 = a[1];
  103004. for j in [2..4]
  103005. tell1 = (su:left(tell1, before[j]) + tostr(a[j]));
  103006. endfor
  103007. player:notify(tell1[1..min(length(tell1), 79)]);
  103008. endfor
  103009. if (footnotes)
  103010. player:notify("");
  103011. if ("prog" in footnotes)
  103012. player:notify(" %  == programmer.");
  103013. endif
  103014. if ("black" in footnotes)
  103015. player:notify("(*) == blacklisted site.");
  103016. endif
  103017. if ("gray" in footnotes)
  103018. player:notify("(+) == graylisted site.");
  103019. endif
  103020. endif
  103021. endif
  103022. .
  103023. #58:26
  103024. set_task_perms(valid(caller_perms()) ? caller_perms() | player);
  103025. use = this.mail_identity;
  103026. if (valid(use) && (use != this))
  103027. return use:(verb)(@args);
  103028. else
  103029. return pass(@args);
  103030. endif
  103031. .
  103032. #58:27
  103033. "@[un]blacklist [<site or subnet>  [commentary]]";
  103034. "@[un]graylist  [<site or subnet>  [commentary]]";
  103035. "@[un]redlist   [<site or subnet>  [commentary]]";
  103036. set_task_perms(player);
  103037. if ((player != this) || (!player.wizard))
  103038. player:notify("Ummm.  no.");
  103039. return;
  103040. endif
  103041. undo = (verb[2..3] == "un");
  103042. which = $login:listname(verb[undo ? 4 | 2]);
  103043. downgrade = {"", "graylist", "blacklist"}[1 + index("br", which[1])];
  103044. if (!(fw = $string_utils:first_word(argstr)))
  103045. "... Just print the list...";
  103046. slist = {};
  103047. if (s = $login.(which)[1])
  103048. slist = {@slist, "--- Subnets ---", @s};
  103049. endif
  103050. if (s = $login.(which)[2])
  103051. slist = {@slist, "--- Domains ---", @s};
  103052. endif
  103053. player:notify_lines($string_utils:columnize(slist, 3));
  103054. return;
  103055. endif
  103056. target = fw[1];
  103057. comment = (fw[2] ? {fw[2]} | {});
  103058. if (is_literal = $site_db:domain_literal(target))
  103059. if (target[l = length(target)] == ".")
  103060. target = target[1..l - 1];
  103061. endif
  103062. fullname = ("subnet " + target);
  103063. else
  103064. if (target[1] == ".")
  103065. target[1..1] = "";
  103066. endif
  103067. fullname = (("domain `" + target) + "'");
  103068. endif
  103069. rm = {};
  103070. entrylist = $login.(which)[1 + (!is_literal)];
  103071. if ((!undo) && (target in entrylist))
  103072. player:notify(tostr(fullname, " is already ", which, "ed."));
  103073. return;
  103074. endif
  103075. entrylist = setremove(entrylist, target);
  103076. confirm = 0;
  103077. if (is_literal)
  103078. for s in (entrylist)
  103079. if ((i = index(s, target + ".")) == 1)
  103080. "... target is a prefix of s, s should probably go...";
  103081. rm = {@rm, s};
  103082. elseif (index(target + ".", s + ".") != 1)
  103083. "... s is not a prefix of target...";
  103084. elseif (undo)
  103085. player:notify(tostr("You will need to un", which, " subnet ", s, " as well."));
  103086. elseif (confirm)
  103087. player:notify(tostr("...Subnet ", s, " already ", which, "ed..."));
  103088. else
  103089. player:notify(tostr("Subnet ", s, " already ", which, "ed."));
  103090. if (!(confirm = $command_utils:yes_or_no(tostr(which, " ", target, " anyway?"))))
  103091. return;
  103092. endif
  103093. endif
  103094. endfor
  103095. else
  103096. for s in (entrylist)
  103097. if ((i = rindex(s, "." + target)) && (i == (length(s) - length(target))))
  103098. "... target is a suffix of s, s should probably go...";
  103099. rm = {@rm, s};
  103100. elseif ((!(i = rindex("." + target, "." + s))) || (i < ((length(target) - length(s)) + 1)))
  103101. "... s is not a suffix of target...";
  103102. elseif (undo)
  103103. player:notify(tostr("You will need to un", which, " domain `", s, "' as well."));
  103104. elseif (confirm)
  103105. player:notify(tostr("...Domain `", s, "' already ", which, "ed..."));
  103106. else
  103107. player:notify(tostr("Domain `", s, "' already ", which, "ed."));
  103108. if (!(confirm = $command_utils:yes_or_no(tostr(which, " ", target, " anyway?"))))
  103109. return;
  103110. endif
  103111. endif
  103112. endfor
  103113. endif
  103114. namelist = $string_utils:english_list(rm);
  103115. downgraded = {};
  103116. if (rm)
  103117. ntries = ((length(rm) == 1) ? "ntry" | "ntries");
  103118. if ($command_utils:yes_or_no(tostr("Remove e", ntries, " for ", namelist, "?")))
  103119. dg = (undo && (downgrade && $command_utils:yes_or_no(downgrade + " them?")));
  103120. for s in (rm)
  103121. $login:(which + "_remove")(s);
  103122. dg && ($login:(downgrade + "_add")(s) && (downgraded = {@downgraded, s}));
  103123. endfor
  103124. player:notify(tostr("E", ntries, " removed", @dg ? {" and ", downgrade, "ed."} | {"."}));
  103125. else
  103126. player:notify(tostr(namelist, " will continue to be ", which, "ed."));
  103127. rm = {};
  103128. endif
  103129. endif
  103130. if (downgraded)
  103131. comment[1..0] = {tostr(downgrade, "ed ", $string_utils:english_list(downgraded), ".")};
  103132. endif
  103133. if (!undo)
  103134. $login:(which + "_add")(target);
  103135. player:notify(tostr(fullname, " ", which, "ed."));
  103136. if (rm)
  103137. comment[1..0] = {tostr("Subsumes ", which, "ing for ", namelist, ".")};
  103138. endif
  103139. elseif ($login:(which + "_remove")(target))
  103140. player:notify(tostr(fullname, " un", which, "ed."));
  103141. if (downgrade && $command_utils:yes_or_no(downgrade + " it?"))
  103142. $login:(downgrade + "_add")(target) && (downgraded = {target, @downgraded});
  103143. player:notify(tostr(fullname, " ", downgrade, "ed."));
  103144. endif
  103145. if (downgraded)
  103146. comment[1..0] = {tostr(downgrade, "ed ", $string_utils:english_list(downgraded), ".")};
  103147. endif
  103148. if (rm)
  103149. comment[1..0] = {tostr("Also removed ", namelist, ".")};
  103150. endif
  103151. elseif (rm)
  103152. player:notify(tostr(fullname, " itself was never actually ", which, "ed."));
  103153. comment[1..0] = {tostr("Removed ", namelist, ".")};
  103154. else
  103155. player:notify(tostr(fullname, " was not ", which, "ed before."));
  103156. return;
  103157. endif
  103158. subject = tostr(undo ? "@un" | "@", which, " ", fullname);
  103159. $mail_agent:send_message(player, $site_log, subject, comment);
  103160. "...";
  103161. "... make sure we haven't screwed ourselves...";
  103162. uhoh = {};
  103163. for site in (player.all_connect_places)
  103164. if (index(site, target) && $login:(which + "ed")(site))
  103165. uhoh = {@uhoh, site};
  103166. endif
  103167. endfor
  103168. if (uhoh)
  103169. player:notify(tostr("WARNING:  ", $string_utils:english_list(uhoh), " are now ", which, "ed!"));
  103170. endif
  103171. .
  103172. #58:28
  103173. "Usage:  @corify <object> as <propname>";
  103174. "Adds <object> to the core, as $<propname>";
  103175. "Reminds the wizard to write an :init_for_core verb, if there isn't one already.";
  103176. if (!player.wizard)
  103177. player:tell("Sorry, the core is wizardly territory.");
  103178. endif
  103179. if (dobj == $failed_match)
  103180. dobj = player:my_match_object(dobjstr);
  103181. endif
  103182. if ($command_utils:object_match_failed(dobj, dobjstr))
  103183. return;
  103184. endif
  103185. if (!iobjstr)
  103186. player:tell("Usage:  @corify <object> as <propname>");
  103187. return;
  103188. elseif (iobjstr[1] == "$")
  103189. iobjstr = iobjstr[2..length(iobjstr)];
  103190. endif
  103191. if (typeof(e = add_property(#0, iobjstr, dobj, {player, "r"})) == ERR)
  103192. player:tell(e);
  103193. return;
  103194. endif
  103195. if (!("init_for_core" in verbs(dobj)))
  103196. player:tell(dobj:titlec(), " has no :init_for_core verb.  Strongly consider adding one before doing anything else.");
  103197. endif
  103198. .
  103199. #58:29
  103200. "Usage:  @make-guest <guestname>";
  103201. "Creates a player called <guestname>_Guest owned by $hacker and a child of $guest.";
  103202. if (!player.wizard)
  103203. player:tell("If you think this MOO needs more guests, you should contact a wizard.");
  103204. return E_PERM;
  103205. endif
  103206. if (length(args) != 1)
  103207. player:tell("Usage: ", verb, " <guest name>");
  103208. return;
  103209. endif
  103210. guestname = (args[1] + "_Guest");
  103211. guestaliases = {guestname, adj = args[1]};
  103212. if (!player.wizard)
  103213. return;
  103214. elseif ($player_db.frozen)
  103215. player:tell("Sorry, the player db is frozen, so no players can be made right now.  Please try again in a few minutes.");
  103216. return;
  103217. elseif (!$player_db:available(guestname))
  103218. player:tell("\"", guestname, "\" is not an available name.");
  103219. return;
  103220. elseif (!$player_db:available(adj))
  103221. player:Tell("\"", adj, "\" is not an available name.");
  103222. return;
  103223. else
  103224. new = create($guest, $hacker);
  103225. new:set_name(guestname);
  103226. new:set_aliases(guestaliases);
  103227. if (!(e = $wiz_utils:set_player(new, 1)))
  103228. player:Tell("Unable to make ", new.name, " (", new, ") a player.");
  103229. player:Tell(tostr(e));
  103230. else
  103231. player:Tell("Guest: ", new.name, " (", new, ") made.");
  103232. new.default_description = {"By definition, guests appear nondescript."};
  103233. new.description = new.default_description;
  103234. new.last_connect_time = $maxint;
  103235. new.last_disconnect_time = time();
  103236. new:set_gender(new.default_gender);
  103237. move(new, $player_start);
  103238. player:tell("Now don't forget to @describe ", new, " as something.");
  103239. endif
  103240. endif
  103241. .
  103242. #59:0
  103243. set_task_perms(player);
  103244. if (!player.programmer)
  103245. player:notify("You need to be a programmer to do this.");
  103246. player:notify("If you want to become a programmer, talk to a wizard.");
  103247. return;
  103248. endif
  103249. nargs = length(args);
  103250. usage = tostr("Usage:  ", verb, " <object>.<prop-name> [<init_value> [<perms> [<owner>]]]");
  103251. if ((nargs < 1) || (!(spec = $code_utils:parse_propref(args[1]))))
  103252. player:notify(usage);
  103253. return;
  103254. endif
  103255. object = player:my_match_object(spec[1]);
  103256. name = spec[2];
  103257. if ($command_utils:object_match_failed(object, spec[1]))
  103258. return;
  103259. endif
  103260. if (nargs < 2)
  103261. value = 0;
  103262. else
  103263. q = $string_utils:prefix_to_value(argstr[$string_utils:word_start(argstr)[2][1]..length(argstr)]);
  103264. if (q[1] == 0)
  103265. player:notify(tostr("Syntax error in initial value:  ", q[2]));
  103266. return;
  103267. endif
  103268. value = q[2];
  103269. args = {args[1], value, @$string_utils:words(q[1])};
  103270. nargs = length(args);
  103271. endif
  103272. perms = ((nargs < 3) ? "rc" | args[3]);
  103273. if (nargs < 4)
  103274. owner = player;
  103275. else
  103276. owner = $string_utils:match_player(args[4]);
  103277. if ($command_utils:player_match_result(owner, args[4])[1])
  103278. return;
  103279. endif
  103280. endif
  103281. if (nargs > 4)
  103282. player:notify(usage);
  103283. return;
  103284. endif
  103285. e = add_property(object, name, value, {owner, perms});
  103286. if (typeof(e) != ERR)
  103287. player:notify(tostr("Property added with value ", $string_utils:print(object.(name), 1), "."));
  103288. elseif (e != E_INVARG)
  103289. player:notify(tostr(e));
  103290. elseif ($object_utils:has_property(object, name))
  103291. player:notify(tostr("Property ", object, ".", name, " already exists."));
  103292. else
  103293. for i in [1..length(perms)]
  103294. if (!index("rcw", perms[i]))
  103295. player:notify(tostr("Unknown permission bit:  ", perms[i]));
  103296. return;
  103297. endif
  103298. endfor
  103299. "...the only other possibility...";
  103300. player:notify("Property is already defined on one or more descendents.");
  103301. player:notify(tostr("Try @check-prop ", args[1]));
  103302. endif
  103303. .
  103304. #59:1
  103305. set_task_perms(player);
  103306. if (length(args) != 2)
  103307. player:notify(tostr("Usage:  ", verb, " <object-or-property-or-verb> <permissions>"));
  103308. return;
  103309. endif
  103310. what = args[1];
  103311. perms = args[2];
  103312. if (index(what, ".") && (spec = $code_utils:parse_propref(what)))
  103313. if (valid(object = player:my_match_object(spec[1])))
  103314. pname = spec[2];
  103315. info = property_info(object, pname);
  103316. if (info == E_PROPNF)
  103317. player:notify("That object does not have that property.");
  103318. elseif (typeof(info) == ERR)
  103319. player:notify(tostr(info));
  103320. else
  103321. info[2] = (perms = $perm_utils:apply(info[2], perms));
  103322. result = set_property_info(object, pname, info);
  103323. if (result == E_INVARG)
  103324. player:notify(tostr("\"", perms, "\" is not a valid permissions string for a property."));
  103325. elseif (typeof(result) == ERR)
  103326. player:notify(tostr(result));
  103327. else
  103328. player:notify(tostr("Property permissions set to \"", perms, "\"."));
  103329. endif
  103330. endif
  103331. return;
  103332. endif
  103333. elseif (spec = $code_utils:parse_verbref(what))
  103334. if (!player.programmer)
  103335. player:notify("You need to be a programmer to do this.");
  103336. player:notify("If you want to become a programmer, talk to a wizard.");
  103337. return;
  103338. endif
  103339. if (valid(object = player:my_match_object(spec[1])))
  103340. vname = spec[2];
  103341. info = verb_info(object, vname);
  103342. if (info == E_VERBNF)
  103343. player:notify("That object does not define that verb.");
  103344. elseif (typeof(info) == ERR)
  103345. player:notify(tostr(info));
  103346. elseif (!valid(owner = info[1]))
  103347. player:notify(tostr("That verb is owned by an invalid object (", owner, "); it needs to be @chowned."));
  103348. elseif (!is_player(owner))
  103349. player:notify(tostr("That verb is owned by a non-player object (", owner.name, ", ", owner, "); it needs to be @chowned."));
  103350. else
  103351. info[2] = (perms = $perm_utils:apply(info[2], perms));
  103352. if (index(info, "w"))
  103353. player:notify("That would allow anyone to change your verb.");
  103354. elseif ((result = set_verb_info(object, vname, info)) == E_INVARG)
  103355. player:notify(tostr("\"", perms, "\" is not a valid permissions string for a verb."));
  103356. elseif (typeof(result) == ERR)
  103357. player:notify(tostr(result));
  103358. else
  103359. player:notify(tostr("Verb permissions set to \"", perms, "\"."));
  103360. endif
  103361. endif
  103362. return;
  103363. endif
  103364. elseif (valid(object = player:my_match_object(what)))
  103365. perms = $perm_utils:apply(((object.r ? "r" | "") + (object.w ? "w" | "")) + (object.f ? "f" | ""), perms);
  103366. r = (w = (f = 0));
  103367. for i in [1..length(perms)]
  103368. if (perms[i] == "r")
  103369. r = 1;
  103370. elseif (perms[i] == "w")
  103371. w = 1;
  103372. elseif (perms[i] == "f")
  103373. f = 1;
  103374. else
  103375. player:notify(tostr("\"", perms, "\" is not a valid permissions string for an object."));
  103376. return;
  103377. endif
  103378. endfor
  103379. if ((((object.r = r) == E_PERM) || ((object.w = w) == E_PERM)) || ((object.f = f) == E_PERM))
  103380. player:notify("Permission denied.");
  103381. else
  103382. player:notify(tostr("Object permissions set to \"", perms, "\"."));
  103383. endif
  103384. return;
  103385. endif
  103386. $command_utils:object_match_failed(object, what);
  103387. .
  103388. #59:2
  103389. if (player != caller)
  103390. return;
  103391. endif
  103392. set_task_perms(player);
  103393. if (!player.programmer)
  103394. player:notify("You need to be a programmer to do this.");
  103395. player:notify("If you want to become a programmer, talk to a wizard.");
  103396. return;
  103397. endif
  103398. if (!(args && (spec = $code_utils:parse_verbref(args[1]))))
  103399. player:notify(tostr(args ? ("\"" + args[1]) + "\"?  " | "", "<object>:<verb>  expected."));
  103400. elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1]))
  103401. "...can't find object...";
  103402. elseif ((info = verb_args(object, name = spec[2])) == E_VERBNF)
  103403. player:notify("That object does not have a verb with that name.");
  103404. elseif (typeof(info) == ERR)
  103405. player:notify(tostr(info));
  103406. elseif (typeof(pas = $code_utils:parse_argspec(@listdelete(args, 1))) != LIST)
  103407. "...arg spec is bogus...";
  103408. player:notify(tostr(pas));
  103409. elseif (!(newargs = pas[1]))
  103410. player:notify($string_utils:from_list(info, " "));
  103411. elseif (pas[2])
  103412. player:notify(tostr("\"", pas[2][1], "\" unexpected."));
  103413. else
  103414. info[2] = info[2][1..index(info[2] + "/", "/") - 1];
  103415. info = {@newargs, @info[length(newargs) + 1..length(info)]};
  103416. result = set_verb_args(object, name, info);
  103417. if (result == E_INVARG)
  103418. player:notify(tostr("\"", info[2], "\" is not a valid preposition (?)"));
  103419. elseif (typeof(result) == ERR)
  103420. player:notify(tostr(result));
  103421. else
  103422. player:notify("Verb arguments changed.");
  103423. endif
  103424. endif
  103425. .
  103426. #59:3
  103427. "A MOO-code evaluator.  Type `;CODE' or `eval CODE'.";
  103428. "Calls player:eval_cmd_string to first transform CODE in any way appropriate (e.g., prefixing .eval_env) and then do the actual evaluation.  See documentation for this:eval_cmd_string";
  103429. "If you set your .eval_time property to 1, you find out how many ticks and seconds you used.";
  103430. "If eval-d is used, the evaluation is performed as if the debug flag were unset.";
  103431. if (player != this)
  103432. player:tell("I don't understand that.");
  103433. return;
  103434. endif
  103435. set_task_perms(player);
  103436. result = player:eval_cmd_string(argstr, verb != "eval-d");
  103437. if (result[1])
  103438. player:notify(this:eval_value_to_string(result[2]));
  103439. if (player.eval_time && (!output_delimiters(player)[2]))
  103440. player:notify(tostr("[used ", result[3], " tick", (result[3] != 1) ? "s, " | ", ", result[4], " second", (result[4] != 1) ? "s" | "", ".]"));
  103441. endif
  103442. else
  103443. player:notify_lines(result[2]);
  103444. nerrors = length(result[2]);
  103445. player:notify(tostr(nerrors, " error", (nerrors == 1) ? "." | "s."));
  103446. endif
  103447. .
  103448. #59:4
  103449. set_task_perms(player);
  103450. if ((length(args) != 1) || (!(spec = $code_utils:parse_propref(args[1]))))
  103451. player:notify(tostr("Usage:  ", verb, " <object>.<property>"));
  103452. return;
  103453. endif
  103454. object = player:my_match_object(spec[1]);
  103455. pname = spec[2];
  103456. if ($command_utils:object_match_failed(object, spec[1]))
  103457. return;
  103458. endif
  103459. result = delete_property(object, pname);
  103460. if (result == E_PROPNF)
  103461. player:notify("That object does not define that property.");
  103462. elseif (typeof(result) == ERR)
  103463. player:notify(tostr(result));
  103464. else
  103465. player:notify("Property removed.");
  103466. endif
  103467. .
  103468. #59:5
  103469. set_task_perms(player);
  103470. if (!player.programmer)
  103471. player:notify("You need to be a programmer to do this.");
  103472. player:notify("If you want to become a programmer, talk to a wizard.");
  103473. return;
  103474. endif
  103475. if (!(args && (spec = $code_utils:parse_verbref(args[1]))))
  103476. player:notify(tostr("Usage:  ", verb, " <object>:<verb-name(s)> [<dobj> [<prep> [<iobj> [<permissions> [<owner>]]]]]"));
  103477. return;
  103478. elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1]))
  103479. return;
  103480. endif
  103481. name = spec[2];
  103482. "...Adding another verb of the same name is often a mistake...";
  103483. namelist = $string_utils:explode(name);
  103484. for n in (namelist)
  103485. if (i = index(n, "*"))
  103486. n = (n[1..i - 1] + n[i + 1..length(n)]);
  103487. endif
  103488. if ((hv = $object_utils:has_verb(object, n)) && (hv[1] == object))
  103489. player:notify(tostr("Warning:  Verb `", n, "' already defined on that object."));
  103490. endif
  103491. endfor
  103492. if (typeof(pas = $code_utils:parse_argspec(@listdelete(args, 1))) != LIST)
  103493. player:notify(tostr(pas));
  103494. return;
  103495. endif
  103496. verbargs = {@pas[1], "none", "none", "none"}[1..3];
  103497. rest = pas[2];
  103498. if (rest)
  103499. perms = rest[1];
  103500. elseif (verbargs == {"this", "none", "this"})
  103501. perms = "rxd";
  103502. else
  103503. perms = "rd";
  103504. endif
  103505. if (length(rest) < 2)
  103506. owner = player;
  103507. elseif (length(rest) > 2)
  103508. player:notify(tostr("\"", rest[3], "\" unexpected."));
  103509. return;
  103510. elseif ($command_utils:player_match_result(owner = $string_utils:match_player(rest[2]), rest[2])[1])
  103511. return;
  103512. elseif (owner == $nothing)
  103513. player:notify("Verb can't be owned by no one!");
  103514. return;
  103515. endif
  103516. x = add_verb(object, {owner, perms, name}, verbargs);
  103517. if (x == E_INVARG)
  103518. player:notify(tostr(rest ? tostr("\"", perms, "\" is not a valid set of permissions.") | tostr("\"", verbargs[2], "\" is not a valid preposition (?)")));
  103519. elseif (typeof(x) == ERR)
  103520. player:notify(tostr(x));
  103521. else
  103522. player:notify(tostr("Verb added (", length(verbs(object)) - 1, ")."));
  103523. endif
  103524. .
  103525. #59:6
  103526. set_task_perms(player);
  103527. if (!(args && (spec = $code_utils:parse_verbref(args[1]))))
  103528. player:notify(tostr("Usage:  ", verb, " <object>:<verb>"));
  103529. elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1]))
  103530. "...bogus object...";
  103531. elseif (typeof(argspec = $code_utils:parse_argspec(@listdelete(args, 1))) != LIST)
  103532. player:notify(tostr(argspec));
  103533. elseif (argspec[2])
  103534. player:notify($string_utils:from_list(argspec[2], " ") + "??");
  103535. elseif (length(argspec = argspec[1]) in {1, 2})
  103536. player:notify({"Missing preposition", "Missing iobj specification"}[length(argspec)]);
  103537. else
  103538. verbname = spec[2];
  103539. if (index(verbname, "*") > 1)
  103540. verbname = strsub(verbname, "*", "");
  103541. endif
  103542. if ((loc = $code_utils:tonum(verbname)) == E_TYPE)
  103543. loc = $code_utils:find_last_verb_named(object, verbname);
  103544. if (argspec)
  103545. argspec[2] = ($code_utils:full_prep(argspec[2]) || argspec[2]);
  103546. while ((loc >= 0) && (verb_args(object, tostr(loc)) != argspec))
  103547. loc = $code_utils:find_last_verb_named(object, verbname, loc);
  103548. endwhile
  103549. endif
  103550. if (loc < 0)
  103551. player:notify(tostr("That object does not define that verb", argspec ? " with those args." | "."));
  103552. return;
  103553. endif
  103554. endif
  103555. info = verb_info(object, tostr(loc));
  103556. vargs = verb_args(object, tostr(loc));
  103557. result = delete_verb(object, tostr(loc));
  103558. if (result == E_VERBNF)
  103559. player:notify("That object does not define that verb.");
  103560. elseif (typeof(result) == ERR)
  103561. player:notify(tostr(result));
  103562. elseif (info)
  103563. player:notify(tostr("Verb ", object, ":", info[3], " (", loc, ") {", $string_utils:from_list(vargs, " "), "} removed."));
  103564. else
  103565. player:notify(tostr("Unreadable verb ", object, ":", loc, " removed."));
  103566. endif
  103567. endif
  103568. .
  103569. #59:7
  103570. set_task_perms(player);
  103571. pflag = 0;
  103572. nflag = 1;
  103573. argspec = {};
  103574. spec = (args ? $code_utils:parse_verbref(args[1]) | E_INVARG);
  103575. args = (spec ? listdelete(args, 1) | E_INVARG);
  103576. while (args)
  103577. if (args[1] && ((index("without", args[1]) == 1) || (args[1] == "wo")))
  103578. "...w,wi,wit,with => 1; wo,witho,withou,without => 0...";
  103579. fval = (!index(args[1], "o"));
  103580. if (index("parentheses", args[2]) == 1)
  103581. pflag = fval;
  103582. args = args[3..length(args)];
  103583. elseif (index("numbers", args[2]) == 1)
  103584. nflag = fval;
  103585. args = args[3..length(args)];
  103586. else
  103587. player:notify(tostr(args[1], " WHAT?"));
  103588. args = E_INVARG;
  103589. endif
  103590. elseif (argspec)
  103591. "... second argspec?  Not likely ...";
  103592. player:notify(tostr(args[1], " unexpected."));
  103593. args = E_INVARG;
  103594. elseif (typeof(pas = $code_utils:parse_argspec(@args)) == LIST)
  103595. argspec = pas[1];
  103596. argspec[2] = ($code_utils:full_prep(argspec[2]) || argspec[2]);
  103597. args = pas[2];
  103598. else
  103599. "... argspec is bogus ...";
  103600. player:notify(tostr(pas));
  103601. args = E_INVARG;
  103602. endif
  103603. endwhile
  103604. if (args == E_INVARG)
  103605. player:notify(tostr("Usage:  ", verb, " <object>:<verb> [<dobj> <prep> <iobj>] [with|without parentheses|numbers]"));
  103606. return;
  103607. elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1]))
  103608. return;
  103609. endif
  103610. what = object;
  103611. if (argspec)
  103612. vnum = $code_utils:find_verb_named(what, spec[2], 0);
  103613. while ((vnum < 0) ? valid(what = parent(what)) | (verb_args(what, vname = tostr(vnum)) != argspec))
  103614. vnum = $code_utils:find_verb_named(what, spec[2], vnum + 1);
  103615. endwhile
  103616. code = ((vnum < 0) ? E_VERBNF | verb_code(what, vname, pflag));
  103617. else
  103618. vname = spec[2];
  103619. while (valid(what) && ((code = verb_code(what, vname, pflag)) == E_VERBNF))
  103620. what = parent(what);
  103621. endwhile
  103622. endif
  103623. if (code == E_VERBNF)
  103624. player:notify(tostr("That object does not define that verb", argspec ? " with those args." | "."));
  103625. elseif (typeof(code) == ERR)
  103626. player:notify(tostr(code));
  103627. elseif (code == {})
  103628. player:notify("That verb has not been programmed.");
  103629. else
  103630. if (what != object)
  103631. player:notify(tostr("Object ", object, " does not define that verb", argspec ? " with those args" | "", ", but its ancestor ", what, " does."));
  103632. endif
  103633. info = verb_info(what, vname);
  103634. vargs = verb_args(what, vname);
  103635. if (index(vargs[2], "/"))
  103636. vargs[2] = tostr("(", vargs[2], ")");
  103637. endif
  103638. player:notify(tostr(what, ":", $string_utils:print(info[3]), "   ", $string_utils:from_list(vargs, " ")));
  103639. for i in [1..length(code)]
  103640. if (nflag)
  103641. player:notify(tostr(" "[1..i < 10], i, ":  ", code[i]));
  103642. else
  103643. player:notify(code[i]);
  103644. endif
  103645. $command_utils:suspend_if_needed(0);
  103646. endfor
  103647. endif
  103648. .
  103649. #59:8
  103650. set_task_perms(player);
  103651. if (!dobjstr)
  103652. tasks = queued_tasks();
  103653. elseif ($command_utils:player_match_result(dobj = $string_utils:match_player(dobjstr), dobjstr)[1])
  103654. return;
  103655. elseif (typeof(tasks = $wiz_utils:queued_tasks(dobj)) != LIST)
  103656. player:notify(tostr(verb, " ", dobj.name, "(", dobj, "):  ", tasks));
  103657. return;
  103658. endif
  103659. if (tasks)
  103660. su = $string_utils;
  103661. player:notify("Queue ID    Start Time            Owner         Verb (Line) [This]");
  103662. player:notify("--------    ----------            -----         ------------------");
  103663. now = time();
  103664. for task in (tasks)
  103665. q_id = task[1];
  103666. start = task[2];
  103667. time = ((start >= now) ? ctime(start)[5..24] | su:left((start == -1) ? "Reading input ..." | tostr(now - start, " seconds ago..."), 20));
  103668. owner = task[5];
  103669. owner_name = (valid(owner) ? owner.name | tostr("Dead ", owner));
  103670. vloc = task[6];
  103671. vname = task[7];
  103672. lineno = task[8];
  103673. this = task[9];
  103674. player:notify(tostr(su:left(tostr(q_id), 10), "  ", time, "  ", su:left(owner_name, 12), "  ", vloc, ":", vname, " (", lineno, ")", (this != vloc) ? tostr(" [", this, "]") | ""));
  103675. endfor
  103676. else
  103677. player:notify("No tasks.");
  103678. endif
  103679. .
  103680. #59:9
  103681. "Kills one or more tasks.";
  103682. "Arguments:";
  103683. "   object:verb -- kills all tasks which were started from that object and verb.";
  103684. "   all -- kills all tasks owned by invoker";
  103685. "   all player-name -- wizard variant:  kills all tasks owned by player.";
  103686. "   all everyone -- wizard variant:  really kills all tasks.";
  103687. "   Integer taskid -- kills the specifically named task.";
  103688. "   soon [integer] -- kills all tasks scheduled to run in the next [integer] seconds, which defaults to 60.";
  103689. "   %integer -- kills all tasks which end in the digits contained in integer.";
  103690. set_task_perms(player);
  103691. if (length(args) == 0)
  103692. player:notify_lines({tostr("Usage:  ", verb, " [object]:[verb]"), tostr("        ", verb, " task_id"), tostr("        ", verb, " soon [number-of-seconds]", player.wizard ? " [everyone|<player name>]" | ""), tostr("        ", verb, " all", player.wizard ? " [everyone|<player name>]" | "")});
  103693. return;
  103694. elseif (taskid = tonum(args[1]))
  103695. elseif (all = (args[1] == "all"))
  103696. everyone = 0;
  103697. realplayer = player;
  103698. if (player.wizard && (length(args) > 1))
  103699. realplayer = $string_utils:match_player(args[2]);
  103700. everyone = (args[2] == "everyone");
  103701. if ((!valid(realplayer)) && (!everyone))
  103702. $command_utils:player_match_result(realplayer, args[2]);
  103703. return;
  103704. elseif (!everyone)
  103705. set_task_perms(realplayer);
  103706. endif
  103707. endif
  103708. elseif (soon = (args[1] == "soon"))
  103709. realplayer = player;
  103710. if (length(args) > 1)
  103711. soon = tonum(args[2]);
  103712. if ((soon <= 0) && (!player.wizard))
  103713. player:notify(tostr("Usage:  ", verb, " soon [positive-number-of-seconds]"));
  103714. return;
  103715. elseif (player.wizard)
  103716. result = this:kill_aux_wizard_parse(@args[2..length(args)]);
  103717. soon = result[1];
  103718. if (result[1] < 0)
  103719. "already gave them an error message";
  103720. return;
  103721. elseif (result[2] == 1)
  103722. everyone = 1;
  103723. else
  103724. everyone = 0;
  103725. set_task_perms(result[2]);
  103726. realplayer = result[2];
  103727. endif
  103728. endif
  103729. else
  103730. soon = 60;
  103731. everyone = 0;
  103732. endif
  103733. elseif (percent = (args[1][1] == "%"))
  103734. l = length(args[1]);
  103735. digits = tonum(args[1][2..l]);
  103736. percent = tonum("1" + "0000000000"[1..l - 1]);
  103737. elseif (colon = index(argstr, ":"))
  103738. whatstr = argstr[1..colon - 1];
  103739. vrb = argstr[colon + 1..length(argstr)];
  103740. if (whatstr)
  103741. what = player:my_match_object(whatstr);
  103742. endif
  103743. else
  103744. player:notify_lines({tostr("Usage:  ", verb, " [object]:[verb]"), tostr("        ", verb, " task_id"), tostr("        ", verb, " soon [number-of-seconds]", player.wizard ? " [everyone|<player name>]" | ""), tostr("        ", verb, " all", player.wizard ? " [\"everyone\"|<player name>]" | "")});
  103745. return;
  103746. endif
  103747. "OK, parsed the line, and punted them if it was bogus.  This verb could have been a bit shorter at the expense of readability.  I think it's getting towards unreadable as is.  At this point we've set_task_perms'd, and set up an enormous number of local variables.  Evaluate them in the order we set them, and we should never get var not found.";
  103748. queued_tasks = queued_tasks();
  103749. killed = 0;
  103750. if (taskid)
  103751. returnval = kill_task(taskid);
  103752. if (typeof(returnval) == ERR)
  103753. player:notify(tostr("Invalid task ID ", taskid, "."));
  103754. else
  103755. player:notify(tostr("Killed task ", taskid, "."));
  103756. killed = 1;
  103757. endif
  103758. elseif (all)
  103759. for task in (queued_tasks)
  103760. if (everyone || (realplayer == task[5]))
  103761. kill_task(task[1]);
  103762. killed = 1;
  103763. this:_kill_task_message(task);
  103764. endif
  103765. endfor
  103766. elseif (soon)
  103767. now = time();
  103768. for task in (queued_tasks)
  103769. if (((task[2] - now) < soon) && ((!player.wizard) || (everyone || (realplayer == task[5]))))
  103770. kill_task(task[1]);
  103771. killed = 1;
  103772. this:_kill_task_message(task);
  103773. endif
  103774. endfor
  103775. elseif (percent)
  103776. for task in (queued_tasks)
  103777. if (digits == (task[1] % percent))
  103778. kill_task(task[1]);
  103779. killed = 1;
  103780. this:_kill_task_message(task);
  103781. endif
  103782. endfor
  103783. elseif ((colon || vrb) || whatstr)
  103784. for task in (queued_tasks)
  103785. if ((((((whatstr == "") || (valid(task[6]) && (index(task[6].name, whatstr) == 1))) || (valid(task[9]) && (index(task[9].name, whatstr) == 1))) || (task[9] == what)) || (task[6] == what)) && ((vrb == "") || (index(" " + strsub(task[7], "*", ""), " " + vrb) == 1)))
  103786. this:_kill_task_message(task);
  103787. kill_task(task[1]);
  103788. killed = 1;
  103789. endif
  103790. endfor
  103791. else
  103792. player:notify("Something is funny; I didn't understand your @kill command.  You shouldn't have gotten here.  Please send yduJ mail saying you got this message from @kill, and what you had typed to @kill.");
  103793. endif
  103794. if (!killed)
  103795. player:notify("No tasks killed.");
  103796. endif
  103797. .
  103798. #59:10
  103799. if (!player.programmer)
  103800. player:notify("You need to be a programmer to do this.");
  103801. player:notify("If you want to become a programmer, talk to a wizard.");
  103802. return;
  103803. endif
  103804. $verb_editor:invoke(argstr, verb);
  103805. .
  103806. #59:11
  103807. "Usage:  @copy source:verbname to target[:verbname]";
  103808. "  the target verbname, if not given, defaults to that of the source.  If the target verb doesn't already exist, a new verb is installed with the same args, names, code, and permission flags as the source.  Otherwise, the existing target's verb code is overwritten and no other changes are made.";
  103809. "This the poor man's version of multiple inheritance... the main problem is that someone may update the verb you're copying and you'd never know.";
  103810. set_task_perms(player);
  103811. if (!player.programmer)
  103812. player:notify("You need to be a programmer to do this.");
  103813. player:notify("If you want to become a programmer, talk to a wizard.");
  103814. return;
  103815. endif
  103816. if ((!(from = $code_utils:parse_verbref(dobjstr))) || (!iobjstr))
  103817. player:notify(tostr("Usage:  ", verb, " obj:verb to obj:verb"));
  103818. player:notify(tostr("        ", verb, " obj:verb to obj"));
  103819. player:notify(tostr("        ", verb, " obj:verb to :verb"));
  103820. return;
  103821. elseif ($command_utils:object_match_failed(fobj = player:my_match_object(from[1]), from[1]))
  103822. return;
  103823. elseif (iobjstr[1] == ":")
  103824. to = {fobj, iobjstr[2..length(iobjstr)]};
  103825. elseif (!(to = $code_utils:parse_verbref(iobjstr)))
  103826. iobj = player:my_match_object(iobjstr);
  103827. if ($command_utils:object_match_failed(iobj, iobjstr))
  103828. return;
  103829. endif
  103830. to = {iobj, from[2]};
  103831. elseif ($command_utils:object_match_failed(tobj = player:my_match_object(to[1]), to[1]))
  103832. return;
  103833. else
  103834. to[1] = tobj;
  103835. endif
  103836. from[1] = fobj;
  103837. to_firstname = (strsub(to[2][1..index(to[2] + " ", " ") - 1], "*", "") || "*");
  103838. if ((!(hv = $object_utils:has_verb(to[1], to_firstname))) || (hv[1] != to[1]))
  103839. if ((!(info = verb_info(@from))) || (!(vargs = verb_args(@from))))
  103840. player:notify(tostr("Retrieving ", from[1], ":", from[2], " --> ", info && vargs));
  103841. return;
  103842. endif
  103843. if (!player.wizard)
  103844. info[1] = player;
  103845. endif
  103846. if (verb == "@copy-x")
  103847. "... make sure this is an unusable copy...";
  103848. info[2] = strsub(info[2], "x", "");
  103849. vargs = {"this", "none", "this"};
  103850. endif
  103851. if (from[2] != to[2])
  103852. info[3] = to[2];
  103853. endif
  103854. if (ERR == typeof(e = add_verb(to[1], info, vargs)))
  103855. player:notify(tostr("Adding ", to[1], ":", to[2], " --> ", e));
  103856. return;
  103857. endif
  103858. endif
  103859. code = verb_code(@from);
  103860. owner = verb_info(@from)[1];
  103861. if (owner != player)
  103862. code = {tostr("\"Copied from ", from[1].name, " (", from[1], "):", from[2], (from[1] == owner) ? " " | tostr(" by ", owner.name, " (", owner, ") "), ctime(), "\";"), @code};
  103863. endif
  103864. if (ERR == typeof(e = set_verb_code(to[1], to_firstname, code)))
  103865. player:notify(tostr("Copying ", from[1], ":", from[2], " to ", to[1], ":", to[2], " --> ", e));
  103866. else
  103867. player:notify(tostr(to[1], ":", to[2], " code set."));
  103868. endif
  103869. .
  103870. #59:12
  103871. set_task_perms(caller_perms());
  103872. task = args[1];
  103873. player:notify(tostr("Killed: ", $string_utils:right(tostr("task ", task[1]), 17), ", verb ", task[6], ":", task[7], ", line ", task[8], (task[9] != task[6]) ? ", this==" + tostr(task[9]) | ""));
  103874. .
  103875. #59:13
  103876. "This version of @program deals with multiple verbs having the same name.";
  103877. "... @program <object>:<verbname> <dobj> <prep> <iobj>  picks the right one.";
  103878. if (player != caller)
  103879. return;
  103880. endif
  103881. set_task_perms(player);
  103882. "...";
  103883. "...catch usage errors first...";
  103884. "...";
  103885. punt = "...set punt to 0 only if everything works out...";
  103886. if (!(args && (spec = $code_utils:parse_verbref(args[1]))))
  103887. player:notify(tostr("Usage: ", verb, " <object>:<verb> [<dobj> <prep> <iobj>]"));
  103888. elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1]))
  103889. "...bogus object...";
  103890. elseif (typeof(argspec = $code_utils:parse_argspec(@listdelete(args, 1))) != LIST)
  103891. player:notify(tostr(argspec));
  103892. elseif (argspec[2])
  103893. player:notify($string_utils:from_list(argspec[2], " ") + "??");
  103894. elseif (length(argspec = argspec[1]) in {1, 2})
  103895. player:notify({"Missing preposition", "Missing iobj specification"}[length(argspec)]);
  103896. else
  103897. punt = 0;
  103898. verbname = spec[2];
  103899. if (index(verbname, "*") > 1)
  103900. verbname = strsub(verbname, "*", "");
  103901. endif
  103902. endif
  103903. "...";
  103904. "...if we have an argspec, we'll need to reset verbname...";
  103905. "...";
  103906. if (punt)
  103907. elseif (argspec)
  103908. if (!(argspec[2] in {"none", "any"}))
  103909. argspec[2] = $code_utils:full_prep(argspec[2]);
  103910. endif
  103911. loc = $code_utils:find_verb_named(object, verbname);
  103912. while ((loc >= 0) && (verb_args(object, tostr(loc)) != argspec))
  103913. loc = $code_utils:find_verb_named(object, verbname, loc + 1);
  103914. endwhile
  103915. if (loc < 0)
  103916. punt = "...can't find it....";
  103917. player:notify("That object has no verb matching that name + args.");
  103918. else
  103919. verbname = tostr(loc);
  103920. endif
  103921. else
  103922. loc = -1;
  103923. endif
  103924. "...";
  103925. "...get verb info...";
  103926. "...";
  103927. if (punt || (!(punt = "...reset punt to TRUE...")))
  103928. elseif ((info = verb_info(object, verbname)) == E_VERBNF)
  103929. player:notify("That object does not have that verb definition.");
  103930. elseif (typeof(info) == ERR)
  103931. player:notify(tostr(info));
  103932. else
  103933. punt = 0;
  103934. aliases = info[3];
  103935. if (loc < 0)
  103936. loc = ((aliases in (verbs(object) || {})) - 1);
  103937. endif
  103938. endif
  103939. "...";
  103940. "...read the code...";
  103941. "...";
  103942. if (punt)
  103943. player:notify(tostr("Now ignoring code for ", args ? args[1] | "nothing in particular", "."));
  103944. $command_utils:read_lines();
  103945. player:notify("Verb code ignored.");
  103946. else
  103947. player:notify(tostr("Now programming ", object.name, ":", aliases, "(", (loc < 0) ? "??" | loc, ")."));
  103948. lines = $command_utils:read_lines();
  103949. if (result = set_verb_code(object, verbname, lines))
  103950. player:notify_lines(result);
  103951. player:notify(tostr(length(result), " error(s)."));
  103952. player:notify("Verb not programmed.");
  103953. elseif (typeof(result) == ERR)
  103954. player:notify(tostr(result));
  103955. player:notify("Verb not programmed.");
  103956. else
  103957. player:notify("0 errors.");
  103958. player:notify("Verb programmed.");
  103959. endif
  103960. endif
  103961. .
  103962. #59:14
  103963. "Usage: @setenv <environment string>";
  103964. "Set your .eval_env property.  Most useful when eval won't work to set it";
  103965. "because your .eval_env contains an error.";
  103966. set_task_perms(player);
  103967. if (!argstr)
  103968. player:notify(tostr("Usage:  ", verb, " <environment string>"));
  103969. return;
  103970. endif
  103971. player:notify(tostr("Current eval environment is: ", player.eval_env));
  103972. result = player:set_eval_env(argstr);
  103973. if (typeof(result) == ERR)
  103974. player:notify(tostr(result));
  103975. return;
  103976. endif
  103977. player:notify(tostr(".eval_env set to \"", player.eval_env, "\" (", player.eval_ticks, " ticks)."));
  103978. .
  103979. #59:15
  103980. set_task_perms((caller_perms() == $nothing) ? player | caller_perms());
  103981. dobj = $string_utils:match_player(dobjstr);
  103982. if (!dobjstr)
  103983. player:notify(tostr("Usage: ", verb, " <player> [from <start>] [to <end>]"));
  103984. return;
  103985. elseif ($command_utils:player_match_result(dobj, dobjstr)[1])
  103986. return;
  103987. endif
  103988. dobjwords = $string_utils:words(dobjstr);
  103989. if (args[1..length(dobjwords)] == dobjwords)
  103990. args = args[length(dobjwords) + 1..length(args)];
  103991. endif
  103992. if (!(parse_result = $code_utils:_parse_audit_args(@args)))
  103993. player:notify(tostr("Usage:  ", verb, " player [from <start>] [to <end>]"));
  103994. return;
  103995. endif
  103996. start = parse_result[1];
  103997. end = parse_result[2];
  103998. player:notify(tostr("Objects owned by ", valid(dobj) ? dobj.name | dobj, ((" (from #" + tostr(start)) + " to #") + tostr(end), ")", ":"));
  103999. count = 0;
  104000. printed_anything = 0;
  104001. for o in (dobj.owned_objects)
  104002. $command_utils:suspend_if_needed(3);
  104003. if (valid(o) && ((tonum(o) >= start) && (tonum(o) <= end)))
  104004. player:notify(this:object_audit_string(o, 1));
  104005. count = (count + 1);
  104006. printed_anything = 1;
  104007. endif
  104008. endfor
  104009. player:notify($string_utils:left(tostr("-- ", count, " object", (count == 1) ? "." | "s."), 79, "-"));
  104010. .
  104011. #59:16
  104012. "@display <object>[.[property]]*[,[inherited_property]]*[:[verb]]*[;[inherited_verb]]*";
  104013. "null names for properties and verbs are interpreted as meaning all of them.";
  104014. opivu = {{}, {}, {}, {}, {}};
  104015. string = "";
  104016. punc = 1;
  104017. literal = 0;
  104018. for jj in [1..length(argstr)]
  104019. j = argstr[jj];
  104020. if (literal)
  104021. string = (string + j);
  104022. literal = 0;
  104023. elseif (j == "\\")
  104024. literal = 1;
  104025. elseif (y = index(".,:;", j))
  104026. opivu[punc] = {@opivu[punc], string};
  104027. punc = (1 + y);
  104028. string = "";
  104029. else
  104030. string = (string + j);
  104031. endif
  104032. endfor
  104033. opivu[punc] = {@opivu[punc], string};
  104034. objname = opivu[1][1];
  104035. it = this:my_match_object(objname);
  104036. if ($command_utils:object_match_failed(it, objname))
  104037. return;
  104038. endif
  104039. readable = ((it.owner == this) || (it.r || this.wizard));
  104040. cant = {};
  104041. if ("" in opivu[2])
  104042. if (readable)
  104043. prop = properties(it);
  104044. else
  104045. prop = {};
  104046. cant = setadd(cant, it);
  104047. endif
  104048. if (!this:display_option("thisonly"))
  104049. what = it;
  104050. while ((!prop) && valid(what = parent(what)))
  104051. if ((what.owner == this) || (what.r || this.wizard))
  104052. prop = properties(what);
  104053. else
  104054. cant = setadd(cant, what);
  104055. endif
  104056. endwhile
  104057. endif
  104058. else
  104059. prop = opivu[2];
  104060. endif
  104061. if ("" in opivu[3])
  104062. inh = {};
  104063. for what in ({it, @$object_utils:ancestors(it)})
  104064. if (((what.owner == this) || what.r) || this.wizard)
  104065. inh = {@inh, @properties(what)};
  104066. else
  104067. cant = setadd(cant, what);
  104068. endif
  104069. endfor
  104070. else
  104071. inh = opivu[3];
  104072. endif
  104073. for q in (inh)
  104074. if (q in properties(it))
  104075. prop = setadd(prop, q);
  104076. inh = setremove(inh, q);
  104077. endif
  104078. endfor
  104079. vrb = {};
  104080. if ("" in opivu[4])
  104081. if (readable)
  104082. vrbs = verbs(it);
  104083. else
  104084. vrbs = {};
  104085. cant = setadd(cant, it);
  104086. endif
  104087. what = it;
  104088. if (!this:display_option("thisonly"))
  104089. while ((!vrbs) && valid(what = parent(what)))
  104090. if ((what.owner == this) || (what.r || this.wizard))
  104091. vrbs = verbs(what);
  104092. else
  104093. cant = setadd(cant, what);
  104094. endif
  104095. endwhile
  104096. endif
  104097. for n in [0..length(vrbs) - 1]
  104098. vrb = setadd(vrb, {what, tostr(n)});
  104099. endfor
  104100. else
  104101. for w in (opivu[4])
  104102. if (y = $object_utils:has_verb(it, w))
  104103. vrb = setadd(vrb, {y[1], w});
  104104. else
  104105. this:notify(tostr("No such verb, \"", w, "\""));
  104106. endif
  104107. endfor
  104108. endif
  104109. if ("" in opivu[5])
  104110. for z in ({it, @$object_utils:ancestors(it)})
  104111. if (((this == z.owner) || z.r) || this.wizard)
  104112. for n in [0..length(verbs(z)) - 1]
  104113. vrb = setadd(vrb, {z, tostr(n)});
  104114. endfor
  104115. else
  104116. cant = setadd(cant, z);
  104117. endif
  104118. endfor
  104119. else
  104120. for w in (opivu[5])
  104121. if (typeof(y = $object_utils:has_verb(it, w)) == LIST)
  104122. vrb = setadd(vrb, {y[1], w});
  104123. else
  104124. this:notify(tostr("No such verb, \"", w, "\""));
  104125. endif
  104126. endfor
  104127. endif
  104128. if (({""} in opivu) || (opivu[2..5] == {{}, {}, {}, {}}))
  104129. this:notify(tostr(it.name, " (", it, ") [ ", it.r ? "readable " | "", it.w ? "writeable " | "", it.f ? "fertile " | "", is_player(it) ? "(player) " | "", it.programmer ? "programmer " | "", it.wizard ? "wizard " | "", "]"));
  104130. if (it.owner != (is_player(it) ? it | this))
  104131. this:notify(tostr("  Owned by ", valid(p = it.owner) ? p.name | "** extinct **", " (", p, ")."));
  104132. endif
  104133. this:notify(tostr("  Child of ", valid(p = parent(it)) ? p.name | "** none **", " (", p, ")."));
  104134. if (it.location != $nothing)
  104135. this:notify(tostr("  Location ", valid(p = it.location) ? p.name | "** unplace (tell a wizard, fast!) **", " (", p, ")."));
  104136. endif
  104137. endif
  104138. set_task_perms(this.owner);
  104139. blankargs = (this:display_option("blank_tnt") ? {"this", "none", "this"} | #-1);
  104140. for b in (vrb)
  104141. $command_utils:suspend_if_needed(0);
  104142. where = b[1];
  104143. q = b[2];
  104144. short = strsub(y = (index(q, " ") ? q[1..y - 1] | q), "*", "");
  104145. inf = verb_info(where, short);
  104146. if ((typeof(inf) == LIST) || (inf == E_PERM))
  104147. name = ((typeof(inf) == LIST) ? inf[3] | q);
  104148. name = (index(name, " ") ? ("\"" + name) + "\"" | name);
  104149. line = $string_utils:left(tostr($string_utils:right(tostr(where), 6), ":", name, " "), 32);
  104150. if (inf == E_PERM)
  104151. line = (line + "   ** unreadable **");
  104152. else
  104153. line = ($string_utils:left(tostr(line, inf[1].name, " (", inf[1], ") "), 53) + ((i = (inf[2] in {"x", "xd", "d", "rd"})) ? {" x", " xd", "  d", "r d"}[i] | inf[2]));
  104154. vargs = verb_args(where, short);
  104155. if (vargs != blankargs)
  104156. if (this:display_option("shortprep") && (!(vargs[2] in {"any", "none"})))
  104157. vargs[2] = $code_utils:short_prep(vargs[2]);
  104158. endif
  104159. line = ($string_utils:left(line + " ", 60) + $string_utils:from_list(vargs, " "));
  104160. endif
  104161. endif
  104162. this:notify(line);
  104163. elseif (inf == E_VERBNF)
  104164. this:notify(tostr(inf));
  104165. this:notify(tostr("  ** no such verb, \"", short, "\" **"));
  104166. else
  104167. this:notify("This shouldn't ever happen. @display is buggy.");
  104168. endif
  104169. endfor
  104170. all = {@prop, @inh};
  104171. max = ((length(all) < 4) ? 999 | (this:linelen() - 56));
  104172. depth = ((length(all) < 4) ? -1 | 1);
  104173. truncate_owner_names = (length(all) > 1);
  104174. for q in (all)
  104175. $command_utils:suspend_if_needed(0);
  104176. inf = property_info(it, q);
  104177. if (inf == E_PROPNF)
  104178. if (q in $code_utils.builtin_props)
  104179. this:notify(tostr($string_utils:left("," + q, 25), "Built in property            ", (length(y = $string_utils:from_value(it.(q), 1, depth)) > max) ? y[1..max] + ".." | y));
  104180. else
  104181. this:notify(tostr("  ** property not found, \"", q, "\" **"));
  104182. endif
  104183. else
  104184. pname = $string_utils:left(tostr((q in properties(it)) ? "." | (is_clear_property(it, q) ? " " | ","), q, " "), 25);
  104185. if (inf == E_PERM)
  104186. this:notify(pname + "   ** unreadable **");
  104187. else
  104188. oname = inf[1].name;
  104189. truncate_owner_names && ((length(oname) > 12) && (oname = oname[1..12]));
  104190. (inf[2][1] != "r") && (inf[2][1..0] = " ");
  104191. (inf[2][2] != "w") && (inf[2][2..1] = " ");
  104192. this:notify($string_utils:left(tostr($string_utils:left(tostr(pname, oname, " (", inf[1], ") "), 47), inf[2], " "), 54) + ((length(y = $string_utils:from_value(it.(q), 1, depth)) > max) ? y[1..max] + ".." | y));
  104193. endif
  104194. endif
  104195. endfor
  104196. if (cant)
  104197. failed = {};
  104198. for k in (cant)
  104199. failed = listappend(failed, tostr(k.name, " (", k, ")"));
  104200. endfor
  104201. this:notify($string_utils:centre(tostr(" no permission to read ", $string_utils:english_list(failed, ", ", " or ", " or "), ". "), 75, "-"));
  104202. else
  104203. this:notify($string_utils:centre(" finished ", 75, "-"));
  104204. endif
  104205. .
  104206. #59:17
  104207. set_task_perms(player);
  104208. "Let 'em @kill it.";
  104209. count = 0;
  104210. for i in [0..tonum(max_object())]
  104211. if ($command_utils:running_out_of_time())
  104212. player:notify(tostr("Counting... [", count, "/", i - 1, "]"));
  104213. suspend(0);
  104214. endif
  104215. if (valid(toobj(i)))
  104216. count = (count + 1);
  104217. endif
  104218. endfor
  104219. player:notify(tostr("There are ", count, " valid objects out of ", tonum(max_object()) + 1, " allocated object numbers."));
  104220. .
  104221. #59:18
  104222. "@gethelp [<topic>] [from <db or dblist>]";
  104223. "  Prints the raw text of topic from the appropriate help db.";
  104224. "  With no argument, gets the blank (\"\") topic from wherever it lives";
  104225. "  Text is printed as a script for changing this help topic ";
  104226. "  (somewhat like @dump...)";
  104227. if (!prepstr)
  104228. topic = argstr;
  104229. dblist = $code_utils:help_db_list();
  104230. elseif (prepstr != "from")
  104231. player:notify("Usage:  ", verb, " [<topic>] [from <db>]");
  104232. return;
  104233. elseif (!(e = $no_one:eval_d(iobjstr = argstr[$string_utils:word_start(argstr)[(prepstr in args) + 1][1]..length(argstr)])))
  104234. player:notify(tostr(e));
  104235. return;
  104236. elseif (!e[1])
  104237. player:notify_lines(e[2]);
  104238. return;
  104239. elseif (!(typeof(dblist = e[2]) in {OBJ, LIST}))
  104240. player:notify(tostr(iobjstr, " => ", dblist, " -- not an object or a list"));
  104241. return;
  104242. else
  104243. topic = dobjstr;
  104244. if (typeof(dblist) == OBJ)
  104245. dblist = {dblist};
  104246. endif
  104247. endif
  104248. search = $code_utils:help_db_search(topic, dblist);
  104249. if (!search)
  104250. player:notify("Topic not found.");
  104251. elseif (search[1] == $ambiguous_match)
  104252. player:notify(tostr("Topic `", topic, "' ambiguous:  ", $string_utils:english_list(search[2], "none", " or ")));
  104253. elseif (typeof(text = (db = search[1]):dump_topic(fulltopic = search[2])) == ERR)
  104254. "...ok...shoot me.  This is a -d verb...";
  104255. player:notify(tostr("Cannot retrieve `", fulltopic, "' on ", $code_utils:corify_object(db), ":  ", text));
  104256. else
  104257. player:notify_lines(text);
  104258. endif
  104259. .
  104260. #59:19
  104261. set_task_perms((caller_perms() == $nothing) ? player | caller_perms());
  104262. dobj = $string_utils:match_player(dobjstr);
  104263. if (!dobjstr)
  104264. player:notify(tostr("Usage: ", verb, " <player> [from <start>] [to <end>]"));
  104265. return;
  104266. elseif ($command_utils:player_match_result(dobj, dobjstr)[1])
  104267. return;
  104268. endif
  104269. dobjwords = $string_utils:words(dobjstr);
  104270. if (args[1..length(dobjwords)] == dobjwords)
  104271. args = args[length(dobjwords) + 1..length(args)];
  104272. endif
  104273. if (!(parse_result = $code_utils:_parse_audit_args(@args)))
  104274. player:notify(tostr("Usage:  ", verb, " player [from <start>] [to <end>]"));
  104275. return;
  104276. endif
  104277. start = parse_result[1];
  104278. end = parse_result[2];
  104279. player:notify(tostr("Objects owned by ", valid(dobj) ? dobj.name | dobj, ((" (from #" + tostr(start)) + " to #") + tostr(end), ")", ":"));
  104280. count = 0;
  104281. printed_anything = 0;
  104282. for i in [start..end]
  104283. o = toobj(i);
  104284. if ($command_utils:running_out_of_time())
  104285. if (!printed_anything)
  104286. player:notify(tostr(o, " ..."));
  104287. endif
  104288. suspend(3);
  104289. endif
  104290. if (valid(o) && (o.owner == dobj))
  104291. kids = 0;
  104292. for k in (children(o))
  104293. if (k.owner != o.owner)
  104294. kids = 2;
  104295. elseif (kids == 0)
  104296. kids = 1;
  104297. endif
  104298. endfor
  104299. if (is_player(o))
  104300. c = "P";
  104301. elseif ($object_utils:isa(o, $player))
  104302. c = "p";
  104303. elseif ($object_utils:isa(o, $room))
  104304. c = "R";
  104305. elseif ($object_utils:isa(o, $exit))
  104306. c = "E";
  104307. elseif ($object_utils:isa(o, $note))
  104308. c = "N";
  104309. elseif ($object_utils:isa(o, $container))
  104310. c = "C";
  104311. elseif ($object_utils:isa(o, $thing))
  104312. c = "T";
  104313. else
  104314. c = " ";
  104315. endif
  104316. "The verbs() call below might fail, but that's OK";
  104317. v = verbs(o);
  104318. if (v)
  104319. vstr = tostr("[", $string_utils:right(length(v), 3), "] ");
  104320. else
  104321. vstr = "      ";
  104322. endif
  104323. if (o.r && o.f)
  104324. r = "f";
  104325. elseif (o.r)
  104326. r = "r";
  104327. elseif (o.f)
  104328. r = "F";
  104329. else
  104330. r = " ";
  104331. endif
  104332. player:notify(tostr(" kK"[kids + 1], r, c, vstr, o.name, " (", o, ")"));
  104333. count = (count + 1);
  104334. printed_anything = 1;
  104335. endif
  104336. endfor
  104337. if (count)
  104338. player:notify("");
  104339. endif
  104340. player:notify(tostr("Total: ", count, " object", (count == 1) ? "." | "s."));
  104341. .
  104342. #59:20
  104343. set_task_perms(player);
  104344. if (prepstr == "in")
  104345. pattern = dobjstr;
  104346. objlist = player:eval_cmd_string(iobjstr, 0);
  104347. if (!objlist[1])
  104348. player:notify(tostr("Had trouble reading `", iobjstr, "':  "));
  104349. player:notify_lines(@objlist[2]);
  104350. return;
  104351. elseif (typeof(objlist[2]) == OBJ)
  104352. objlist = {objlist[2..2]};
  104353. elseif (typeof(objlist[2]) != LIST)
  104354. player:notify(tostr("Value of `", iobjstr, "' is not an object or list:  ", $string_utils:print(objlist[2])));
  104355. return;
  104356. else
  104357. objlist = objlist[2..2];
  104358. endif
  104359. elseif ((prepstr == "from") && (player.wizard && (n = tonum(toobj(iobjstr)))))
  104360. pattern = dobjstr;
  104361. objlist = {n};
  104362. elseif (args && player.wizard)
  104363. pattern = argstr;
  104364. objlist = {};
  104365. else
  104366. player:notify(tostr("Usage:  ", verb, " <pattern> ", player.wizard ? "[in {<objectlist>} | from <number>]" | "in {<objectlist>}"));
  104367. return;
  104368. endif
  104369. player:notify(tostr("Searching for verbs ", @prepstr ? {prepstr, " ", iobjstr, " "} | {}, (verb == "@egrep") ? "matching the pattern " | "containing the string ", $string_utils:print(pattern), " ..."));
  104370. player:notify("");
  104371. $code_utils:((verb == "@egrep") ? "find_verbs_matching" | "find_verbs_containing")(pattern, @objlist);
  104372. .
  104373. #59:21
  104374. set_task_perms(player);
  104375. if (dobjstr == "")
  104376. player:notify(tostr("Usage:  ", verb, " <object-or-property-or-verb>"));
  104377. return;
  104378. endif
  104379. if (index(dobjstr, ".") && (spec = $code_utils:parse_propref(dobjstr)))
  104380. if (valid(object = player:my_match_object(spec[1])))
  104381. return $code_utils:show_property(object, spec[2]);
  104382. endif
  104383. elseif (spec = $code_utils:parse_verbref(dobjstr))
  104384. if (valid(object = player:my_match_object(spec[1])))
  104385. return $code_utils:show_verbdef(object, spec[2]);
  104386. endif
  104387. elseif (((dobjstr[1] == "$") && ((pname = dobjstr[2..length(dobjstr)]) in properties(#0))) && (typeof(#0.(pname)) == OBJ))
  104388. if (valid(object = #0.(pname)))
  104389. return $code_utils:show_object(object);
  104390. endif
  104391. elseif ((dobjstr[1] == "$") && (spec = $code_utils:parse_propref(dobjstr)))
  104392. return $code_utils:show_property(#0, spec[2]);
  104393. else
  104394. if (valid(object = player:my_match_object(dobjstr)))
  104395. return $code_utils:show_object(object);
  104396. endif
  104397. endif
  104398. $command_utils:object_match_failed(object, dobjstr);
  104399. .
  104400. #59:22
  104401. "@check-prop object.property";
  104402. "  checks for descendents defining the given property.";
  104403. set_task_perms(player);
  104404. if (!(spec = $code_utils:parse_propref(dobjstr)))
  104405. player:notify(tostr("Usage:  ", verb, " <object>.<prop-name>"));
  104406. elseif ($command_utils:object_match_failed(object = player:my_match_object(spec[1]), spec[1]))
  104407. "...bogus object...";
  104408. elseif (!($perm_utils:controls(player, object) || object.w))
  104409. player:notify("You can't create a property on that object anyway.");
  104410. elseif ($object_utils:has_property(object, prop = spec[2]))
  104411. player:notify("That object already has that property.");
  104412. elseif (olist = $object_utils:descendants_with_property_suspended(object, prop))
  104413. player:notify("The following descendents have this property defined:");
  104414. player:notify("  " + $string_utils:from_list(olist, " "));
  104415. else
  104416. player:notify("No property name conflicts found.");
  104417. endif
  104418. .
  104419. #59:23
  104420. "set_eval_env(string);";
  104421. "Run <string> through eval.  If it doesn't compile, return E_INVARG.  If it crashes, well, it crashes.  If it works okay, set .eval_env to it and set .eval_ticks to the amount of time it took.";
  104422. set_task_perms(caller_perms());
  104423. program = args[1];
  104424. value = $code_utils:eval_d(("ticks = ticks_left();" + program) + ";return ticks - ticks_left() - 2;");
  104425. if (!value[1])
  104426. return E_INVARG;
  104427. elseif (typeof(value[2]) == ERR)
  104428. return value[2];
  104429. endif
  104430. ok = (this.eval_env = program);
  104431. this.eval_ticks = value[2];
  104432. if (typeof(ok) == ERR)
  104433. return ok;
  104434. else
  104435. return 1;
  104436. endif
  104437. .
  104438. #59:24
  104439. "@clearproperty <obj>.<prop>";
  104440. "Set the value of <obj>.<prop> to `clear', making it appear to be the same as the property on its parent.";
  104441. set_task_perms(player);
  104442. if (!(l = $code_utils:parse_propref(dobjstr)))
  104443. player:notify(tostr("Usage:  ", verb, " <object>.<property>"));
  104444. elseif ($command_utils:object_match_failed(dobj = player:my_match_object(l[1]), l[1]))
  104445. "... bogus object...";
  104446. elseif (is_clear_property(dobj, prop = l[2]))
  104447. player:notify(tostr("Property ", dobj, ".", prop, " is already clear!"));
  104448. elseif ((result = clear_property(dobj, prop)) == E_INVARG)
  104449. player:notify(tostr("You can't clear ", dobj, ".", prop, "; none of the ancestors define that property."));
  104450. elseif (typeof(result) == ERR)
  104451. player:notify(tostr(result));
  104452. else
  104453. player:notify(tostr("Property ", dobj, ".", prop, " cleared; value is now ", $string_utils:print(dobj.(prop)), "."));
  104454. endif
  104455. .
  104456. #59:25
  104457. "Syntax: @disown <object> [from <object>]";
  104458. "This command is used to remove unwanted children of objects you control. If you control an object, and there is a child of that object you do not want, this command will chparent() the object to its grandparent.";
  104459. if (prepstr)
  104460. if (prepstr != "from")
  104461. player:notify("Usage:  ", verb, " <object> [from <object>]");
  104462. return;
  104463. elseif ($command_utils:object_match_failed(iobj = player:my_match_object(iobjstr), iobjstr))
  104464. "... from WHAT?..";
  104465. return;
  104466. elseif (valid(dobj = $string_utils:literal_object(dobjstr)))
  104467. "... literal object number...";
  104468. if (parent(dobj) != iobj)
  104469. player:notify(tostr(dobj, " is not a child of ", iobj.name, " (", iobj, ")"));
  104470. return;
  104471. endif
  104472. elseif ($command_utils:object_match_failed(dobj = $string_utils:match(dobjstr, children(iobj), "name", children(iobj), "aliases"), dobjstr))
  104473. "... can't match dobjstr against any children of iobj";
  104474. return;
  104475. endif
  104476. elseif ($command_utils:object_match_failed(dobj = player:my_match_object(dobjstr), dobjstr))
  104477. "... can't match dobjstr...";
  104478. return;
  104479. endif
  104480. victim = dobj;
  104481. parent = parent(victim);
  104482. if ($perm_utils:controls(player, victim))
  104483. "... why is he using @disown?... probably by mistake...";
  104484. player:notify(tostr(victim.name, " (", victim, ") is yours.  Use @chparent."));
  104485. elseif (!valid(parent))
  104486. player:notify(tostr(victim.name, " (", victim, ") is already an orphan."));
  104487. elseif (!$perm_utils:controls(player, parent))
  104488. player:notify(tostr(parent.name, " (", parent, "), the parent of ", victim.name, " (", victim, "), is not yours."));
  104489. elseif (!valid(grandparent = parent(parent)))
  104490. "... still not sure about this... do we care?  --Rog...";
  104491. player:notify(tostr(victim.name, " (", victim, ") has no grandparent to take custody."));
  104492. else
  104493. chparent(victim, grandparent);
  104494. player:notify(tostr(victim.name, " (", victim, ")'s parent is now ", grandparent.name, " (", grandparent, ")."));
  104495. endif
  104496. .
  104497. #59:26
  104498. ":eval_cmd_string(string[,debug])";
  104499. "Evaluates the string the way this player would normally expect to see it evaluated if it were typed on the command line.  debug (defaults to 1) indicates how the debug flag should be set during the evaluation.";
  104500. " => {@eval_result, ticks, seconds}";
  104501. "where eval_result is the result of the actual eval() call.";
  104502. "";
  104503. "For the case where string is an expression, we need to prefix `return ' and append `;' to string before passing it to eval().  However this is not appropriate for statements, where it is assumed an explicit return will be provided somewhere or that the return value is irrelevant.  The code below assumes that string is an expression unless it either begins with a semicolon `;' or one of the MOO language statement keywords.";
  104504. "Next, the substitutions described by this.eval_subs, which should be a list of pairs {string, sub}, are performed on string";
  104505. "Finally, this.eval_env is prefixed to the beginning while this.eval_ticks is subtracted from the eventual tick count.  This allows string to refer to predefined variables like `here' and `me'.";
  104506. set_task_perms(caller_perms());
  104507. program = (args[1] + ";");
  104508. debug = ({@args, 1}[2] ? 33 | 0);
  104509. if (!match(program, "^ *%(;%|%(if%|fork?%|return%|while%)[^a-z0-9A-Z_]%)"))
  104510. program = ("return " + program);
  104511. endif
  104512. program = tostr(this.eval_env, ";", $code_utils:substitute(program, this.eval_subs));
  104513. ticks = (((ticks_left() - 48) - this.eval_ticks) + debug);
  104514. seconds = seconds_left();
  104515. value = (debug ? eval(program) | $code_utils:eval_d(program));
  104516. seconds = (seconds - seconds_left());
  104517. ticks = (ticks - ticks_left());
  104518. return {@value, ticks, seconds};
  104519. .
  104520. #59:27
  104521. "@dump something [with [id=...] [noprops] [noverbs] [create]]";
  104522. "This spills out all properties and verbs on an object, calling suspend at appropriate intervals.";
  104523. "   id=#nnn -- specifies an idnumber to use in place of the object's actual id (for porting to another MOO)";
  104524. "   noprops -- don't show properties.";
  104525. "   noverbs -- don't show verbs.";
  104526. "   create  -- indicates that a @create command should be generated and all of the verbs be introduced with @verb rather than @args; the default assumption is that the object already exists and you're just doing this to have a look at it.";
  104527. set_task_perms(player);
  104528. dobj = player:my_match_object(dobjstr);
  104529. if ($command_utils:object_match_failed(dobj, dobjstr))
  104530. return;
  104531. endif
  104532. if (prepstr && (prepstr != "with"))
  104533. player:notify(tostr("Usage:  ", verb, " something [with [id=...] [noprops] [noverbs] [create]]"));
  104534. return;
  104535. endif
  104536. targname = tostr(dobj);
  104537. options = {"props", "verbs"};
  104538. create = 0;
  104539. if (iobjstr)
  104540. for o in ($string_utils:explode(iobjstr))
  104541. if (index(o, "id=") == 1)
  104542. targname = o[4..length(o)];
  104543. elseif (o in {"noprops", "noverbs"})
  104544. options = setremove(options, o[3..length(o)]);
  104545. elseif (o in {"create"})
  104546. create = 1;
  104547. endif
  104548. endfor
  104549. endif
  104550. if (create)
  104551. parent = parent(dobj);
  104552. pstring = tostr(parent);
  104553. for p in (properties(#0))
  104554. if (#0.(p) == parent)
  104555. pstring = ("$" + p);
  104556. endif
  104557. endfor
  104558. player:notify(tostr("@create ", pstring, " named ", dobj.name, ":", $string_utils:from_list(dobj.aliases, ",")));
  104559. endif
  104560. for p in (("props" in options) ? properties(dobj) | {})
  104561. pquoted = $string_utils:print(p);
  104562. info = property_info(dobj, p);
  104563. value = dobj.(p);
  104564. if (create)
  104565. uvalue = ((typeof(value) == LIST) ? "{}" | 0);
  104566. player:notify(tostr("@prop ", targname, ".", pquoted, " ", uvalue || $string_utils:print_suspended(value), " ", info[2] || "\"\"", (info[1] == dobj.owner) ? "" | tostr(" ", info[1])));
  104567. if (uvalue && value)
  104568. player:notify(tostr(";", targname, ".(", pquoted, ") = ", $string_utils:print_suspended(value)));
  104569. endif
  104570. else
  104571. if (info[2] != "rc")
  104572. player:notify(tostr("@chmod ", targname, ".", pquoted, " ", info[2]));
  104573. endif
  104574. if (info[1] != dobj.owner)
  104575. player:notify(tostr("@chown ", targname, ".", pquoted, " ", info[1]));
  104576. endif
  104577. player:notify(tostr(";", targname, ".(", pquoted, ") = ", $string_utils:print_suspended(value)));
  104578. endif
  104579. $command_utils:suspend_if_needed(0);
  104580. endfor
  104581. for a in (("props" in options) ? $object_utils:ancestors(dobj) | {})
  104582. for p in (properties(a))
  104583. $command_utils:suspend_if_needed(1);
  104584. pquoted = $string_utils:print(p);
  104585. value = dobj.(p);
  104586. avalue = a.(p);
  104587. if (typeof(value) == ERR)
  104588. player:notify(tostr("\"", targname, ".(", pquoted, ") => ", $code_utils:error_name(value), " (", value, ")"));
  104589. elseif ((typeof(avalue) == ERR) || (value != avalue))
  104590. player:notify(tostr(";", targname, ".(", pquoted, ") = ", $string_utils:print_suspended(value)));
  104591. endif
  104592. endfor
  104593. $command_utils:suspend_if_needed(1);
  104594. endfor
  104595. if (!("verbs" in options))
  104596. player:notify("\"***finished***");
  104597. return;
  104598. endif
  104599. player:notify("");
  104600. v = tostr(0);
  104601. while ((info = verb_info(dobj, v)) || (info == E_PERM))
  104602. if (index(info[3], "(old)") && 0)
  104603. "Thought about skipping (old) verbs...";
  104604. player:tell("Skipping ", dobj, ":\"", info[3], "\"...");
  104605. else
  104606. suspend(1);
  104607. if (typeof(info) == ERR)
  104608. player:notify(tostr("\"", dobj, ":", v, " --- ", info, "\";"));
  104609. else
  104610. if (i = index(vname = info[3], " "))
  104611. vname = vname[1..i - 1];
  104612. endif
  104613. if (vname[1] != "*")
  104614. vname = strsub(vname, "*", "");
  104615. endif
  104616. args = verb_args(dobj, v);
  104617. prep = ((args[2] in {"any", "none"}) ? args[2] | $code_utils:short_prep(args[2]));
  104618. perms = ((info[2] != ((args == {"this", "none", "this"}) ? "rxd" | "rd")) ? info[2] || "\"\"" | "");
  104619. if (create)
  104620. if (info[1] == dobj.owner)
  104621. tail = (perms ? tostr(" ", perms) | "");
  104622. else
  104623. tail = tostr(" ", perms || info[2], " ", info[1]);
  104624. endif
  104625. player:notify(tostr("@verb ", targname, ":\"", info[3], "\" ", args[1], " ", prep, " ", args[3], tail));
  104626. else
  104627. player:notify(tostr("@args ", targname, ":\"", info[3], "\" ", args[1], " ", prep, " ", args[3]));
  104628. if (info[1] != dobj.owner)
  104629. player:notify(tostr("@chown ", targname, ":", vname, " ", info[1]));
  104630. endif
  104631. if (perms)
  104632. player:notify(tostr("@chmod ", targname, ":", vname, " ", perms));
  104633. endif
  104634. endif
  104635. if (code = verb_code(dobj, v, 1, 1))
  104636. player:notify(tostr("@program ", targname, ":", vname));
  104637. for c in (code)
  104638. player:notify(c);
  104639. $command_utils:suspend_if_needed(0);
  104640. endfor
  104641. player:notify_lines({".", ""});
  104642. endif
  104643. endif
  104644. endif
  104645. if (index(tostr(" ", info[3], " "), " * "))
  104646. "... we have a * verb.  may as well forget trying to list...";
  104647. "... the rest; they're invisible.  set v to something nonstring.";
  104648. v = E_TYPE;
  104649. else
  104650. v = tostr(tonum(v) + 1);
  104651. endif
  104652. $command_utils:suspend_if_needed(0);
  104653. endwhile
  104654. player:notify("\"***finished***");
  104655. .
  104656. #59:28
  104657. "Copied from Player Class hacked with eval that does substitutions and assorted stuff (#8855):# by Geust (#24442) Sun May  9 20:19:05 1993 PDT";
  104658. "#<string>[.<property>|.parent] [exit|player|inventory] [for <code>] returns information about the object (we'll call it <thing>) named by string.  String is matched in the current room unless one of exit|player|inventory is given.";
  104659. "If neither .<property>|.parent nor <code> is specified, just return <thing>.";
  104660. "If .<property> is named, return <thing>.<property>.  .parent returns parent(<thing>).";
  104661. "If <code> is given, it is evaluated, with the value returned by the first part being substituted for %# in <code>.";
  104662. "For example, the command";
  104663. "  #JoeFeedback.parent player for tonum(%#)";
  104664. "will return 26026 (unless Joe has chparented since writing this).";
  104665. set_task_perms(player);
  104666. if (!(whatstr = verb[2..dot = (min(index(verb + ".", "."), index(verb + ":", ":")) - 1)]))
  104667. player:notify("Usage:  #string [exit|player|inventory]");
  104668. return;
  104669. elseif (!args)
  104670. what = player:my_match_object(whatstr);
  104671. elseif (index("exits", args[1]) == 1)
  104672. what = player.location:match_exit(whatstr);
  104673. elseif (index("inventory", args[1]) == 1)
  104674. what = player:match(whatstr);
  104675. elseif (index("players", args[1]) == 1)
  104676. what = $string_utils:match_player(whatstr);
  104677. if ($command_utils:player_match_failed(what, whatstr))
  104678. return;
  104679. endif
  104680. else
  104681. what = player:my_match_object(whatstr);
  104682. endif
  104683. if ((!valid(what)) && match(whatstr, "^[0-9]+$"))
  104684. what = toobj(whatstr);
  104685. endif
  104686. if ($command_utils:object_match_failed(what, whatstr))
  104687. return;
  104688. endif
  104689. while (index(verb, ".parent") == (dot + 1))
  104690. what = parent(what);
  104691. dot = (dot + 7);
  104692. endwhile
  104693. if (dot >= length(verb))
  104694. val = what;
  104695. elseif ((value = $code_utils:eval_d(tostr("return ", what, verb[dot + 1..length(verb)], ";")))[1])
  104696. val = value[2];
  104697. else
  104698. player:notify_lines(value[2]);
  104699. return;
  104700. endif
  104701. if (prepstr)
  104702. program = strsub(iobjstr + ";", "%#", $string_utils:print(val));
  104703. end = 1;
  104704. "while (\"A\" <= (l = argstr[end]) && l <= \"Z\")";
  104705. while (("A" <= (l = program[end])) && (l <= "Z"))
  104706. end = (end + 1);
  104707. endwhile
  104708. if ((program[1] == ";") || (program[1..end - 1] in {"if", "for", "fork", "return", "while"}))
  104709. program = $code_utils:substitute(program, this.eval_subs);
  104710. else
  104711. program = $code_utils:substitute("return " + program, this.eval_subs);
  104712. endif
  104713. if ((value = eval(program))[1])
  104714. player:notify(this:eval_value_to_string(value[2]));
  104715. else
  104716. player:notify_lines(value[2]);
  104717. nerrors = length(value[2]);
  104718. player:notify(tostr(nerrors, " error", (nerrors == 1) ? "." | "s."));
  104719. endif
  104720. else
  104721. player:notify(this:eval_value_to_string(val));
  104722. endif
  104723. .
  104724. #59:29
  104725. set_task_perms(caller_perms());
  104726. if (typeof(val = args[1]) == OBJ)
  104727. return tostr("=> ", val, "  ", valid(val) ? ("(" + val.name) + ")" | ((a = $list_utils:assoc(val, {{#-1, "<$nothing>"}, {#-2, "<$ambiguous_match>"}, {#-3, "<$failed_match>"}})) ? a[2] | "<invalid>"));
  104728. elseif (typeof(val) == ERR)
  104729. return tostr("=> ", $code_utils:error_name(val), "  (", val, ")");
  104730. else
  104731. return tostr("=> ", $string_utils:print(val));
  104732. endif
  104733. .
  104734. #60:0
  104735. ":eval_d(code...) => {compiled?,result}";
  104736. "This works exactly like the builtin eval() except that the code is evaluated ";
  104737. "as if the d flag were unset.";
  104738. code = {"set_verb_code(this,\"1\",{\"\\\"Do not remove this verb!  This is an auxiliary verb for :eval_d().\\\";\"});", "dobj=iobj=this=#-1;", "dobjstr=iobjstr=prepstr=argstr=verb=\"\";", tostr("caller=", caller, ";"), "set_task_perms(caller_perms());", @args};
  104739. if (!caller_perms().programmer)
  104740. return E_PERM;
  104741. elseif (svc = set_verb_code(this, "1", code))
  104742. lines = {};
  104743. for line in (svc)
  104744. if ((index(line, "Line ") == 1) && (n = tonum(line[6..(colon = index(line + ":", ":")) - 1])))
  104745. lines = {@lines, tostr("Line ", n - 5, line[colon..length(line)])};
  104746. else
  104747. lines = {@lines, line};
  104748. endif
  104749. endfor
  104750. return {0, lines};
  104751. else
  104752. set_task_perms(caller_perms());
  104753. return {1, this:("1")()};
  104754. endif
  104755. .
  104756. #60:1
  104757. "Do not remove this verb!  This is an auxiliary verb for :eval_d().";
  104758. .
  104759. #60:2
  104760. ":tonum(number as string) => number";
  104761. return match(s = args[1], "^ *[-+]?[0-9]+ *$") ? tonum(s) | E_TYPE;
  104762. .
  104763. #60:3
  104764. ":toobj(objectid as string) => objectid";
  104765. return match(s = args[1], "^ *#[-+]?[0-9]+ *$") ? toobj(s) | E_TYPE;
  104766. .
  104767. #60:4
  104768. "toerr(n), toerr(\"E_FOO\"), toerr(\"FOO\") => E_FOO.";
  104769. if (typeof(s = args[1]) != STR)
  104770. n = (tonum(s) + 1);
  104771. if (n > length(this.error_list))
  104772. return 1;
  104773. endif
  104774. elseif (!(n = ((s in this.error_names) || (("E_" + s) in this.error_names))))
  104775. return 1;
  104776. endif
  104777. return this.error_list[n];
  104778. .
  104779. #60:5
  104780. "error_name(E_FOO) => \"E_FOO\"";
  104781. return this.error_names[tonum(args[1]) + 1];
  104782. .
  104783. #60:6
  104784. set_task_perms(caller_perms());
  104785. object = args[1];
  104786. what = {@args, {"props", "verbs"}}[2];
  104787. player:notify(tostr("Object ID:  ", object));
  104788. player:notify(tostr("Name:       ", object.name));
  104789. names = {"Parent", "Location", "Owner"};
  104790. vals = {parent(object), object.location, object.owner};
  104791. for i in [1..length(vals)]
  104792. if (!valid(vals[i]))
  104793. val = "*** NONE ***";
  104794. else
  104795. val = (((vals[i].name + " (") + tostr(vals[i])) + ")");
  104796. endif
  104797. player:notify(tostr(names[i], ":      "[1..12 - length(names[i])], val));
  104798. endfor
  104799. line = "Flags:     ";
  104800. if (is_player(object))
  104801. line = (line + " player");
  104802. endif
  104803. for flag in ({"programmer", "wizard", "r", "w", "f"})
  104804. if (object.(flag))
  104805. line = ((line + " ") + flag);
  104806. endif
  104807. endfor
  104808. player:notify(line);
  104809. if (player.programmer && ((player.wizard || (player == object.owner)) || object.r))
  104810. if (("verbs" in what) && verbs(object))
  104811. player:notify("Verb definitions:");
  104812. for v in (verbs(object))
  104813. $command_utils:suspend_if_needed(0);
  104814. player:notify(tostr("    ", v));
  104815. endfor
  104816. endif
  104817. if ("props" in what)
  104818. if (properties(object))
  104819. player:notify("Property definitions:");
  104820. for p in (properties(object))
  104821. $command_utils:suspend_if_needed(0);
  104822. player:notify(tostr("    ", p));
  104823. endfor
  104824. endif
  104825. all_props = $object_utils:all_properties(object);
  104826. if (all_props != {})
  104827. player:notify("Properties:");
  104828. for p in (all_props)
  104829. $command_utils:suspend_if_needed(0);
  104830. val = object.(p);
  104831. if (val == E_PERM)
  104832. STR = "(Permission denied.)";
  104833. else
  104834. STR = $string_utils:from_value_suspended(val, 1, -1);
  104835. endif
  104836. player:notify(tostr("    ", p, ": ", STR));
  104837. endfor
  104838. endif
  104839. endif
  104840. elseif (player.programmer)
  104841. player:notify("** Can't list properties or verbs: permission denied.");
  104842. endif
  104843. if (object.contents)
  104844. player:notify("Contents:");
  104845. for o in (object.contents)
  104846. $command_utils:suspend_if_needed(0);
  104847. player:notify(tostr("    ", o.name, " (", o, ")"));
  104848. endfor
  104849. endif
  104850. .
  104851. #60:7
  104852. set_task_perms(caller_perms());
  104853. object = args[1];
  104854. pname = args[2];
  104855. if (pname in this.builtin_props)
  104856. player:notify(tostr(object, ".", pname));
  104857. player:notify("Built-in property.");
  104858. else
  104859. info = property_info(object, pname);
  104860. if (typeof(info) == ERR)
  104861. player:notify(tostr(info));
  104862. return;
  104863. endif
  104864. owner = info[1];
  104865. perms = info[2];
  104866. player:notify(tostr(object, ".", pname));
  104867. player:notify(tostr("Owner:        ", valid(owner) ? tostr(owner.name, " (", owner, ")") | "*** NONE ***"));
  104868. player:notify(tostr("Permissions:  ", perms));
  104869. endif
  104870. player:notify(tostr("Value:        ", $string_utils:print(object.(pname))));
  104871. .
  104872. #60:8
  104873. set_task_perms(caller_perms());
  104874. object = args[1];
  104875. vname = args[2];
  104876. if (!(hv = $object_utils:has_verb(object, vname)))
  104877. player:notify("That object does not define that verb.");
  104878. return;
  104879. elseif (hv[1] != object)
  104880. player:notify(tostr("Object ", object, " does not define that verb, but its ancestor ", hv[1], " does."));
  104881. object = hv[1];
  104882. endif
  104883. info = verb_info(object, vname);
  104884. if (typeof(info) == ERR)
  104885. player:notify(tostr(info));
  104886. return;
  104887. endif
  104888. owner = info[1];
  104889. perms = info[2];
  104890. names = info[3];
  104891. arg_specs = verb_args(object, vname);
  104892. player:notify(tostr(object, ":", names));
  104893. player:notify(tostr("Owner:            ", valid(owner) ? tostr(owner.name, " (", owner, ")") | "*** NONE ***"));
  104894. player:notify(tostr("Permissions:      ", perms));
  104895. player:notify(tostr("Direct Object:    ", arg_specs[1]));
  104896. player:notify(tostr("Preposition:      ", arg_specs[2]));
  104897. player:notify(tostr("Indirect Object:  ", arg_specs[3]));
  104898. .
  104899. #60:9
  104900. if (args[4..5] == {"none", "this"})
  104901. return 0;
  104902. endif
  104903. thisobj = args[1];
  104904. verb = args[2];
  104905. adobj = args[3];
  104906. aprep = args[4];
  104907. aiobj = args[5];
  104908. prep_part = ((aprep == "any") ? "to" | this:short_prep(aprep));
  104909. ".........`any' => `to' (arbitrary),... `none' => empty string...";
  104910. if ((adobj == "this") && (dobj == thisobj))
  104911. dobj_part = dobjstr;
  104912. iobj_part = (((!prep_part) || (aiobj == "none")) ? "" | ((aiobj == "this") ? dobjstr | iobjstr));
  104913. elseif ((aiobj == "this") && (iobj == thisobj))
  104914. dobj_part = ((adobj == "any") ? dobjstr | ((adobj == "this") ? iobjstr | ""));
  104915. iobj_part = iobjstr;
  104916. elseif (!("this" in args[3..5]))
  104917. dobj_part = ((adobj == "any") ? dobjstr | "");
  104918. iobj_part = ((prep_part && (aiobj == "any")) ? iobjstr | "");
  104919. else
  104920. return 0;
  104921. endif
  104922. return tostr(verb, dobj_part ? " " + dobj_part | "", prep_part ? " " + prep_part | "", iobj_part ? " " + iobj_part | "");
  104923. .
  104924. #60:10
  104925. "returns the permissions of the current verb (either the owner or the result of the most recent set_task_perms()).";
  104926. return caller_perms();
  104927. .
  104928. #60:11
  104929. "returns the object where the current verb is defined.";
  104930. return callers()[1][4];
  104931. .
  104932. #60:12
  104933. ":verb_documentation([object,verbname]) => documentation at beginning of verb code, if any";
  104934. "default is the calling verb";
  104935. set_task_perms(caller_perms());
  104936. if (args)
  104937. object = args[1];
  104938. vname = args[2];
  104939. else
  104940. c = callers()[1];
  104941. object = c[4];
  104942. vname = c[2];
  104943. endif
  104944. if (typeof(code = verb_code(object, vname)) == ERR)
  104945. return tostr(code);
  104946. else
  104947. doc = {};
  104948. for line in (code)
  104949. if (match(line, "^\"%([^\\\"]%|\\.%)*\";$"))
  104950. "... now that we're sure `line' is just a string, eval() is safe...";
  104951. doc = {@doc, $no_one:eval("; return " + line)[2]};
  104952. else
  104953. return doc;
  104954. endif
  104955. endfor
  104956. return doc;
  104957. endif
  104958. .
  104959. #60:13
  104960. ":set_verb_documentation(object,verbname,text)";
  104961. "  changes documentation at beginning of verb code";
  104962. "  text is either a string or a list of strings";
  104963. "  returns a non-1 value if anything bad happens...";
  104964. set_task_perms(caller_perms());
  104965. if (typeof(code = verb_code(object = args[1], vname = args[2])) == ERR)
  104966. return code;
  104967. elseif (typeof(vd = $code_utils:verb_documentation(object, vname)) == ERR)
  104968. return vd;
  104969. elseif (!(typeof(text = args[3]) in {LIST, STR}))
  104970. return E_INVARG;
  104971. else
  104972. newdoc = {};
  104973. for l in ((typeof(text) == LIST) ? text | {text})
  104974. if (typeof(l) != STR)
  104975. return E_INVARG;
  104976. endif
  104977. newdoc = {@newdoc, $string_utils:print(l) + ";"};
  104978. endfor
  104979. if ((ERR == typeof(svc = set_verb_code(object, vname, {@newdoc, @code[length(vd) + 1..length(code)]}))) || svc)
  104980. "... this shouldn't happen.  I'm not setting this code -d just yet...";
  104981. return svc;
  104982. else
  104983. return 1;
  104984. endif
  104985. endif
  104986. .
  104987. #60:14
  104988. "$code_utils:parse_propref(string)";
  104989. "Parses string as a MOO-code property reference, returning {object-string, prop-name-string} for a successful parse and false otherwise.  It always returns the right object-string to pass to, for example, this-room:match_object.";
  104990. s = args[1];
  104991. if (dot = index(s, "."))
  104992. object = s[1..dot - 1];
  104993. prop = s[dot + 1..length(s)];
  104994. if ((object == "") || (prop == ""))
  104995. return 0;
  104996. elseif (object[1] == "$")
  104997. object = #0.(object[2..length(object)]);
  104998. if (typeof(object) != OBJ)
  104999. return 0;
  105000. endif
  105001. object = tostr(object);
  105002. endif
  105003. elseif (index(s, "$") == 1)
  105004. object = "#0";
  105005. prop = s[2..length(s)];
  105006. else
  105007. return 0;
  105008. endif
  105009. return {object, prop};
  105010. .
  105011. #60:15
  105012. "$code_utils:parse_verbref(string)";
  105013. "Parses string as a MOO-code verb reference, returning {object-string, verb-name-string} for a successful parse and false otherwise.  It always returns the right object-string to pass to, for example, this-room:match_object().";
  105014. s = args[1];
  105015. if (colon = index(s, ":"))
  105016. object = s[1..colon - 1];
  105017. verbname = s[colon + 1..length(s)];
  105018. if (!(object && verbname))
  105019. return 0;
  105020. elseif (object[1] == "$")
  105021. pname = object[2..length(object)];
  105022. if ((!(pname in properties(#0))) || (typeof(object = #0.(pname)) != OBJ))
  105023. return 0;
  105024. endif
  105025. object = tostr(object);
  105026. endif
  105027. return {object, verbname};
  105028. else
  105029. return 0;
  105030. endif
  105031. .
  105032. #60:16
  105033. ":parse_arg_spec(@args)";
  105034. "  attempts to parse the given sequence of args into a verb_arg specification";
  105035. "returns {verb_args,remaining_args} if successful.";
  105036. "  e.g., :parse_arg_spec(\"this\",\"in\",\"front\",\"of\",\"any\",\"foo\"..)";
  105037. "           => {{\"this\",\"in front of\",\"any\"},{\"foo\"..}}";
  105038. "returns a string error message if parsing fails.";
  105039. nargs = length(args);
  105040. if (nargs < 1)
  105041. return {{}, {}};
  105042. elseif ((ds = args[1]) == "tnt")
  105043. return {{"this", "none", "this"}, listdelete(args, 1)};
  105044. elseif (!(ds in {"this", "any", "none"}))
  105045. return tostr("\"", ds, "\" is not a valid direct object specifier.");
  105046. elseif ((nargs < 2) || (args[2] in {"none", "any"}))
  105047. verbargs = args[1..min(3, nargs)];
  105048. rest = args[4..nargs];
  105049. elseif (!(gp = $code_utils:get_prep(@args[2..nargs]))[1])
  105050. return tostr("\"", args[2], "\" is not a valid preposition.");
  105051. else
  105052. verbargs = {ds, @gp[1..min(2, nargs = length(gp))]};
  105053. rest = gp[3..nargs];
  105054. endif
  105055. if ((length(verbargs) >= 3) && (!(verbargs[3] in {"this", "any", "none"})))
  105056. return tostr("\"", verbargs[3], "\" is not a valid indirect object specifier.");
  105057. endif
  105058. return {verbargs, rest};
  105059. .
  105060. #60:17
  105061. if (server_version() != this._version)
  105062. this:_fix_preps();
  105063. endif
  105064. return this.prepositions;
  105065. .
  105066. #60:18
  105067. ":short_prep(p) => shortest preposition equivalent to p";
  105068. "p may be a single word or one of the strings returned by verb_args().";
  105069. if (server_version() != this._version)
  105070. this:_fix_preps();
  105071. endif
  105072. word = args[1];
  105073. word = word[1..index(word + "/", "/") - 1];
  105074. if (p = (word in this._other_preps))
  105075. return this._short_preps[this._other_preps_n[p]];
  105076. elseif (word in this._short_preps)
  105077. return word;
  105078. else
  105079. return "";
  105080. endif
  105081. .
  105082. #60:19
  105083. if (server_version() != this._version)
  105084. this:_fix_preps();
  105085. endif
  105086. prep = args[1];
  105087. if (p = (prep in this._short_preps))
  105088. return this.prepositions[p];
  105089. elseif (p = (prep in this._other_preps))
  105090. return this.prepositions[this._other_preps_n[p]];
  105091. else
  105092. return "";
  105093. endif
  105094. .
  105095. #60:20
  105096. ":get_prep(@args) extracts the prepositional phrase from the front of args, returning a list consisting of the preposition (or \"\", if none) followed by the unused args.";
  105097. ":get_prep(\"in\",\"front\",\"of\",...) => {\"in front of\",...}";
  105098. ":get_prep(\"inside\",...)          => {\"inside\",...}";
  105099. ":get_prep(\"frabulous\",...}       => {\"\", \"frabulous\",...}";
  105100. prep = "";
  105101. allpreps = {@this._short_preps, @this._other_preps};
  105102. rest = 1;
  105103. for i in [1..length(args)]
  105104. try = ((i == 1) ? args[1] | tostr(try, " ", args[i]));
  105105. if (try in allpreps)
  105106. prep = try;
  105107. rest = (i + 1);
  105108. endif
  105109. if (!(try in this._multi_preps))
  105110. return {prep, @args[rest..length(args)]};
  105111. endif
  105112. endfor
  105113. return {prep, @args[rest..length(args)]};
  105114. .
  105115. #60:21
  105116. ":_fix_preps() updates the properties on this having to do with prepositions.";
  105117. "_fix_preps should be called whenever we detect that a new server version has been installed.";
  105118. orig_args = verb_args(this, verb);
  105119. multis = (nothers = (others = (shorts = (longs = {}))));
  105120. i = 0;
  105121. while (typeof(set_verb_args(this, verb, {"this", tostr(i), "this"})) != ERR)
  105122. l = verb_args(this, verb)[2];
  105123. all = $string_utils:explode(l, "/");
  105124. s = all[1];
  105125. for p in (listdelete(all, 1))
  105126. if (length(p) <= length(s))
  105127. s = p;
  105128. endif
  105129. endfor
  105130. for p in (all)
  105131. while (j = rindex(p, " "))
  105132. multis = {p = p[1..j - 1], @multis};
  105133. endwhile
  105134. endfor
  105135. longs = {@longs, l};
  105136. shorts = {@shorts, s};
  105137. others = {@others, @setremove(all, s)};
  105138. nothers = {@nothers, @$list_utils:make(length(all) - 1, length(shorts))};
  105139. i = (i + 1);
  105140. endwhile
  105141. set_verb_args(this, verb, orig_args);
  105142. this.prepositions = longs;
  105143. this._short_preps = shorts;
  105144. this._other_preps = others;
  105145. this._other_preps_n = nothers;
  105146. this._multi_preps = multis;
  105147. this._version = server_version();
  105148. return;
  105149. .
  105150. #60:22
  105151. ":find_verb_named(object,name[,n])";
  105152. "  returns the *number* of the first verb on object matching the given name.";
  105153. "  optional argument n, if given, starts the search with verb n,";
  105154. "  causing the first n verbs (0..n-1) to be ignored.";
  105155. "  -1 is returned if no verb is found.";
  105156. "  This routine does not find inherited verbs.";
  105157. object = args[1];
  105158. name = args[2];
  105159. for i in [{@args, 0}[3]..length(verbs(object)) - 1]
  105160. verbinfo = verb_info(object, tostr(i));
  105161. if (this:verbname_match(verbinfo[3], name))
  105162. return i;
  105163. endif
  105164. endfor
  105165. return -1;
  105166. .
  105167. #60:23
  105168. ":find_verb_named(object,name[,n])";
  105169. "  returns the *number* of the last verb on object matching the given name.";
  105170. "  optional argument n, if given, starts the search with verb n-1,";
  105171. "  causing verbs (n..length(verbs(object))) to be ignored.";
  105172. "  -1 is returned if no verb is found.";
  105173. "  This routine does not find inherited verbs.";
  105174. object = args[1];
  105175. name = args[2];
  105176. last = {@args, -1}[3];
  105177. if (last < 0)
  105178. last = length(verbs(object));
  105179. endif
  105180. for i in [1..last]
  105181. verbinfo = verb_info(object, tostr(last - i));
  105182. if (this:verbname_match(verbinfo[3], name))
  105183. return last - i;
  105184. endif
  105185. endfor
  105186. return -1;
  105187. .
  105188. #60:24
  105189. ":find_callable_verb_named(object,name[,n])";
  105190. "  returns the *number* of the first verb on object that matches the given";
  105191. "  name and has the x flag set.";
  105192. "  optional argument n, if given, starts the search with verb n,";
  105193. "  causing the first n verbs (0..n-1) to be ignored.";
  105194. "  -1 is returned if no verb is found.";
  105195. "  This routine does not find inherited verbs.";
  105196. object = args[1];
  105197. name = args[2];
  105198. for i in [{@args, 0}[3]..length(verbs(object)) - 1]
  105199. verbinfo = verb_info(object, tostr(i));
  105200. if (index(verbinfo[2], "x") && this:verbname_match(verbinfo[3], name))
  105201. return i;
  105202. endif
  105203. endfor
  105204. return -1;
  105205. .
  105206. #60:25
  105207. ":verbname_match(fullverbname,name) => TRUE iff `name' is a valid name for a verb with the given `fullname'";
  105208. verblist = ((" " + args[1]) + " ");
  105209. if (index(verblist, (" " + (name = args[2])) + " ") && (!match(name, "[ *]")))
  105210. "Note that if name has a * or a space in it, then it can only match one of the * verbnames";
  105211. return 1;
  105212. else
  105213. namelen = length(name);
  105214. while (m = match(verblist, "[^ *]*%(%*%)[^ ]*"))
  105215. vlast = m[2];
  105216. if ((namelen >= (m[3][1][1] - m[1])) && ((!(v = strsub(verblist[m[1]..vlast], "*", ""))) || (index(v, (verblist[vlast] == "*") ? name[1..min(namelen, length(v))] | name) == 1)))
  105217. return 1;
  105218. endif
  105219. verblist = verblist[vlast + 1..length(verblist)];
  105220. endwhile
  105221. endif
  105222. return 0;
  105223. .
  105224. #60:26
  105225. "$code_utils:find_verbs_containing(pattern[,object|object-list])";
  105226. "";
  105227. "Print (to player) the name and owner of every verb in the database whose code contains PATTERN as a substring.  Optional second argument limits the search to the specified object or objects.";
  105228. "";
  105229. "Because it searches the entire database, this function may suspend the task several times before returning.";
  105230. "";
  105231. set_task_perms(caller_perms());
  105232. "... puts the task in a player's own job queue and prevents someone from learning about verbs that are otherwise unreadable to him/her.";
  105233. pattern = args[1];
  105234. where = {@args, 0}[2];
  105235. count = 0;
  105236. if (typeof(where) == NUM)
  105237. for i in [where..tonum(max_object())]
  105238. if (valid(o = toobj(i)))
  105239. count = (count + this:_find_verbs_containing(pattern, o));
  105240. endif
  105241. if ($command_utils:running_out_of_time())
  105242. player:notify(tostr("...", o));
  105243. suspend(0);
  105244. endif
  105245. endfor
  105246. elseif (typeof(where) == LIST)
  105247. for o in (where)
  105248. count = (count + this:_find_verbs_containing(pattern, o));
  105249. endfor
  105250. else
  105251. "...typeof(where) == OBJ...";
  105252. count = this:_find_verbs_containing(pattern, where);
  105253. endif
  105254. player:notify("");
  105255. player:notify(tostr("Total: ", count, " verbs."));
  105256. .
  105257. #60:27
  105258. ":_find_verbs_containing(pattern,object)";
  105259. "number of verbs in object with code having a line containing pattern";
  105260. "prints verbname and offending line to player";
  105261. set_task_perms(caller_perms());
  105262. pattern = args[1];
  105263. count = 0;
  105264. verbs = verbs(o = args[2]);
  105265. if (typeof(verbs) == ERR)
  105266. player:notify(tostr("verbs(", o, ") => ", verbs));
  105267. return 0;
  105268. endif
  105269. for vnum in [0..length(verbs) - 1]
  105270. if (l = this:_grep_verb_code(pattern, o, vname = tostr(vnum)))
  105271. owner = verb_info(o, vname)[1];
  105272. player:notify(tostr(o, ":", verbs[vnum + 1], " [", valid(owner) ? owner.name | "Recycled Player", " (", owner, ")]:  ", l));
  105273. count = (count + 1);
  105274. endif
  105275. if ($command_utils:running_out_of_time())
  105276. player:notify(tostr("...", o));
  105277. suspend(0);
  105278. endif
  105279. endfor
  105280. return count;
  105281. .
  105282. #60:28
  105283. "$code_utils:find_verbs_matching(pattern[,object|object-list])";
  105284. "";
  105285. "Print (to player) the name and owner of every verb in the database whose code has a substring matches the regular expression PATTERN.  Optional second argument limits the search to the specified object or objects.";
  105286. "";
  105287. "Because it searches the entire database, this function may suspend the task several times before returning.";
  105288. "";
  105289. set_task_perms(caller_perms());
  105290. "... puts the task in a player's own job queue and prevents someone from learning about verbs that are otherwise unreadable to him/her.";
  105291. pattern = args[1];
  105292. where = {@args, 0}[2];
  105293. count = 0;
  105294. if (typeof(where) == NUM)
  105295. for i in [where..tonum(max_object())]
  105296. if (valid(o = toobj(i)))
  105297. count = (count + this:_find_verbs_matching(pattern, o));
  105298. endif
  105299. if ($command_utils:running_out_of_time())
  105300. player:notify(tostr("...", o));
  105301. suspend(0);
  105302. endif
  105303. endfor
  105304. elseif (typeof(where) == LIST)
  105305. for o in (where)
  105306. count = (count + this:_find_verbs_matching(pattern, o));
  105307. endfor
  105308. else
  105309. count = this:_find_verbs_matching(pattern, args[2]);
  105310. endif
  105311. player:notify("");
  105312. player:notify(tostr("Total: ", count, " verbs."));
  105313. .
  105314. #60:29
  105315. ":_find_verbs_matching(regexp,object)";
  105316. "number of verbs in object with code having a line matching regexp";
  105317. "prints verbname and offending line to player";
  105318. set_task_perms(caller_perms());
  105319. pattern = args[1];
  105320. count = 0;
  105321. verbs = verbs(o = args[2]);
  105322. if (typeof(verbs) == ERR)
  105323. player:notify(tostr("verbs(", o, ")  => ", verbs));
  105324. return 0;
  105325. endif
  105326. for vnum in [0..length(verbs) - 1]
  105327. if (l = this:_egrep_verb_code(pattern, o, vname = tostr(vnum)))
  105328. owner = verb_info(o, vname)[1];
  105329. player:notify(tostr(o, ":", verbs[vnum + 1], " [", valid(owner) ? owner.name | "Recycled Player", " (", owner, ")]:  ", l));
  105330. count = (count + 1);
  105331. endif
  105332. if ($command_utils:running_out_of_time())
  105333. player:notify(tostr("...", o));
  105334. suspend(0);
  105335. endif
  105336. endfor
  105337. return count;
  105338. .
  105339. #60:30
  105340. ":_grep_verb_code(pattern,object,verbname) => line number or 0";
  105341. "  returns line number on which pattern occurs in code for object:verbname";
  105342. set_task_perms(caller_perms());
  105343. pattern = args[1];
  105344. for line in (vc = verb_code(@listdelete(args, 1)))
  105345. if (index(line, pattern))
  105346. return line;
  105347. endif
  105348. endfor
  105349. return 0;
  105350. .
  105351. #60:31
  105352. ":_egrep_verb_code(regexp,object,verbname) => 0 or line number";
  105353. "  returns line number of first line matching regexp in object:verbname code";
  105354. set_task_perms(caller_perms());
  105355. pattern = args[1];
  105356. for line in (vc = verb_code(@listdelete(args, 1)))
  105357. if (match(line, pattern))
  105358. return line;
  105359. endif
  105360. endfor
  105361. return 0;
  105362. .
  105363. #60:32
  105364. "Parse [from <start>] [to <end>] [for <name>].";
  105365. "Takes a series of strings, most likely @args with dobjstr removed.";
  105366. "Returns a list {NUM start, NUM end, STR name}, or {} if there is an error.";
  105367. fail = (length(args) % 2);
  105368. start = 0;
  105369. end = tonum(max_object());
  105370. match = "";
  105371. while (args && (!fail))
  105372. prep = args[1];
  105373. if (prep == "from")
  105374. if ((start = player.location:match_object(args[2])) >= #0)
  105375. start = tonum(start);
  105376. else
  105377. start = tonum(args[2]);
  105378. endif
  105379. elseif (prep == "to")
  105380. if ((end = player.location:match_object(args[2])) >= #0)
  105381. end = tonum(end);
  105382. else
  105383. end = tonum(args[2]);
  105384. endif
  105385. elseif (prep == "for")
  105386. match = args[2];
  105387. else
  105388. fail = 1;
  105389. endif
  105390. args = args[3..length(args)];
  105391. endwhile
  105392. return fail ? {} | {start, end, match};
  105393. .
  105394. #60:33
  105395. olist = {player, @$object_utils:ancestors(player)};
  105396. if (valid(player.location))
  105397. olist = {@olist, player.location, @$object_utils:ancestors(player.location)};
  105398. endif
  105399. dbs = {};
  105400. for o in (olist)
  105401. h = o.help;
  105402. if (typeof(h) == OBJ)
  105403. h = {h};
  105404. endif
  105405. for db in (h)
  105406. if ((typeof(db) == OBJ) && (valid(db) && (!(db in dbs))))
  105407. dbs = {@dbs, db};
  105408. endif
  105409. endfor
  105410. endfor
  105411. return {@dbs, $help};
  105412. .
  105413. #60:34
  105414. ":help_db_search(string,dblist)";
  105415. "  searches each of the help db's in dblist for a topic matching string.";
  105416. "  Returns  {db,topic}  or  {$ambiguous_match,{topic...}}  or {}";
  105417. what = args[1];
  105418. dblist = args[2];
  105419. topics = {};
  105420. help = 1;
  105421. for db in (dblist)
  105422. if ({what} == (ts = db:find_topics(what)))
  105423. return {db, ts[1]};
  105424. elseif (ts && (typeof(ts) == LIST))
  105425. if (help)
  105426. help = db;
  105427. endif
  105428. for t in (ts)
  105429. topics = setadd(topics, t);
  105430. endfor
  105431. endif
  105432. endfor
  105433. if (length(topics) > 1)
  105434. return {$ambiguous_match, topics};
  105435. elseif (topics)
  105436. return {help, topics[1]};
  105437. else
  105438. return {};
  105439. endif
  105440. .
  105441. #60:35
  105442. ":corify_object(object)  => string representing object";
  105443. "  usually just returns tostr(object), but in the case of objects that have";
  105444. "  corresponding #0 properties, return the appropriate $-string.";
  105445. object = args[1];
  105446. for p in (properties(#0))
  105447. if (#0.(p) == object)
  105448. return "$" + p;
  105449. endif
  105450. endfor
  105451. return tostr(object);
  105452. .
  105453. #60:36
  105454. "$code_utils:substitute(string,subs) => new line";
  105455. "Subs are a list of lists, {{\"target\",\"sub\"},{...}...}";
  105456. "Substitutes targets for subs in a delimited string fashion, avoiding substituting anything inside quotes, e.g. player:tell(\"don't sub here!\")";
  105457. s = args[1];
  105458. subs = args[2];
  105459. lets = "abcdefghijklmnopqrstuvwxyz0123456789";
  105460. for x in (subs)
  105461. len = length(sub = x[1]);
  105462. delimited = (index(lets, sub[1]) && index(lets, sub[len]));
  105463. prefix = "";
  105464. while (i = index(s, sub))
  105465. prefix = (prefix + s[1..i - 1]);
  105466. if ((((prefix == "") || ((!delimited) || (!index(lets, prefix[length(prefix)])))) && ((!delimited) || (((i + len) > length(s)) || (!index(lets, s[i + len]))))) && (!this:inside_quotes(prefix)))
  105467. prefix = (prefix + x[2]);
  105468. else
  105469. prefix = (prefix + s[i..(i + len) - 1]);
  105470. endif
  105471. s = s[i + len..length(s)];
  105472. endwhile
  105473. s = (prefix + s);
  105474. endfor
  105475. return s;
  105476. .
  105477. #60:37
  105478. "See if the end of the string passed as args[1] ends 'inside' a doublequote.  Used by $code_utils:substitute.";
  105479. string = args[1];
  105480. quoted = 0;
  105481. for i in [1..length(string)]
  105482. if ((string[i] == "\"") && ((!quoted) || (string[i - 1] != "\\")))
  105483. quoted = (!quoted);
  105484. endif
  105485. endfor
  105486. return quoted;
  105487. .
  105488. #60:38
  105489. "verb_or_property(<obj>, <name> [, @<args>])";
  105490. "Looks for a callable verb or property named <name> on <obj>.";
  105491. "If <obj> has a callable verb named <name> then return <obj>:(<name>)(@<args>).";
  105492. "If <obj> has a property named <name> then return <obj>.(<name>).";
  105493. "Otherwise return E_PROPNF.";
  105494. "N.B.: a verb returning E_VERBNF will act like an undefined verb.";
  105495. set_task_perms(caller_perms());
  105496. return ((val = args[1]:(args[2])(@args[3..length(args)])) == E_VERBNF) ? args[1].(args[2]) | val;
  105497. .
  105498. #60:39
  105499. set_task_perms($no_one);
  105500. id = args[1];
  105501. return (id == task_id()) || (E_PERM == kill_task(id));
  105502. .
  105503. #60:40
  105504. if (a = $list_utils:assoc(args[1], queued_tasks()))
  105505. return a[5];
  105506. else
  105507. return E_INVARG;
  105508. endif
  105509. .
  105510. #60:41
  105511. ":argstr(verb,args[,argstr]) => what argstr should have been.  ";
  105512. "Recall that the command line is parsed into a sequence of words; `verb' is";
  105513. "assigned the first word, `args' is assigned the remaining words, and argstr";
  105514. "is assigned a substring of the command line, which *should* be the one";
  105515. "starting first nonblank character after the verb, but is instead (because";
  105516. "the parser is BROKEN!) the one starting with the first nonblank character";
  105517. "after the first space in the line, which is not necessarily after the verb.";
  105518. "Clearly, if the verb contains spaces --- which can happen if you use";
  105519. "backslashes and quotes --- this loses, and argstr will then erroneously";
  105520. "have extra junk at the beginning.  This verb, given verb, args, and the";
  105521. "actual argstr, returns what argstr should have been.";
  105522. verb = args[1];
  105523. argstr = {@args, argstr}[3];
  105524. n = length(args = args[2]);
  105525. if (!index(verb, " "))
  105526. return argstr;
  105527. elseif (!args)
  105528. return "";
  105529. endif
  105530. "space in verb => two possible cases:";
  105531. "(1) first space was not in a quoted string.";
  105532. "    first word of argstr == rest of verb unless verb ended on this space.";
  105533. if ((nqargs = $string_utils:words(argstr)) == args)
  105534. return argstr;
  105535. elseif (((nqn = length(nqargs)) == (n + 1)) && (nqargs[2..nqn] == args))
  105536. return argstr[$string_utils:word_start(argstr)[2][1]..length(argstr)];
  105537. else
  105538. "(2) first space was in a quoted string.";
  105539. "    argstr starts with rest of string";
  105540. qs = $string_utils:word_start("\"" + argstr);
  105541. return argstr[qs[(length(qs) - length(args)) + 1][1] - 1..length(argstr)];
  105542. endif
  105543. .
  105544. #60:42
  105545. ":verbname_match(fullverbname,name) => TRUE iff `name' is a valid name for a verb with the given `fullname'";
  105546. verblist = ((" " + args[1]) + " ");
  105547. if (index(verblist, (" " + (name = args[2])) + " ") && (!(index(name, "*") || index(name, " "))))
  105548. "Note that if name has a * or a space in it, then it can only match one of the * verbnames";
  105549. return 1;
  105550. else
  105551. namelen = length(name);
  105552. while (star = index(verblist, "*"))
  105553. vstart = (rindex(verblist[1..star], " ") + 1);
  105554. vlast = ((vstart + index(verblist[vstart..length(verblist)], " ")) - 2);
  105555. if ((namelen >= (star - vstart)) && ((!(v = strsub(verblist[vstart..vlast], "*", ""))) || (index(v, (verblist[vlast] == "*") ? name[1..min(namelen, length(v))] | name) == 1)))
  105556. return 1;
  105557. endif
  105558. verblist = verblist[vlast + 1..length(verblist)];
  105559. endwhile
  105560. endif
  105561. return 0;
  105562. .
  105563. #60:43
  105564. ":show_who_listing(players[,more_players])";
  105565. " prints a listing of the indicated players.";
  105566. " For players in the first list, idle/connected times are shown if the player is logged in, otherwise the last_connect_time is shown.  For players in the second list, last_connect_time is shown, no matter whether the player is logged in.";
  105567. idles = (itimes = (offs = (otimes = {})));
  105568. for p in (args[2])
  105569. if (!valid(p))
  105570. caller:notify(tostr(p, " <invalid>"));
  105571. elseif (typeof(t = p.last_connect_time) == NUM)
  105572. if (!(p in offs))
  105573. offs = {@offs, p};
  105574. otimes = {@otimes, {-t, -t, p}};
  105575. endif
  105576. elseif (is_player(p))
  105577. caller:notify(tostr(p.name, " (", p, ") ", (t == E_PROPNF) ? "is not a $player." | "has a garbled .last_connect_time."));
  105578. else
  105579. caller:notify(tostr(p.name, " (", p, ") is not a player."));
  105580. endif
  105581. endfor
  105582. for p in (args[1])
  105583. if (p in offs)
  105584. elseif (!valid(p))
  105585. caller:notify(tostr(p, " <invalid>"));
  105586. elseif (typeof(i = idle_seconds(p)) != ERR)
  105587. if (!(p in idles))
  105588. idles = {@idles, p};
  105589. itimes = {@itimes, {i, connected_seconds(p), p}};
  105590. endif
  105591. elseif (typeof(t = p.last_connect_time) == NUM)
  105592. offs = {@offs, p};
  105593. otimes = {@otimes, {-t, -t, p}};
  105594. elseif (is_player(p))
  105595. caller:notify(tostr(p.name, " (", p, ") not logged in.", (t == E_PROPNF) ? "Not a $player." | "Garbled .last_connect_time."));
  105596. else
  105597. caller:notify(tostr(p.name, " (", p, ") is not a player."));
  105598. endif
  105599. endfor
  105600. if (!(idles || offs))
  105601. return 0;
  105602. endif
  105603. idles = $list_utils:sort_alist(itimes);
  105604. offs = $list_utils:sort_alist(otimes);
  105605. "...";
  105606. "... calculate widths...";
  105607. "...";
  105608. headers = {"Player name", @idles ? {"Connected", "Idle time"} | {"Last login", ""}, "Location"};
  105609. total_width = (caller:linelen() || 79);
  105610. max_name = (total_width / 4);
  105611. name_width = length(headers[1]);
  105612. names = (locations = {});
  105613. for lst in ({@idles, @offs})
  105614. $command_utils:suspend_if_needed(0);
  105615. p = lst[3];
  105616. namestr = tostr(p.name[1..min(max_name, length(p.name))], " (", p, ")");
  105617. name_width = max(length(namestr), name_width);
  105618. names = {@names, namestr};
  105619. if (typeof(wlm = p.location:who_location_msg(p)) != STR)
  105620. wlm = (valid(p.location) ? p.location.name | tostr("** Nowhere ** (", p.location, ")"));
  105621. endif
  105622. locations = {@locations, wlm};
  105623. endfor
  105624. time_width = (3 + (offs ? 12 | length("59 minutes")));
  105625. before = {0, w1 = (3 + name_width), w2 = (w1 + time_width), w2 + time_width};
  105626. "...";
  105627. "...print headers...";
  105628. "...";
  105629. su = $string_utils;
  105630. tell1 = headers[1];
  105631. tell2 = su:space(tell1, "-");
  105632. for j in [2..4]
  105633. tell1 = (su:left(tell1, before[j]) + headers[j]);
  105634. tell2 = (su:left(tell2, before[j]) + su:space(headers[j], "-"));
  105635. endfor
  105636. caller:notify(tell1[1..min(length(tell1), total_width)]);
  105637. caller:notify(tell2[1..min(length(tell2), total_width)]);
  105638. "...";
  105639. "...print lines...";
  105640. "...";
  105641. active = 0;
  105642. for i in [1..total = ((ilen = length(idles)) + length(offs))]
  105643. if (i <= ilen)
  105644. lst = idles[i];
  105645. if (lst[1] < (5 * 60))
  105646. active = (active + 1);
  105647. endif
  105648. l = {names[i], su:from_seconds(lst[2]), su:from_seconds(lst[1]), locations[i]};
  105649. else
  105650. lct = offs[i - ilen][3].last_connect_time;
  105651. l = {names[i], (lct <= time()) ? ctime(lct) | "Never", "", locations[i]};
  105652. if ((i == (ilen + 1)) && idles)
  105653. caller:notify(su:left(su:space(before[2]), before[4] - 2, "-"));
  105654. endif
  105655. endif
  105656. tell1 = l[1];
  105657. for j in [2..4]
  105658. tell1 = (su:left(tell1, before[j]) + l[j]);
  105659. endfor
  105660. caller:notify(tell1[1..min(length(tell1), total_width)]);
  105661. if ($command_utils:running_out_of_time())
  105662. now = time();
  105663. suspend(0);
  105664. if ((time() - now) > 10)
  105665. caller:notify(tostr("Plus ", total - i, " other players (", total, " total; out of time and lag is high)."));
  105666. return;
  105667. endif
  105668. endif
  105669. endfor
  105670. "...";
  105671. "...epilogue...";
  105672. "...";
  105673. caller:notify("");
  105674. if (total == 1)
  105675. active_str = (", who has" + ((active == 1) ? "" | " not"));
  105676. else
  105677. if (active == total)
  105678. active_str = ((active == 2) ? "s, both" | "s, all");
  105679. elseif (active == 0)
  105680. active_str = "s, none";
  105681. else
  105682. active_str = tostr("s, ", active);
  105683. endif
  105684. active_str = tostr(active_str, " of whom ha", (active == 1) ? "s" | "ve");
  105685. endif
  105686. caller:notify(tostr("Total: ", total, " player", active_str, " been active recently."));
  105687. return total;
  105688. .
  105689. #60:44
  105690. ":_egrep_verb_code(regexp,object,verbname) => list of lines number";
  105691. "  returns list of all lines matching regexp in object:verbname code";
  105692. set_task_perms(caller_perms());
  105693. pattern = args[1];
  105694. lines = {};
  105695. for line in (vc = verb_code(@args[2..3], 1, 0))
  105696. if (match(line, pattern))
  105697. lines = {@lines, line};
  105698. endif
  105699. endfor
  105700. return lines;
  105701. .
  105702. #60:45
  105703. ":_grep_verb_code_all(pattern,object,verbname) => list of lines";
  105704. "  returns list of lines on which pattern occurs in code for object:verbname";
  105705. set_task_perms(caller_perms());
  105706. pattern = args[1];
  105707. lines = {};
  105708. for line in (vc = verb_code(@args[2..3]))
  105709. if (index(line, pattern))
  105710. lines = {@lines, line};
  105711. endif
  105712. endfor
  105713. return lines;
  105714. .
  105715. #60:47
  105716. ":verb_usage([object,verbname]) => usage string at beginning of verb code, if any";
  105717. "default is the calling verb";
  105718. set_task_perms(caller_perms());
  105719. if (args)
  105720. object = args[1];
  105721. vname = args[2];
  105722. else
  105723. c = callers()[1];
  105724. object = c[4];
  105725. vname = c[2];
  105726. endif
  105727. if (typeof(code = verb_code(object, vname)) == ERR)
  105728. return code;
  105729. else
  105730. doc = {};
  105731. for line in (code)
  105732. if (match(line, "^\"%([^\\\"]%|\\.%)*\";$"))
  105733. "... now that we're sure `line' is just a string, eval() is safe...";
  105734. e = $no_one:eval(line)[2];
  105735. if (subs = match(e, "^%(Usage: +%)%([^ ]+%)%(.*$%)"))
  105736. "Server is broken, hence the next three lines:";
  105737. if (subs[3][3][1] > subs[3][3][2])
  105738. subs[3][3] = {0, -1};
  105739. endif
  105740. indent = (("^%(" + $string_utils:space(length(substitute("%1", subs)))) + " *%)%([^ ]+%)%(.*$%)");
  105741. docverb = substitute("%2", subs);
  105742. if (match(vname, "^[0-9]+$"))
  105743. vname = docverb;
  105744. endif
  105745. doc = {@doc, (substitute("%1", subs) + vname) + substitute("%3", subs)};
  105746. elseif (subs = match(e, indent))
  105747. if (substitute("%2", subs) == docverb)
  105748. doc = {@doc, (substitute("%1", subs) + vname) + substitute("%3", subs)};
  105749. else
  105750. doc = {@doc, e};
  105751. endif
  105752. elseif (indent)
  105753. return doc;
  105754. endif
  105755. else
  105756. return doc;
  105757. endif
  105758. endfor
  105759. return doc;
  105760. endif
  105761. .
  105762. #61:0
  105763. return $player.ownership_quota;
  105764. .
  105765. #61:1
  105766. return $prog.ownership_quota;
  105767. .
  105768. #61:2
  105769. text = pass(@args);
  105770. if ((text != E_PROPNF) || (!valid(object = $string_utils:match_object(what = args[1], player.location))))
  105771. return text;
  105772. elseif (ohelp = ((object = $string_utils:match_object(what, player.location)):help_msg() || object.help_msg))
  105773. "...geez. life is simple if we set -d...";
  105774. return {tostr(object.name, " (", object, "):"), "----", @(typeof(ohelp) == LIST) ? ohelp | {ohelp}};
  105775. else
  105776. about = $object_utils:has_verb(object, "about");
  105777. return {tostr("Sorry, but no help is available on ", object.name, " (", object, ")."), tostr("Try `@examine ", what, "'", @about ? {" or `about ", what, "'"} | {}, ".")};
  105778. endif
  105779. .
  105780. #61:3
  105781. topiclist = pass(@args);
  105782. if (topiclist || (!args))
  105783. return topiclist;
  105784. elseif (valid(o = $string_utils:match_object(what = args[1], player.location)))
  105785. return {what};
  105786. else
  105787. return {};
  105788. endif
  105789. .
  105790. #61:4
  105791. text = {};
  105792. for db in ($code_utils:help_db_list())
  105793. if ($object_utils:has_callable_verb(db, "index"))
  105794. text = {@text, @db:index({tostr(db.name, " (", db, ")")})};
  105795. endif
  105796. endfor
  105797. return text;
  105798. .
  105799. #61:5
  105800. hdr = "Available Help Indices";
  105801. text = {"", hdr, $string_utils:space(hdr, "-")};
  105802. for db in ($code_utils:help_db_list())
  105803. if ($object_utils:isa(db, $generic_help))
  105804. for p in (properties(db))
  105805. if ((h = db.(p)) && ("*index*" in h))
  105806. text = {@text, tostr($string_utils:left(p, 14), " -- ", h[2] || db.name, " (", db, ")")};
  105807. endif
  105808. endfor
  105809. endif
  105810. endfor
  105811. for p in (properties(this))
  105812. if (this.(p) && (this.(p)[1] == "*full_index*"))
  105813. return {@text, "", tostr($string_utils:left(p, 14), " -- ", "EVERYTHING")};
  105814. endif
  105815. endfor
  105816. return text;
  105817. .
  105818. #61:6
  105819. wizzes = {#2, @$list_utils:randomly_permute(setremove($object_utils:leaves($wiz), #2))};
  105820. numwiz = length(wizzes);
  105821. hlist = {"ArchWizard:", "Wizard" + ((numwiz == 2) ? ":" | "s:"), @$list_utils:make(max(0, numwiz - 2), "")};
  105822. slist = {};
  105823. su = $string_utils;
  105824. for i in [1..numwiz]
  105825. wiz = wizzes[i];
  105826. slist = {@slist, tostr(su:left(hlist[i], 13), su:left(wiz.name, 16), (wpi = wiz.public_identity.name) ? (" (a.k.a. " + wpi) + ")" | "")};
  105827. endfor
  105828. return slist;
  105829. .
  105830. #61:7
  105831. if (((text = pass(@args)) != E_PROPNF) || ((!valid(object = $string_utils:match_object(what = args[1], player.location))) || (!$object_utils:has_property(object, "help_msg"))))
  105832. return text;
  105833. else
  105834. return {tostr(";;", $code_utils:corify_object(object), ".help_msg = $command_utils:read_lines()"), @$command_utils:dump_lines((typeof(text = object.help_msg) == LIST) ? text | {text})};
  105835. endif
  105836. .
  105837. #62:0
  105838. "Return a toad (child of #1, owned by $hacker) from this.contents.  Move it to #-1.  Recreate as a child of args[1], or of #1 if no args are given.  Chown to caller_perms() or args[2] if present.";
  105839. what = (args ? args[1] | #1);
  105840. who = ((length(args) == 2) ? args[2] | caller_perms());
  105841. if (!(caller_perms().wizard || (who == caller_perms())))
  105842. return E_PERM;
  105843. elseif (!(valid(what) && is_player(who)))
  105844. return E_INVARG;
  105845. elseif ((((who != what.owner) && (!what.f)) && (!who.wizard)) && (!caller_perms().wizard))
  105846. return E_PERM;
  105847. endif
  105848. for potential in (this.contents)
  105849. if (((potential.owner == $hacker) && (parent(potential) == $garbage)) && (!children(potential)))
  105850. return this:setup_toad(potential, who, what);
  105851. endif
  105852. endfor
  105853. return E_NONE;
  105854. .
  105855. #62:1
  105856. "Take the object in args[1], and turn it into a child of #1 owned by $hacker.";
  105857. item = args[1];
  105858. if (!$perm_utils:controls(caller_perms(), item))
  105859. $error:raise(E_PERM);
  105860. endif
  105861. this:addhist(caller_perms(), item);
  105862. if (is_player(item))
  105863. $wiz_utils:unset_player(item);
  105864. endif
  105865. "...recreate can fail (:recycle can crash)...";
  105866. this:add_orphan(item);
  105867. $building_utils:recreate(item, $garbage);
  105868. this:remove_orphan(item);
  105869. "...";
  105870. $wiz_utils:set_owner(item, $hacker);
  105871. item.name = tostr("Recyclable ", item);
  105872. move(item, this);
  105873. .
  105874. #62:2
  105875. e = set_task_perms(caller_perms());
  105876. if (typeof(e) == ERR)
  105877. return e;
  105878. else
  105879. val = this:_recreate(@args);
  105880. return (val == E_NONE) ? create(@args) | val;
  105881. endif
  105882. .
  105883. #62:3
  105884. if (caller == this)
  105885. h = this.history;
  105886. if ((len = length(h)) > this.nhist)
  105887. h = h[len - this.nhist..len];
  105888. endif
  105889. this.history = {@h, args};
  105890. endif
  105891. .
  105892. #62:4
  105893. if ($perm_utils:controls(valid(caller_perms()) ? caller_perms() | player, this))
  105894. for x in (this.history)
  105895. pname = (valid(x[1]) ? x[1].name | "A recycled player");
  105896. oname = (valid(x[2]) ? x[2].name | "recycled");
  105897. player:notify(tostr(pname, " (", x[1], ") recycled ", x[2], " (now ", oname, ")"));
  105898. endfor
  105899. else
  105900. player:notify("Sorry.");
  105901. endif
  105902. .
  105903. #62:5
  105904. dobj = (valid(dobj) ? dobj | $string_utils:match_object(dobjstr, player.location));
  105905. if (!valid(dobj))
  105906. dobj = ((n = tonum(dobjstr)) ? toobj(n) | #-1);
  105907. endif
  105908. if (!valid(dobj))
  105909. player:tell("Couldn't parse ", dobjstr, " as a valid object number.");
  105910. elseif (!(dobj in this.contents))
  105911. player:tell("Couldn't find ", dobj, " in ", this.name, ".");
  105912. else
  105913. if (typeof(emsg = this:setup_toad(dobj, player, #1)) != ERR)
  105914. dobj:moveto(player);
  105915. dobj.aliases = {dobj.name = ("Object " + tostr(dobj))};
  105916. player:tell("You now have ", dobj, " ready for @recreation.");
  105917. if (this.announce_removal_msg)
  105918. player.location:announce($string_utils:pronoun_sub(this.announce_removal_msg));
  105919. endif
  105920. else
  105921. player:tell(emsg);
  105922. endif
  105923. endif
  105924. .
  105925. #62:6
  105926. "this:setup_toad(objnum,new_owner,parent)";
  105927. "Called by :_create and :request.";
  105928. if (caller != this)
  105929. return E_PERM;
  105930. endif
  105931. potential = args[1];
  105932. who = args[2];
  105933. what = args[3];
  105934. if (who.ownership_quota <= 0)
  105935. return E_QUOTA;
  105936. else
  105937. $wiz_utils:set_owner(potential, who);
  105938. move(potential, #-1);
  105939. set_task_perms({@callers(), {#-1, "", player}}[2][3]);
  105940. "... if :initialize crashes...";
  105941. this:add_orphan(potential);
  105942. $building_utils:recreate(potential, what);
  105943. this:remove_orphan(potential);
  105944. "... if we don't get this far, the object stays on the orphan list...";
  105945. "... orphan list should be checked periodically...";
  105946. return potential;
  105947. endif
  105948. .
  105949. #62:7
  105950. if (caller == this)
  105951. this.orphans = setadd(this.orphans, args[1]);
  105952. endif
  105953. .
  105954. #62:8
  105955. if (caller == this)
  105956. this.orphans = setremove(this.orphans, args[1]);
  105957. endif
  105958. .
  105959. #62:9
  105960. "Usage:  valid(object)";
  105961. "True if object is valid and not $garbage.";
  105962. return valid(args[1]) && (parent(args[1]) != $garbage);
  105963. .
  105964. #62:10
  105965. this.orphans = {};
  105966. this.history = {};
  105967. pass();
  105968. .
  105969. #63:0
  105970. return ("Garbage object " + tostr(this)) + ".";
  105971. .
  105972. #63:1
  105973. player:tell(this:description());
  105974. .
  105975. #63:2
  105976. return tostr("Recyclable ", this);
  105977. .
  105978. #63:3
  105979. return;
  105980. .
  105981. #64:0
  105982. if (i = (args[1] in {"noinclude", "sender"}))
  105983. return {{{"include", "all"}[i], !args[2]}};
  105984. else
  105985. return {args};
  105986. endif
  105987. .
  105988. #64:1
  105989. "... we'll take anything...";
  105990. raw = args[2];
  105991. if (raw == 1)
  105992. "...+@mail => @mailo=new";
  105993. return {args[1], "new"};
  105994. else
  105995. return args[1..2];
  105996. endif
  105997. .
  105998. #64:2
  105999. oname = args[1];
  106000. raw = args[2];
  106001. if (typeof(raw) == LIST)
  106002. if (length(raw) > 1)
  106003. return "Too many arguments.";
  106004. endif
  106005. raw = raw[1];
  106006. elseif (typeof(raw) == NUM)
  106007. return {oname, raw && ((oname == "manymsgs") ? 20 | 1)};
  106008. endif
  106009. if ((value = $code_utils:tonum(raw)) == E_TYPE)
  106010. return tostr("`", raw, "'?  Number expected.");
  106011. endif
  106012. return {oname, value};
  106013. .
  106014. #64:3
  106015. oname = args[1];
  106016. raw = args[2];
  106017. if (typeof(raw) == STR)
  106018. raw = $string_utils:explode(raw, ",");
  106019. elseif (typeof(raw) == NUM)
  106020. return raw ? "You need to give one or more recipients." | {oname, 0};
  106021. endif
  106022. value = $mail_editor:parse_recipients({}, raw);
  106023. if (value)
  106024. return {oname, value};
  106025. else
  106026. return "No valid recipients in list.";
  106027. endif
  106028. .
  106029. #64:4
  106030. value = this:get(@args);
  106031. if (value)
  106032. return {tostr(value), {tostr("Query when asking for ", value, " or more messages.")}};
  106033. else
  106034. return {0, {"Willing to be spammed with arbitrarily many messages/headers"}};
  106035. endif
  106036. .
  106037. #64:5
  106038. value = this:get(@args);
  106039. if (value)
  106040. return {value, {"Sticky folders:  mail commands default to whatever", "mail collection the previous successful command looked at."}};
  106041. else
  106042. return {0, {"Teflon folders:  mail commands always default to `on me'."}};
  106043. endif
  106044. .
  106045. #64:6
  106046. if (value = this:get(@args))
  106047. return {"", {tostr("Default message sequence for @mail:  ", (typeof(value) == STR) ? value | $string_utils:from_list(value, " "))}};
  106048. else
  106049. return {0, {"Default message sequence for @mail:  last:15"}};
  106050. endif
  106051. .
  106052. #64:7
  106053. if (value = this:get(@args))
  106054. return {"", {tostr("Default Reply-to:  ", $mail_agent:name_list(@value))}};
  106055. else
  106056. return {0, {"No default Reply-to: field"}};
  106057. endif
  106058. .
  106059. #64:8
  106060. if (o = ((name = args[2]) in {"sender", "noinclude"}))
  106061. args[2] = {"all", "include"}[o];
  106062. return {@pass(@args), tostr("(", name, " is a synonym for -", args[2], ")")};
  106063. else
  106064. return pass(@args);
  106065. endif
  106066. .
  106067. #64:9
  106068. "... must be object, list of objects, or false...";
  106069. value = args[1];
  106070. if (typeof(value) == OBJ)
  106071. return {{value}};
  106072. elseif (!this:istype(value, {{OBJ}}))
  106073. return $string_utils:capitalize("Object or list of objects expected.");
  106074. else
  106075. return {value};
  106076. endif
  106077. .
  106078. #67:0
  106079. ":get(options,name) => returns the value of the option specified by name";
  106080. "i.e., if {name,value} is present in options, return value";
  106081. "      if name is present, return 1";
  106082. "      otherwise return 0";
  106083. if ((name = args[2]) in (options = args[1]))
  106084. return 1;
  106085. elseif (a = $list_utils:assoc(name, options))
  106086. return a[2];
  106087. else
  106088. return 0;
  106089. endif
  106090. .
  106091. #67:1
  106092. ":set(optionlist,oname,value) => revised optionlist or string error message.";
  106093. "oname must be the full name of an option in .names or .extras.";
  106094. "Note that values must not be of type ERR.  ";
  106095. "FALSE (0, blank string, or empty list) is always a legal value.";
  106096. "If a verb :check_foo is defined on this, it will be used to typecheck any";
  106097. "non-false or object-type value supplied as a new value for option `foo'.";
  106098. "";
  106099. "   :check_foo(value) => string error message or {value to use}";
  106100. "";
  106101. "If instead there is a property .check_foo, that will give either the expected ";
  106102. "type or a list of allowed types.";
  106103. "Otherwise, the option is taken to be a boolean flag and all non-false, ";
  106104. "non-object values map to 1.";
  106105. "";
  106106. options = args[1];
  106107. if (!(((oname = args[2]) in this.names) || (oname in this.extras)))
  106108. return "Unknown option:  " + oname;
  106109. elseif (typeof(value = args[3]) == ERR)
  106110. "... no option should have an error value...";
  106111. return "Error value";
  106112. elseif ((!value) && (typeof(value) != OBJ))
  106113. "... always accept FALSE (0, blankstring, emptylist)...";
  106114. elseif ($object_utils:has_callable_verb(this, check = ("check_" + oname)))
  106115. "... a :check_foo verb exists; use it to typecheck the value...";
  106116. if (typeof(c = this:(check)(value)) == STR)
  106117. return c;
  106118. endif
  106119. value = c[1];
  106120. elseif ($object_utils:has_property(this, tprop = ("type_" + oname)))
  106121. "... a .type_foo property exists...";
  106122. "... property value should be a type or list of types...";
  106123. if (!this:istype(value, t = this.(tprop)))
  106124. return $string_utils:capitalize(this:desc_type(t) + " value expected.");
  106125. endif
  106126. else
  106127. "... value is considered to be boolean...";
  106128. if (!value)
  106129. "... must be an object.  oops.";
  106130. return tostr("Non-object value expected.");
  106131. endif
  106132. value = 1;
  106133. endif
  106134. "... We now have oname and a value.  However, if oname is one of the extras,";
  106135. "... then we need to call :actual to see what it really means.";
  106136. if (oname in this.names)
  106137. nvlist = {{oname, value}};
  106138. elseif ((typeof(nvlist = this:actual(oname, value)) != LIST) || (!nvlist))
  106139. return nvlist || "Not implemented.";
  106140. endif
  106141. "... :actual returns a list of pairs...";
  106142. for nv in (nvlist)
  106143. oname = nv[1];
  106144. value = nv[2];
  106145. if (i = ((oname in options) || $list_utils:iassoc(oname, options)))
  106146. if ((!value) && (typeof(value) != OBJ))
  106147. "value == 0, blank string, empty list";
  106148. options[i..i] = {};
  106149. elseif (value == 1)
  106150. options[i] = oname;
  106151. else
  106152. options[i] = {oname, value};
  106153. endif
  106154. elseif (value || (typeof(value) == OBJ))
  106155. options[1..0] = {(value == 1) ? oname | {oname, value}};
  106156. endif
  106157. endfor
  106158. return options;
  106159. .
  106160. #67:2
  106161. ":parse(args[,...]) => {oname [,value]} or string error message";
  106162. "additional arguments are fed straight through to :parse_* routines.";
  106163. " <option> <value>     => {option, value}";
  106164. " <option>=<value>     => {option, value}";
  106165. " <option> is <value>  => {option, value}";
  106166. " +<option>            => {option, 1}";
  106167. " -<option>            => {option, 0}";
  106168. " !<option>            => {option, 0}";
  106169. " <option>             => {option}";
  106170. if (!(words = args[1]))
  106171. return "";
  106172. endif
  106173. option = words[1];
  106174. words[1..1] = {};
  106175. if (flag = (option && index("-+!", option[1])))
  106176. option[1..1] = "";
  106177. endif
  106178. if (i = index(option, "="))
  106179. rawval = option[i + 1..length(option)];
  106180. option = option[1..i - 1];
  106181. if (i == 1)
  106182. "... =bar ...";
  106183. return "Blank option name?";
  106184. elseif (flag)
  106185. "... +foo=bar";
  106186. return "Don't give a value if you use +, -, or !";
  106187. elseif (words)
  106188. "... foo=bar junk";
  106189. return $string_utils:from_list(words, " ") + "??";
  106190. endif
  106191. elseif (!option)
  106192. return "Blank option name?";
  106193. elseif (flag)
  106194. if (words)
  106195. "... +foo junk";
  106196. return "Don't give a value if you use +, -, or !";
  106197. endif
  106198. rawval = ((flag - 1) % 2);
  106199. else
  106200. words && ((words[1] == "is") && (words[1..1] = {}));
  106201. rawval = words;
  106202. endif
  106203. "... do we know about this option?...";
  106204. if (!(oname = this:_name(strsub(option, "-", "_"))))
  106205. return tostr((oname == $failed_match) ? "Unknown" | "Ambiguous", " option:  ", option);
  106206. endif
  106207. "... determine new value...";
  106208. if (!rawval)
  106209. "... `@option foo is' or `@option foo=' ...";
  106210. return (rawval == {}) ? {oname} | {oname, 0};
  106211. elseif ($object_utils:has_callable_verb(this, pverb = ("parse_" + oname)))
  106212. return this:(pverb)(oname, rawval, args[2..length(args)]);
  106213. elseif (rawval in {0, "0", {"0"}})
  106214. return {oname, 0};
  106215. elseif (rawval in {1, "1", {"1"}})
  106216. return {oname, 1};
  106217. else
  106218. return tostr("Option is a flag, use `+", option, "' or `-", option, "' (or `!", option, "')");
  106219. endif
  106220. .
  106221. #67:3
  106222. ":_name(string) => full option name corresponding to string ";
  106223. "               => $failed_match or $ambiguous_match as appropriate.";
  106224. if (((string = args[1]) in this.names) || (string in this.extras))
  106225. return string;
  106226. endif
  106227. char = (namestr = this._namelist)[1];
  106228. if (!(i = index(namestr, char + string)))
  106229. return $failed_match;
  106230. elseif (i != rindex(namestr, char + string))
  106231. return $ambiguous_match;
  106232. else
  106233. j = index(namestr[i + 1..length(namestr)], char);
  106234. return namestr[i + 1..(i + j) - 1];
  106235. endif
  106236. .
  106237. #67:4
  106238. ":add_name(name[,isextra]) adds name to the list of options recognized.";
  106239. "name must be a nonempty string and must not contain spaces, -, +, !, or =.";
  106240. "isextra true means that name isn't an actual option (recognized by :get) but merely a name that the option setting command should recognize to set a particular combination of options.  Actual options go in .names; others go in .extras";
  106241. name = args[1];
  106242. isextra = {@args, 0}[2];
  106243. if (!$perm_utils:controls(caller_perms(), this))
  106244. return E_PERM;
  106245. elseif ((!name) || match(name, "[-!+= ]"))
  106246. "...name is blank or contains a forbidden character";
  106247. return E_INVARG;
  106248. elseif (name in this.names)
  106249. "...name is already in option list";
  106250. if (isextra)
  106251. this.names = setremove(this.names, name);
  106252. this.extras = setadd(this.extras, name);
  106253. return 1;
  106254. else
  106255. return 0;
  106256. endif
  106257. elseif (name in this.extras)
  106258. if (isextra)
  106259. return 0;
  106260. else
  106261. this.names = setadd(this.names, name);
  106262. this.extras = setremove(this.extras, name);
  106263. return 1;
  106264. endif
  106265. else
  106266. char = this._namelist[1];
  106267. if (isextra)
  106268. this.extras = setadd(this.extras, name);
  106269. else
  106270. this.names = setadd(this.names, name);
  106271. endif
  106272. if (!index(this._namelist, (char + name) + char))
  106273. this._namelist = tostr(this._namelist, name, char);
  106274. endif
  106275. return 1;
  106276. endif
  106277. .
  106278. #67:5
  106279. ":remove_name(name) removes name from the list of options recognized.";
  106280. if (!$perm_utils:controls(caller_perms(), this))
  106281. return E_PERM;
  106282. elseif (!(((name = args[1]) in this.names) || (name in this.extras)))
  106283. "...hmm... already gone...";
  106284. return 0;
  106285. else
  106286. char = this._namelist[1];
  106287. this._namelist = strsub(this._namelist, (char + name) + char, char);
  106288. this.names = setremove(this.names, name);
  106289. this.extras = setremove(this.extras, name);
  106290. return 1;
  106291. endif
  106292. .
  106293. #67:6
  106294. ":show(options,name or list of names)";
  106295. " => text describing current value of option and what it means";
  106296. name = args[2];
  106297. if (typeof(name) == LIST)
  106298. text = {};
  106299. for n in (name)
  106300. text = {@text, @this:show(@listset(args, n, 2))};
  106301. endfor
  106302. return text;
  106303. elseif (!((name in this.names) || (name in this.extras)))
  106304. return {"Unknown option:  " + name};
  106305. elseif ($object_utils:has_callable_verb(this, sverb = ("show_" + name)))
  106306. r = this:(sverb)(@args);
  106307. value = r[1];
  106308. desc = r[2];
  106309. elseif ($object_utils:has_property(this, sverb) && ((value = this:get(args[1], name)) in {0, 1}))
  106310. desc = this.(sverb)[value + 1];
  106311. if (typeof(desc) == STR)
  106312. desc = {desc};
  106313. endif
  106314. elseif (name in this.extras)
  106315. return {name + " not documented (complain)"};
  106316. else
  106317. value = this:get(args[1], name);
  106318. desc = {"not documented (complain)"};
  106319. if (typeof(value) in {LIST, STR})
  106320. desc[1..0] = $string_utils:print(value);
  106321. value = "";
  106322. endif
  106323. endif
  106324. if (value in {0, 1})
  106325. which = ("-+"[value + 1] + name);
  106326. elseif ((typeof(value) in {OBJ, STR, NUM}) && (value != ""))
  106327. which = tostr(" ", name, "=", value);
  106328. else
  106329. which = (" " + name);
  106330. endif
  106331. show = {$string_utils:left(which, this.namewidth) + desc[1]};
  106332. for i in [2..length(desc)]
  106333. show = {@show, $string_utils:space(this.namewidth) + desc[i]};
  106334. endfor
  106335. return show;
  106336. .
  106337. #67:7
  106338. ":actual(<name>,<value>) => list of {<name>,<value>} pairs or string errormsg";
  106339. " corresponding to what setting option <name> to <value> actually means";
  106340. " e.g., :actual(\"unfoo\",1) => {{\"foo\",0}}";
  106341. " e.g., :actual(\"g7mode\",1) => {{\"splat\",37},{\"baz\",#3}}";
  106342. return "Not implemented.";
  106343. .
  106344. #67:8
  106345. ":istype(value,types) => whether value is one of the given types";
  106346. if ((vtype = typeof(value = args[1])) in (types = args[2]))
  106347. return 1;
  106348. elseif (vtype != LIST)
  106349. return 0;
  106350. else
  106351. for t in (types)
  106352. if ((typeof(t) == LIST) && this:islistof(value, t))
  106353. return 1;
  106354. endif
  106355. endfor
  106356. endif
  106357. return 0;
  106358. .
  106359. #67:9
  106360. ":islistof(value,types) => whether value (a list) has each element being one of the given types";
  106361. types = args[2];
  106362. for v in (value = args[1])
  106363. if (!this:istype(v, types))
  106364. return 0;
  106365. endif
  106366. endfor
  106367. return 1;
  106368. .
  106369. #67:10
  106370. ":desc_type(types) => string description of types";
  106371. nlist = {};
  106372. for t in (types = args[1])
  106373. if (typeof(t) == LIST)
  106374. if (length(t) > 1)
  106375. nlist = {@nlist, tostr("(", this:desc_type(t), ")-list")};
  106376. else
  106377. nlist = {@nlist, tostr(this:desc_type(t), "-list")};
  106378. endif
  106379. elseif (t in {NUM, OBJ, STR, LIST})
  106380. nlist = {@nlist, {"number", "object", "string", "?", "list"}[t + 1]};
  106381. else
  106382. return "Bad type list";
  106383. endif
  106384. endfor
  106385. return $string_utils:english_list(nlist, "nothing", " or ");
  106386. .
  106387. #68:0
  106388. if (i = (args[1] in {"numbers"}))
  106389. return {{{"nonumbers"}[i], !args[2]}};
  106390. else
  106391. return {args};
  106392. endif
  106393. .
  106394. #68:1
  106395. if (o = ((name = args[2]) in {"numbers"}))
  106396. args[2] = {"nonumbers"}[o];
  106397. return {@pass(@args), tostr("(", name, " is a synonym for -", args[2], ")")};
  106398. else
  106399. return pass(@args);
  106400. endif
  106401. .
  106402. #69:0
  106403. this:(this.names[tonum(args[1]) + 1])();
  106404. .
  106405. #69:1
  106406. "... hmmm... don't know how to raise E_NONE...";
  106407. return E_NONE;
  106408. .
  106409. #69:2
  106410. "...raise E_TYPE ...";
  106411. 1[2];
  106412. .
  106413. #69:3
  106414. "...raise E_DIV ...";
  106415. 1 / 0;
  106416. .
  106417. #69:4
  106418. "...raise E_PERM ...";
  106419. this.owner.password;
  106420. .
  106421. #69:5
  106422. "...raise E_PROPNF ...";
  106423. this.a;
  106424. .
  106425. #69:6
  106426. "...raise E_VERBNF ...";
  106427. this:a();
  106428. .
  106429. #69:7
  106430. "...raise E_VARNF ...";
  106431. a;
  106432. .
  106433. #69:8
  106434. "...raise E_INVIND ...";
  106435. #-1.a;
  106436. .
  106437. #69:9
  106438. move(this, this);
  106439. .
  106440. #69:10
  106441. "...raise E_MAXREC ...";
  106442. this:(verb)();
  106443. .
  106444. #69:11
  106445. "...raise E_RANGE ...";
  106446. {}[1];
  106447. .
  106448. #69:12
  106449. "...raise E_ARGS ...";
  106450. tonum();
  106451. .
  106452. #69:13
  106453. "...raise E_NACC ...";
  106454. move($hacker, this);
  106455. .
  106456. #69:14
  106457. "...raise E_INVARG ...";
  106458. parent(#-1);
  106459. .
  106460. #69:15
  106461. set_task_perms($no_one);
  106462. "...raise E_QUOTA ...";
  106463. create($thing);
  106464. .
  106465. #69:16
  106466. return 0;
  106467. .
  106468. #69:17
  106469. return this.names[tonum(args[1]) + 1];
  106470. .
  106471. #70:0
  106472. if (caller_perms().wizard)
  106473. pass();
  106474. "this:rm_message_seq({1, 1 + this:length_all_msgs()})";
  106475. "this:expunge_rmm()";
  106476. for p in (properties(this))
  106477. $command_utils:suspend_if_needed(0);
  106478. if (p && (p[1] == " "))
  106479. delete_property(this, p);
  106480. endif
  106481. endfor
  106482. this.messages = (this.messages_going = {});
  106483. this.mail_forward = {player, this};
  106484. this.mail_notify = {player};
  106485. for p in ({"moderator_forward", "moderator_notify", "writers", "readers", "expire_period", "last_used_time"})
  106486. this.(p) = $mail_recipient.(p);
  106487. endfor
  106488. this.moderated = 1;
  106489. else
  106490. return E_PERM;
  106491. endif
  106492. .
  106493. #71:0
  106494. player:tell_lines(this:description());
  106495. player:tell($string_utils:pronoun_sub("%S %<is> moving around from room to room, cleaning up.", this));
  106496. .
  106497. #71:1
  106498. "$housekeeper:cleanup([insist]) => clean up player's objects. Argument is 'up' or 'up!' for manually requested cleanups (notify player differently)";
  106499. if (caller_perms() != this)
  106500. return E_PERM;
  106501. endif
  106502. for object in (this.clean)
  106503. x = (object in this.clean);
  106504. if (this.requestors[x] == player)
  106505. if (result = this:replace(object, @args))
  106506. player:tell(result, ".");
  106507. endif
  106508. endif
  106509. $command_utils:suspend_if_needed(0);
  106510. endfor
  106511. player:tell("The housekeeper has finished cleaning up your objects.");
  106512. .
  106513. #71:2
  106514. "replace the object given to its proper spot (if there is one).";
  106515. object = args[1];
  106516. insist = ((length(args) > 1) && args[2]);
  106517. notify(this, tostr("cleaning ", object, " task ", task_id(), " insist ", insist));
  106518. i = (object in this.clean);
  106519. if (!i)
  106520. return tostr(object, " is not on the ", this.name, "'s cleanup list");
  106521. endif
  106522. place = this.destination[i];
  106523. if (!(($recycler:valid(object) && ($recycler:valid(place) || (place == #-1))) && (!(object.location in this.recycle_bins))))
  106524. "object no longer valid (recycled or something), remove it.";
  106525. this.clean = listdelete(this.clean, i);
  106526. this.requestors = listdelete(this.requestors, i);
  106527. this.destination = listdelete(this.destination, i);
  106528. return tostr(object) + " is no longer valid, removed from cleaning list";
  106529. endif
  106530. oldloc = (loc = object.location);
  106531. if (object.location == place)
  106532. "already in its place";
  106533. return "";
  106534. endif
  106535. requestor = this.requestors[i];
  106536. if (insist != "up!")
  106537. for thing in (object.contents)
  106538. if (thing:is_listening())
  106539. return ((("Not returning " + object.name) + " because ") + thing.name) + " is inside";
  106540. endif
  106541. $command_utils:suspend_if_needed(0);
  106542. endfor
  106543. if (valid(loc) && (loc != $limbo))
  106544. if (loc:is_listening())
  106545. return ((("Not returning " + object.name) + " because ") + loc.name) + " is holding it";
  106546. endif
  106547. for y in (loc:contents())
  106548. if ((y != object) && y:is_listening())
  106549. return (((("Not returning " + object.name) + " because ") + y.name) + " is in ") + loc.name;
  106550. endif
  106551. $command_utils:suspend_if_needed(0);
  106552. endfor
  106553. endif
  106554. endif
  106555. if (valid(place) && (!place:accept(object)))
  106556. return (place.name + " won't accept ") + object.name;
  106557. endif
  106558. requestor:tell("As you requested, the housekeeper tidies ", $string_utils:nn(object), " from ", $string_utils:nn(loc), " to ", $string_utils:nn(place), ".");
  106559. if ($object_utils:has_verb(loc, "announce_all_but"))
  106560. loc:announce_all_but({requestor, object}, "At ", requestor.name, "'s request, the ", this.name, " sneaks in, picks up ", object.name, " and hurries off to put ", ($object_utils:has_property(object, "po") && (typeof(object.po) == STR)) ? object.po | "it", " away.");
  106561. endif
  106562. this:moveit(object, place, requestor);
  106563. if ((loc = object.location) == oldloc)
  106564. return (object.name + " wouldn't go; ") + ((!place:accept(object)) ? (" perhaps " + $string_utils:nn(place)) + " won't let it in" | ((" perhaps " + $string_utils:nn(loc)) + " won't let go of it"));
  106565. endif
  106566. object:tell("The housekeeper puts you away.");
  106567. if ($object_utils:isa(loc, $room))
  106568. loc:announce_all_but({object}, "At ", requestor.name, "'s request, the housekeeper sneaks in, deposits ", object:title(), " and leaves.");
  106569. else
  106570. loc:tell("You notice the housekeeper sneak in, give you ", object:title(), " and leave.");
  106571. endif
  106572. return "";
  106573. .
  106574. #71:3
  106575. if (args)
  106576. if (!valid(who = args[1]))
  106577. return;
  106578. endif
  106579. player:tell(who.name, "'s personal cleanup list:");
  106580. else
  106581. who = 0;
  106582. player:tell("Housekeeper's complete cleanup list:");
  106583. endif
  106584. player:tell("------------------------------------------------------------------");
  106585. printed_anything = 0;
  106586. objs = this.clean;
  106587. reqs = this.requestors;
  106588. dest = this.destination;
  106589. for i in [1..length(objs)]
  106590. $command_utils:suspend_if_needed(2);
  106591. req = reqs[i];
  106592. ob = objs[i];
  106593. place = dest[i];
  106594. if (((who == 0) || (req == who)) || (ob.owner == who))
  106595. if (!valid(ob))
  106596. player:tell($string_utils:left(tostr(ob), 7), $string_utils:left("** recycled **", 50), "(", req.name, ")");
  106597. else
  106598. player:tell($string_utils:left(tostr(ob), 7), $string_utils:left(ob.name, 26), "=>", $string_utils:left(tostr(place), 7), place.name || "nowhere", " (", req.name, ")");
  106599. endif
  106600. printed_anything = 1;
  106601. endif
  106602. endfor
  106603. if (!printed_anything)
  106604. player:tell("** The housekeeper has nothing in the cleanup list.");
  106605. endif
  106606. player:tell("------------------------------------------------------------------");
  106607. .
  106608. #71:4
  106609. if (!$perm_utils:controls(caller_perms(), this))
  106610. return E_PERM;
  106611. endif
  106612. what = args[1];
  106613. if ((what < #1) || (!valid(what)))
  106614. return "invalid object";
  106615. endif
  106616. who = ((length(args) > 1) ? args[2] | player);
  106617. where = ((length(args) > 2) ? args[3] | what.location);
  106618. if ($object_utils:isa(who, $guest))
  106619. return tostr("Guests can't use the ", this.name, ".");
  106620. endif
  106621. if (!is_player(who))
  106622. return tostr("Non-players can't use the ", this.name, ".");
  106623. endif
  106624. if (!valid(where))
  106625. return tostr("The ", this.name, "doesn't know how to find ", where, " in order to put away ", what.name, ".");
  106626. endif
  106627. if (is_player(what))
  106628. return ("The " + this.name) + " doesn't do players, except to cart them home when they fall asleep.";
  106629. endif
  106630. for x in (this.eschews)
  106631. if ($object_utils:isa(what, x[1]))
  106632. ok = 0;
  106633. for y in [3..length(x)]
  106634. if ($object_utils:isa(what, x[y]))
  106635. ok = 1;
  106636. endif
  106637. endfor
  106638. if (!ok)
  106639. return tostr("The ", this.name, " doesn't do ", x[2], "!");
  106640. endif
  106641. endif
  106642. endfor
  106643. if ($object_utils:has_callable_verb(where, "litterp") ? where:litterp(what) | ((where in this.public_places) && (!(what in where.residents))))
  106644. return tostr("The ", this.name, " won't litter ", where.name, "!");
  106645. endif
  106646. if (i = (what in this.clean))
  106647. if ((!this:controls(i, who)) && valid(this.destination[i]))
  106648. return tostr(this.requestors[i].name, " already asked that ", what.name, " be kept at ", this.destination[i].name, "!");
  106649. endif
  106650. this.requestors[i] = who;
  106651. this.destination[i] = where;
  106652. else
  106653. this.clean = {what, @this.clean};
  106654. this.requestors = {who, @this.requestors};
  106655. this.destination = {where, @this.destination};
  106656. endif
  106657. return tostr("The ", this.name, " will keep ", what.name, " (", what, ") at ", valid(where) ? ((where.name + " (") + tostr(where)) + ")" | where, ".");
  106658. .
  106659. #71:5
  106660. if (!$perm_utils:controls(caller_perms(), this))
  106661. return E_PERM;
  106662. endif
  106663. what = args[1];
  106664. who = ((length(args) > 1) ? args[2] | player);
  106665. if (i = (what in this.clean))
  106666. if (!this:controls(i, who))
  106667. return tostr("You may remove an object from ", this.name, " list only if you own the object, the place it is kept, or if you placed the original cleaning order.");
  106668. endif
  106669. this.clean = listdelete(this.clean, i);
  106670. this.destination = listdelete(this.destination, i);
  106671. this.requestors = listdelete(this.requestors, i);
  106672. return tostr(what.name, " (", what, ") removed from cleanup list.");
  106673. else
  106674. return tostr(what.name, " not in cleanup list.");
  106675. endif
  106676. .
  106677. #71:6
  106678. "does player control entry I?";
  106679. i = args[1];
  106680. who = args[2];
  106681. if ((who in {this.owner, @this.owners}) || who.wizard)
  106682. return "Yessir.";
  106683. endif
  106684. i = args[1];
  106685. cleanable = this.clean[i];
  106686. if (this.requestors[i] == who)
  106687. return "you asked for the previous result, you can change this one.";
  106688. elseif (((who == cleanable.owner) || (!valid(dest = this.destination[i]))) || (who == dest.owner))
  106689. return "you own the object or the place where it is being cleaned to, or the destination is no longer valid.";
  106690. else
  106691. return "";
  106692. endif
  106693. .
  106694. #71:7
  106695. "start the housekeeper cleaning continuously. Kill any previous continuous";
  106696. "task. Not meant to be called interactively.";
  106697. if (!$perm_utils:controls(caller_perms(), this))
  106698. return E_PERM;
  106699. endif
  106700. if (this.task)
  106701. taskn = this.task;
  106702. this.task = 0;
  106703. kill_task(taskn);
  106704. endif
  106705. fork taskn (0)
  106706. while (1)
  106707. for x in (this.clean)
  106708. fork (0)
  106709. this:replace(x);
  106710. endfork
  106711. suspend(this.testing ? 2 | this:time());
  106712. endfor
  106713. suspend(5);
  106714. this:litterbug();
  106715. endwhile
  106716. endfork
  106717. this.task = taskn;
  106718. .
  106719. #71:8
  106720. for room in (this.public_places)
  106721. for thingy in (room.contents)
  106722. suspend(10);
  106723. litter = 0;
  106724. if (((thingy.location == room) && this:is_litter(thingy)) && (!this:is_watching(thingy, #-1)))
  106725. "if it is litter and no-one is watching";
  106726. fork (0)
  106727. this:send_home(thingy);
  106728. endfork
  106729. suspend(0);
  106730. endif
  106731. endfor
  106732. endfor
  106733. .
  106734. #71:9
  106735. return valid(thing = args[1]) && thing:is_listening();
  106736. .
  106737. #71:10
  106738. if (caller != this)
  106739. return E_PERM;
  106740. endif
  106741. litter = args[1];
  106742. littering = litter.location;
  106743. this:ejectit(litter, littering);
  106744. home = litter.location;
  106745. if ($object_utils:isa(home, $room))
  106746. home:announce_all("The ", this.name, " sneaks in, deposits ", litter:title(), " and leaves.");
  106747. else
  106748. loc:tell("You notice the ", this.name, " sneak in, give you ", litter:title(), " and leave.");
  106749. endif
  106750. if ($object_utils:has_callable_verb(littering, "announce_all_but"))
  106751. littering:announce_all_but({litter}, "The ", this.name, " sneaks in, picks up ", litter:title(), " and rushes off to put it away.");
  106752. endif
  106753. .
  106754. #71:11
  106755. "Wizardly verb to move object with requestor's permission";
  106756. if (caller != this)
  106757. return E_PERM;
  106758. else
  106759. set_task_perms(player = args[3]);
  106760. return args[1]:moveto(args[2]);
  106761. endif
  106762. .
  106763. #71:12
  106764. "this:ejectit(object,room): Eject args[1] from args[2].  Callable only by housekeeper's quarters verbs.";
  106765. if (caller == this)
  106766. args[2]:eject(args[1]);
  106767. endif
  106768. .
  106769. #71:13
  106770. what = args[1];
  106771. if (!(where = (what in this.clean)))
  106772. return 0;
  106773. else
  106774. return {this.destination[where], this.requestors[where]};
  106775. endif
  106776. .
  106777. #71:14
  106778. thingy = args[1];
  106779. for x in (this.litter)
  106780. if ($object_utils:isa(thingy, x[1]) && (!$object_utils:isa(thingy, x[2])))
  106781. return 1;
  106782. endif
  106783. endfor
  106784. return 0;
  106785. .
  106786. #71:15
  106787. if (caller_perms().wizard)
  106788. this.password = "Impossible password to type";
  106789. this.litter = {};
  106790. this.public_places = {};
  106791. this.requestors = {};
  106792. this.destination = {};
  106793. this.clean = {};
  106794. this.eschews = {};
  106795. this.recycle_bins = {};
  106796. this.cleaning = #-1;
  106797. this.task = 0;
  106798. this.owners = {#2};
  106799. pass(@args);
  106800. endif
  106801. .
  106802. #71:16
  106803. count = 0;
  106804. for i in (this.requestors)
  106805. if (i == player)
  106806. count = (count + 1);
  106807. endif
  106808. $command_utils:suspend_if_needed(1);
  106809. endfor
  106810. player:tell("Number of items in cleanup list: ", tostr(length(this.clean)));
  106811. player:tell("Number of items you requested to be tidied: ", tostr(count));
  106812. player:tell("Number of requestors: ", tostr(length($list_utils:remove_duplicates(this.requestors))));
  106813. player:tell("Time to complete one cleaning circuit: ", $time_utils:english_time(length(this.clean) * this:time()));
  106814. .
  106815. #71:17
  106816. "return a string status if the hosuekeeper is cleaning this object";
  106817. cleanable = args[1];
  106818. info = this:is_object_cleaned(cleanable);
  106819. if (info == 0)
  106820. return tostr(cleanable.name, " is not cleaned by the ", this.name, ".");
  106821. else
  106822. return tostr(cleanable.name, " is kept tidy at ", info[1].name, " (", info[1], ") at ", info[2].name, "'s request.");
  106823. endif
  106824. .
  106825. #71:18
  106826. "Returns the amount of time to suspend between objects while continuous cleaning.";
  106827. "Currently set to try to complete cleaning circuit in one hour, but not exceed one object every 20 seconds.";
  106828. return max(20, 3600 / length(this.clean));
  106829. .
  106830. #71:19
  106831. return caller == this;
  106832. .
  106833. #72:0
  106834. "Given an email address, return {userid, site}.";
  106835. "Valid addresses are of the form `userid[@site]'.";
  106836. "At least for now, if [@site] is left out, site will be returned as blank.";
  106837. "Should be a default address site, or something, somewhere.";
  106838. address = args[1];
  106839. return (at = index(address, "@")) ? {address[1..at - 1], address[at + 1..length(address)]} | {address, ""};
  106840. .
  106841. #72:1
  106842. "given a site, try to figure out what the `local' domain is.";
  106843. "if site has a @ or a % in it, give up and return E_INVARG.";
  106844. "blank site is returned as is; try this:local_domain(this.localhost) for the answer you probably want.";
  106845. site = args[1];
  106846. if (index(site, "@") || index(site, "%"))
  106847. return E_INVARG;
  106848. elseif (match(site, "^[0-9.]+$"))
  106849. return E_INVARG;
  106850. elseif (!site)
  106851. return "";
  106852. elseif (!(dot = rindex(site, ".")))
  106853. dot = rindex(site = this.site, ".");
  106854. endif
  106855. if ((!dot) || (!(dot = rindex(site[1..dot - 1], "."))))
  106856. return site;
  106857. else
  106858. domain = site[dot + 1..length(site)];
  106859. site = site[1..dot - 1];
  106860. while (site && (domain in this.large_domains))
  106861. if (dot = rindex(site, "."))
  106862. domain = tostr(site[dot + 1..length(site)], ".", domain);
  106863. site = site[1..dot - 1];
  106864. else
  106865. return tostr(site, ".", domain);
  106866. endif
  106867. endwhile
  106868. return domain;
  106869. endif
  106870. .
  106871. #72:2
  106872. ":open(address, port, [connect-connection-to])";
  106873. "Open a network connection to address/port.  If the connect-connection-to is passed, then the connection will be connected to that object when $login gets ahold of it.  If not, then the connection is just ignored by $login, i.e. not bothered by it with $welcome_message etc.";
  106874. "The object specified by connect-connection-to has to be a player (though it need not be a $player).";
  106875. "Returns the (initial) connection or an error, as in open_network_connection";
  106876. if (!this:trust(forwhom = caller_perms()))
  106877. return E_PERM;
  106878. endif
  106879. address = args[1];
  106880. port = args[2];
  106881. if (length(args) < 3)
  106882. connect_to = $nothing;
  106883. elseif ((typeof(connect_to = args[3]) == OBJ) && (valid(connect_to) && is_player(connect_to)))
  106884. else
  106885. return E_INVARG;
  106886. endif
  106887. if (typeof(connection = open_network_connection(address, port)) != ERR)
  106888. this.open_connections = {@this.open_connections, connection};
  106889. if (valid(connect_to))
  106890. this.connect_connections_to = {@this.connect_connections_to, {connection, connect_to}};
  106891. endif
  106892. endif
  106893. return connection;
  106894. .
  106895. #72:3
  106896. if (!this:trust(caller_perms()))
  106897. return E_PERM;
  106898. endif
  106899. boot_player(args[1]);
  106900. $login.ignored = setremove($login.ignored, args[1]);
  106901. $network.open_connections = setremove($network.open_connections, args[1]);
  106902. if (i = $list_utils:iassoc(args[1], $network.connect_connections_to))
  106903. $network.connect_connections_to = listdelete($network.connect_connections_to, i);
  106904. endif
  106905. return 1;
  106906. .
  106907. #72:4
  106908. "sendmail(to, subject, @lines)";
  106909. "  sends mail to internet address 'to', with given subject.";
  106910. "  It fills in various fields, such as date, from (from player), etc.";
  106911. "  lines are remaining lines of the message, and may begin with additional header fields.";
  106912. "  (must match RFC822 specification).";
  106913. "Requires $network.trust to call (no anonymous mail from MOO).";
  106914. "Returns 0 if successful, or else error condition or string saying why not.";
  106915. if (!this:trust(caller_perms()))
  106916. return E_PERM;
  106917. endif
  106918. mooname = this.MOO_name;
  106919. mooinfo = tostr(mooname, " (", this.site, " ", this.port, ")");
  106920. if (reason = this:invalid_email_address(to = args[1]))
  106921. return reason;
  106922. endif
  106923. return this:raw_sendmail(to, "Date: " + ctime(), ((((("From: \"" + player.name) + "@") + mooname) + "\" <") + this.reply_address) + ">", "To: " + to, "Subject: " + args[2], "X-Mail-Agent: " + mooinfo, @args[3..length(args)]);
  106924. .
  106925. #72:5
  106926. return (who = args[1]).wizard || (who in this.trusts);
  106927. .
  106928. #72:6
  106929. if (caller_perms().wizard)
  106930. pass(@args);
  106931. this.active = 0;
  106932. this.reply_address = "moomailreplyto@yourhost";
  106933. this.site = "yoursite";
  106934. this.postmaster = "postmastername@yourhost";
  106935. this.MOO_name = "YourMOO";
  106936. this.maildrop = "localhost";
  106937. this.port = 7777;
  106938. this.large_domains = {};
  106939. this.trusts = {};
  106940. this.open_connections = (this.connect_connections_to = {});
  106941. endif
  106942. .
  106943. #72:7
  106944. "rawsendmail(to, @lines)";
  106945. "sends mail without processing. Returns 0 if successful, or else reason why not.";
  106946. if (!caller_perms().wizard)
  106947. return E_PERM;
  106948. endif
  106949. if (!this.active)
  106950. return "Networking is disabled.";
  106951. endif
  106952. debugging = this.debugging;
  106953. address = args[1];
  106954. body = listdelete(args, 1);
  106955. data = {"HELO " + this.site, ("MAIL FROM:<" + this.postmaster) + ">", ("RCPT TO:<" + address) + ">", "DATA"};
  106956. blank = 0;
  106957. for x in (body)
  106958. $command_utils:suspend_if_needed(0);
  106959. if (!(blank || match(x, "[a-z0-9-]*: ")))
  106960. if (x)
  106961. data = {@data, ""};
  106962. endif
  106963. blank = 1;
  106964. endif
  106965. data = {@data, (x == ".") ? "." + x | x};
  106966. endfor
  106967. data = {@data, ".", "QUIT", ""};
  106968. suspend(0);
  106969. target = $network:open(this.maildrop, 25);
  106970. if (typeof(target) == ERR)
  106971. return tostr("Cannot open connection to maildrop ", this.maildrop, ": ", target);
  106972. endif
  106973. fork (0)
  106974. for line in (data)
  106975. $command_utils:suspend_if_needed(0);
  106976. if (debugging)
  106977. notify(this.owner, "SEND:" + line);
  106978. endif
  106979. notify(target, line);
  106980. endfor
  106981. endfork
  106982. expect = {"2", "2", "2", "2", "3", "2"};
  106983. while (expect && (typeof(line = read(target)) != ERR))
  106984. if (line)
  106985. if (debugging)
  106986. notify(this.owner, "GET: " + line);
  106987. endif
  106988. if (!index("23", line[1]))
  106989. $network:close(target);
  106990. return line;
  106991. "error return";
  106992. else
  106993. if (line[1] != expect[1])
  106994. expect = {@expect, "2", "2", "2", "2", "2"};
  106995. else
  106996. expect = listdelete(expect, 1);
  106997. endif
  106998. endif
  106999. endif
  107000. endwhile
  107001. $network:close(target);
  107002. return 0;
  107003. .
  107004. #72:8
  107005. "invalid_email_address(email) -- check to see if email looks like a valid email address. Return reason why not.";
  107006. address = args[1];
  107007. if (!(at = rindex(address, "@")))
  107008. return ("'" + address) + "' contains no @";
  107009. endif
  107010. name = address[1..at - 1];
  107011. host = address[at + 1..length(address)];
  107012. if (!match(host, $network.valid_host_regexp))
  107013. return tostr("'", host, "' doesn't look like a valid internet host");
  107014. endif
  107015. if (!match(name, $network.valid_email_regexp))
  107016. return tostr("'", name, "' doesn't look like a valid user name for internet mail");
  107017. endif
  107018. return "";
  107019. .
  107020. #72:9
  107021. return match(args[1], this.valid_host_regexp) ? "" | tostr("'", args[1], "' doesn't look like a valid internet host name");
  107022. .
  107023. #73:0
  107024. ":_make(...) => new node with value {...}";
  107025. if (!(caller in {this._mgr, this}))
  107026. return E_PERM;
  107027. endif
  107028. prop = this:_genprop();
  107029. add_property(this, prop, args, {$generic_biglist_home.owner, ""});
  107030. return prop;
  107031. .
  107032. #73:1
  107033. ":_kill(node) destroys the given node.";
  107034. if (!(caller in {this, this._mgr}))
  107035. return E_PERM;
  107036. endif
  107037. delete_property(this, args[1]);
  107038. .
  107039. #73:2
  107040. return (caller == this._mgr) ? this.(args[1]) | E_PERM;
  107041. .
  107042. #73:3
  107043. return (caller == this._mgr) ? this.(args[1]) = listdelete(args, 1) | E_PERM;
  107044. .
  107045. #73:4
  107046. gp = this._genprop;
  107047. ngp = "";
  107048. for i in [1..length(gp)]
  107049. if (gp[i] != "z")
  107050. ngp = ((ngp + "bcdefghijklmnopqrstuvwxyz"[strcmp(gp[i], "`")]) + gp[i + 1..length(gp)]);
  107051. return " " + (this._genprop = ngp);
  107052. endif
  107053. ngp = (ngp + "a");
  107054. endfor
  107055. return " " + (this._genprop = (ngp + "a"));
  107056. .
  107057. #73:5
  107058. "this is a dummy. You have to decide what your leaves are going to look like and then write this verb accordingly.  It should, given a leaf/list-element, return the corresponding key value.  So for an ordinary alist, where all of the leaves are of the form {key,datum}, you want:";
  107059. return args[1][1];
  107060. .
  107061. #74:0
  107062. all_help = this.help_msg;
  107063. if (typeof(all_help) == STR)
  107064. all_help = {all_help};
  107065. endif
  107066. helpless = {};
  107067. for vrb in (this.feature_verbs)
  107068. if (loc = $object_utils:has_verb(this, vrb))
  107069. help = $code_utils:verb_documentation(this, vrb);
  107070. if (help)
  107071. all_help = {@all_help, "", (tostr(this) + ":") + verb_info(this, vrb)[3], @help};
  107072. else
  107073. helpless = {@helpless, vrb};
  107074. endif
  107075. endif
  107076. endfor
  107077. if (helpless)
  107078. all_help = {@all_help, "", ("No help found on " + $string_utils:english_list(helpless, "nothing", " or ")) + "."};
  107079. endif
  107080. return {@all_help, "----"};
  107081. .
  107082. #74:1
  107083. "Definition from #1";
  107084. desc = this:description();
  107085. if (desc)
  107086. player:tell_lines(desc);
  107087. else
  107088. player:tell("You see nothing special.");
  107089. endif
  107090. player:tell("Please type \"help ", this, "\" for more information.");
  107091. .
  107092. #74:2
  107093. "Proper usage for the Generic Feature Object:";
  107094. "";
  107095. "First of all, the Generic Feature Object is constructed with the idea";
  107096. "that its children will be @moved to #24300, which is kind of a warehouse";
  107097. "for feature objects.  If there's enough interest, I'll try to make the";
  107098. "stuff that works with that in mind optional.";
  107099. "";
  107100. "Make a short description.  This is so I can continue to have looking at";
  107101. "#24300 give the descriptions of each of the objects in its .contents.";
  107102. "The :look_msg automatically includes a pointer to `help <this object>',";
  107103. "so you don't have to.";
  107104. "";
  107105. "Put a list of the commands you want people to use in";
  107106. "<this object>.feature_verbs.  (You need to use the :set_feature_verbs";
  107107. "verb to do this.)";
  107108. "";
  107109. "When someone types `help <this object>', they will be told the comment";
  107110. "strings from each of the verbs named in .feature_verbs.";
  107111. .
  107112. #74:3
  107113. return this in args[1].features;
  107114. .
  107115. #74:4
  107116. if ($perm_utils:controls(caller_perms(), this) || (caller == this))
  107117. return this.feature_ok = args[1];
  107118. else
  107119. return E_PERM;
  107120. endif
  107121. .
  107122. #74:5
  107123. "Can't see `get' unless it's in the room; can't see `drop' unless it's in the player.  Should possibly go on $thing.";
  107124. "Should use :contents, but I'm in a hurry.";
  107125. hidden = pass(@args);
  107126. if (this.location != args[1])
  107127. hidden = setadd(hidden, {$thing, verb_info($thing, "drop")[3], {"this", "none", "none"}});
  107128. hidden = setadd(hidden, {$thing, verb_info($thing, "give")[3], {"this", "at/to", "any"}});
  107129. endif
  107130. if (this.location != args[1].location)
  107131. hidden = setadd(hidden, {$thing, verb_info($thing, "get")[3], {"this", "none", "none"}});
  107132. endif
  107133. return hidden;
  107134. .
  107135. #74:6
  107136. if ($perm_utils:controls(caller_perms(), this) || (caller == this))
  107137. return this.feature_verbs = args[1];
  107138. else
  107139. return E_PERM;
  107140. endif
  107141. .
  107142. #74:7
  107143. if ((caller == this) || $perm_utils:controls(caller_perms(), this))
  107144. pass(@args);
  107145. this.feature_verbs = {};
  107146. else
  107147. return E_PERM;
  107148. endif
  107149. .
  107150. #75:0
  107151. "Usage:  get_now(site, port, message)";
  107152. "Returns a list of strings, or an error if we couldn't connect.";
  107153. host = args[1];
  107154. port = args[2];
  107155. if (!this:trusted(caller_perms()))
  107156. return E_PERM;
  107157. elseif ((!match(host, $network.valid_host_regexp)) && (!match(host, "[0-9]+%.[0-9]+%.[0-9]+%.[0-9]+")))
  107158. "allow either welformed internet hosts or explicit IP addresses.";
  107159. return E_INVARG;
  107160. elseif (((port != 70) && (port != 80)) && (port < 100))
  107161. "disallow connections to low number ports; necessary?";
  107162. return E_INVARG;
  107163. endif
  107164. opentime = time();
  107165. con = $network:open(args[1], args[2]);
  107166. opentime = (time() - opentime);
  107167. if (typeof(con) == ERR)
  107168. return con;
  107169. endif
  107170. read(con);
  107171. "eliminate blank line";
  107172. notify(con, args[3]);
  107173. results = {};
  107174. count = this.limit;
  107175. "perhaps this isn't necessary, but if a gopher source is slowly spewing things, perhaps we don't want to hang forever -- perhaps this should just fork a process to close the connection instead?";
  107176. now = time();
  107177. timeout = 30;
  107178. end = "^%.$";
  107179. if ((length(args) == 4) && (args[4][1] == "2"))
  107180. end = "^[2-9]";
  107181. endif
  107182. while ((((typeof(string = read(con)) == STR) && (!match(string, end))) && ((count = (count - 1)) > 0)) && ((now + timeout) > (now = time())))
  107183. if (string && (string[1] == "."))
  107184. string = string[2..length(string)];
  107185. endif
  107186. results = {@results, string};
  107187. endwhile
  107188. $network:close(con);
  107189. if (opentime > 0)
  107190. "This is to keep repeated calls to $network:open to 'slow responding hosts' from totally spamming.";
  107191. suspend(0);
  107192. endif
  107193. return results;
  107194. .
  107195. #75:1
  107196. "parse gopher result line:";
  107197. "return {host, port, tag, label}";
  107198. "host/port/tag are what you send to the gopher server to get that line";
  107199. "label is <type>/human readable entry";
  107200. string = args[1];
  107201. tab = index(string, "    ");
  107202. label = string[1..tab - 1];
  107203. string = string[tab + 1..length(string)];
  107204. tab = index(string, "    ");
  107205. tag = string[1..tab - 1];
  107206. string = string[tab + 1..length(string)];
  107207. tab = index(string, "    ");
  107208. host = string[1..tab - 1];
  107209. string = string[tab + 1..length(string)];
  107210. tab = index(string, "    ");
  107211. port = tonum(tab ? string[1..tab - 1] | string);
  107212. return {host, port, tag, label};
  107213. "ignore extra material after port, if any";
  107214. .
  107215. #75:2
  107216. "$gopher:show_text(who, start, end, ..node..)";
  107217. "like who:notify_lines($gopher:get(..node..)[start..end]), but pipelined";
  107218. if (!caller_perms().wizard)
  107219. return E_PERM;
  107220. endif
  107221. who = args[1];
  107222. start = args[2];
  107223. end = args[3];
  107224. args = args[4..length(args)];
  107225. con = $network:open(args[1], args[2]);
  107226. if (typeof(con) == ERR)
  107227. player:tell("Sorry, can't get this information now.");
  107228. return;
  107229. endif
  107230. notify(con, args[3]);
  107231. read(con);
  107232. "initial blank line";
  107233. line = 0;
  107234. sent = 0;
  107235. end = (end || this.limit);
  107236. while (((string = read(con)) != ".") && (typeof(string) == STR))
  107237. line = (line + 1);
  107238. if ((line >= start) && ((!end) || (line <= end)))
  107239. sent = (sent + 1);
  107240. if (valid(who))
  107241. if (string && (string[1] == "."))
  107242. string = string[2..length(string)];
  107243. endif
  107244. who:notify(string);
  107245. else
  107246. notify(who, string);
  107247. endif
  107248. endif
  107249. endwhile
  107250. $network:close(con);
  107251. return sent;
  107252. .
  107253. #75:3
  107254. type = args[1];
  107255. if (type == "1")
  107256. return "menu";
  107257. elseif (type == "?")
  107258. return "menu?";
  107259. elseif (type == "0")
  107260. return "text";
  107261. elseif (type == "7")
  107262. return "search";
  107263. elseif (type == "9")
  107264. return "binary";
  107265. elseif (type == "2")
  107266. return "phone directory";
  107267. elseif (type == "4")
  107268. return "binhex";
  107269. elseif (type == "8")
  107270. return "telnet";
  107271. elseif (type == "I")
  107272. return "image";
  107273. elseif (type == " ")
  107274. "not actually gopher protocol: used by 'goto'";
  107275. return "";
  107276. else
  107277. return "unknown";
  107278. endif
  107279. "not done, need to fill out";
  107280. .
  107281. #75:4
  107282. "return a 'nice' string showing the information in a gopher node";
  107283. if (typeof(parse = args[1]) == STR)
  107284. parse = this:parse(parse);
  107285. endif
  107286. if (parse[1] == "!")
  107287. return {"[remembered set]", "", ""};
  107288. endif
  107289. if (length(parse) > 3)
  107290. label = parse[4];
  107291. if (label)
  107292. type = $gopher:type(label[1]);
  107293. label = label[2..length(label)];
  107294. if (type == "menu")
  107295. elseif (type == "search")
  107296. label = ((("<" + parse[3][rindex(parse[3], "    ") + 1..length(parse[3])]) + "> ") + label);
  107297. else
  107298. label = ((type + ": ") + label);
  107299. endif
  107300. else
  107301. label = "(top)";
  107302. endif
  107303. else
  107304. label = (parse[3] + " (top)");
  107305. endif
  107306. port = "";
  107307. if (parse[2] != 70)
  107308. port = tostr(" ", parse[2]);
  107309. endif
  107310. return {tostr("[", parse[1], port, "]"), label, parse[3]};
  107311. .
  107312. #75:5
  107313. "Usage: get(site, port, selection)";
  107314. "returns a list of strings, or an error if it couldn't connect. Results are cached.";
  107315. request = args[1..3];
  107316. while ((index = (request in this.cache_requests)) && (this.cache_times[index] > time()))
  107317. if (typeof(result = this.cache_values[index]) != NUM)
  107318. return result;
  107319. endif
  107320. if ($code_utils:task_valid(result))
  107321. "spin, let other process getting same data win, or timeout";
  107322. suspend(1);
  107323. else
  107324. "well, other process crashed, or terminated, or whatever.";
  107325. this.cache_times[index] = 0;
  107326. endif
  107327. endwhile
  107328. if (!this:trusted(caller_perms()))
  107329. return E_PERM;
  107330. endif
  107331. while (this.cache_times && (this.cache_times[1] < time()))
  107332. $command_utils:suspend_if_needed(0);
  107333. this.cache_times = listdelete(this.cache_times, 1);
  107334. this.cache_values = listdelete(this.cache_values, 1);
  107335. this.cache_requests = listdelete(this.cache_requests, 1);
  107336. "caution: don't want to suspend between test and removal";
  107337. endwhile
  107338. $command_utils:suspend_if_needed(0);
  107339. this:cache_entry(@request);
  107340. value = this:get_now(@args);
  107341. $command_utils:suspend_if_needed(0);
  107342. index = this:cache_entry(@request);
  107343. this.cache_times[index] = (time() + ((typeof(value) == ERR) ? 120 | 1800));
  107344. this.cache_values[index] = value;
  107345. return value;
  107346. .
  107347. #75:6
  107348. if (!this:trusted(caller_perms()))
  107349. return E_PERM;
  107350. endif
  107351. if (!args)
  107352. this.cache_values = (this.cache_times = (this.cache_requests = {}));
  107353. elseif (index = (args[1..3] in this.cache_requests))
  107354. this.cache_requests = listdelete(this.cache_requests, index);
  107355. this.cache_times = listdelete(this.cache_times, index);
  107356. this.cache_values = listdelete(this.cache_values, index);
  107357. endif
  107358. .
  107359. #75:7
  107360. "unparse(host, port, tag, label) => string";
  107361. host = args[1];
  107362. port = args[2];
  107363. tag = args[3];
  107364. label = args[4];
  107365. if (tab = index(tag, "    "))
  107366. "remove search terms from search nodes";
  107367. tag = tag[1..tab - 1];
  107368. endif
  107369. return tostr(label, "    ", tag, "    ", host, "    ", port);
  107370. .
  107371. #75:8
  107372. "return an explanation for a 'false' $gopher:get result";
  107373. value = args[1];
  107374. if (value == E_INVARG)
  107375. return "That gopher server is not reachable or is not responding.";
  107376. elseif (value == E_QUOTA)
  107377. return "Gopher connections cannot be made at this time because of system resource limitations!";
  107378. elseif (typeof(value) == ERR)
  107379. return tostr("The gopher request results in an error: ", value);
  107380. else
  107381. return "The gopher request has no results.";
  107382. endif
  107383. .
  107384. #75:9
  107385. "default -- gopher trusts everybody";
  107386. return 1;
  107387. .
  107388. #75:10
  107389. "_textp(parsed node)";
  107390. "Return true iff the parsed info points to a text node.";
  107391. return index("02", args[1][4][1]);
  107392. .
  107393. #75:11
  107394. "_mail_text(parsed node)";
  107395. "Return the text to be mailed out for the given node.";
  107396. where = args[1];
  107397. if (this:_textp(where))
  107398. return $gopher:get(@where);
  107399. else
  107400. text = {};
  107401. for x in ($gopher:get(@where))
  107402. parse = $gopher:parse(x);
  107403. sel = parse[4];
  107404. text = {@text, "Type=" + sel[1], "Name=" + sel[2..length(sel)], "Path=" + parse[3], "Host=" + parse[1], "Port=" + tostr(parse[2]), "#"};
  107405. endfor
  107406. return text;
  107407. endif
  107408. .
  107409. #75:12
  107410. if (caller_perms().wizard)
  107411. this:clear_cache();
  107412. pass(@args);
  107413. endif
  107414. .
  107415. #75:13
  107416. "Just for debugging -- shows what's in the gopher cache";
  107417. req = this.cache_requests;
  107418. tim = this.cache_times;
  107419. val = this.cache_values;
  107420. "save values in case cache changes while printing";
  107421. player:tell("size -- expires -- host (port) ------ selector ------------");
  107422. for i in [1..length(req)]
  107423. re = req[i];
  107424. host = $string_utils:left(re[1] + ((re[2] == 70) ? "" | tostr(" (", re[2], ")")), 24);
  107425. expires = $string_utils:right($time_utils:dhms(tim[i] - time()), 8);
  107426. va = val[i];
  107427. if (typeof(va) == LIST)
  107428. va = length(va);
  107429. elseif (typeof(va) == ERR)
  107430. va = $error:name(va);
  107431. else
  107432. va = tostr(va);
  107433. endif
  107434. selector = re[3];
  107435. if (length(selector) > 40)
  107436. selector = ("..." + selector[length(selector) - 37..length(selector)]);
  107437. endif
  107438. player:tell($string_utils:right(va, 8), expires, " ", host, selector);
  107439. endfor
  107440. player:tell("--- end cache display -------------------------------------");
  107441. .
  107442. #75:14
  107443. "Usage: get_cache(site, port, selection)";
  107444. "return current cache";
  107445. request = args[1..3];
  107446. if (index = (request in this.cache_requests))
  107447. if (this.cache_times[index] > now)
  107448. return this.cache_values[index];
  107449. endif
  107450. endif
  107451. return 0;
  107452. .
  107453. #75:15
  107454. if (index = (args in this.cache_requests))
  107455. return index;
  107456. else
  107457. this.cache_times = {@this.cache_times, time() + 240};
  107458. this.cache_values = {@this.cache_values, task_id()};
  107459. this.cache_requests = {@this.cache_requests, args};
  107460. return length(this.cache_requests);
  107461. endif
  107462. .
  107463. #75:16
  107464. return this:description();
  107465. .
  107466. #76:0
  107467. "set_gender(newgender) attempts to change this.gender to newgender";
  107468. "  => E_PERM   if you don't own this or aren't its parent";
  107469. "  => Other return values as from $gender_utils:set.";
  107470. if (!($perm_utils:controls(caller_perms(), this) || (this == caller)))
  107471. return E_PERM;
  107472. else
  107473. result = $gender_utils:set(this, args[1]);
  107474. this.gender = ((typeof(result) == STR) ? result | args[1]);
  107475. return result;
  107476. endif
  107477. .
  107478. #76:1
  107479. if (player.wizard || (player == this.owner))
  107480. player:tell(this:set_gender(iobjstr) ? "Gender and pronouns set." | "Gender set.");
  107481. else
  107482. player:tell("Permission denied.");
  107483. endif
  107484. .
  107485. #87:0
  107486. player:tell("An invisible force bars your way...");
  107487. .
  107488. #147:0
  107489. #346:moveto(#147);
  107490. player:tell("Shelby is here");
  107491. .
  107492. #147:1
  107493. if (valid(dobj))
  107494. player:tell("Crunch, crunch...");
  107495. player.location:announce(player.name, " eats ", dobj.name);
  107496. dobj:moveto(player);
  107497. endif
  107498. .
  107499. #164:0
  107500. pass(args);
  107501. this.description = "a laserwriter. a red light is blinking on the front.";
  107502. has_toner = 0;
  107503. has_paper = 0;
  107504. for x in (this.contents)
  107505. if (x.name == "toner")
  107506. has_toner = 1;
  107507. endif
  107508. if (x.name == "paper")
  107509. has_paper = 1;
  107510. endif
  107511. endfor
  107512. if (has_paper && (!has_toner))
  107513. this.location:announce_all("Blank pages start coming from the laserwriter.");
  107514. elseif (has_paper && has_toner)
  107515. this.description = "a laserwriter. There is a green light flashing on the front.";
  107516. fork (1)
  107517. this.location:announce_all("A resume starts printing out");
  107518. suspend(10);
  107519. if (player.location == this.location)
  107520. this.location:announce("The resume is finished printing. ", player.name, " snatches it, giving you a wary look.");
  107521. else
  107522. this.location:announce("The resume is finished printing. ", player.name, " rushes in, snatches it, and then rushes out");
  107523. endif
  107524. if (player.location == this.location)
  107525. player:tell("You suddenly realize its your resume printing. You snatch it quickly, while looking around furtively.");
  107526. endif
  107527. this.description = "a laserwriter";
  107528. endfork
  107529. endif
  107530. .
  107531. #166:1
  107532. this.label = iobjstr;
  107533. .
  107534. #167:0
  107535. if ((iobj == #349) || (parent(iobj) == #349))
  107536. player:tell(this.name, " first stares in shock at ", iobj.name, ", then suddenly explodes into flames.");
  107537. player.location:announce(this.name, " stares in shock as ", player.name, " hands him ", iobj.name, ", then suddenly explodes into flames.");
  107538. recycle(this);
  107539. recycle(iobj);
  107540. else
  107541. player:tell(this.name, " takes ", iobj.name, " but refuses to vacate the premises.");
  107542. player.location:announce(player.name, " tries to layoff ", this.name, " with ", iobj.name, " but ", this.name, " won't leave.");
  107543. endif
  107544. .
  107545. #170:0
  107546. player:tell("You are chopped to pieces by the whirring blades. Blood and guts are spattered everywhere, and drip into Bob's cubicle.");
  107547. player:moveto(#168);
  107548. .
  107549. #178:0
  107550. player:tell("The xerox machine is jammed. Call Xerox at 510-342-1234");
  107551. .
  107552. #178:1
  107553. player:tell("The xerox machine is jammed. Call Xerox at 510-342-1234");
  107554. .
  107555. #179:0
  107556. if (iobjstr == "510-342-1234")
  107557. player:tell("...You've reached the Xerox corporation. Please leave a message after the beep...");
  107558. suspend(4);
  107559. player:tell("beep!");
  107560. else
  107561. player:tell("You hear a busy signal...");
  107562. endif
  107563. .
  107564. #188:0
  107565. if (argstr == "through window")
  107566. rplayers = {};
  107567. for x in (#185.contents)
  107568. if (is_player(x))
  107569. rplayers = {@rplayers, x};
  107570. endif
  107571. endfor
  107572. len = length(rplayers);
  107573. if (len > 1)
  107574. count = 1;
  107575. s = "";
  107576. while (count <= (len - 2))
  107577. s = ((s + rplayers[count].name) + ", ");
  107578. count = (count + 1);
  107579. endwhile
  107580. player:tell(s, rplayers[len - 1].name, " and ", rplayers[len].name, " look up at you. You look away.");
  107581. elseif (len == 1)
  107582. player:tell(rplayers[1].name, " looks up at you. You look away.");
  107583. else
  107584. player:tell("The conference room seems to be empty.");
  107585. endif
  107586. #185:announce_all(player.name, " looks briefly in through the window.");
  107587. else
  107588. pass(args);
  107589. endif
  107590. .
  107591. #265:0
  107592. player:tell("The box is attached to the wall.");
  107593. .
  107594. #289:0
  107595. player:tell("You are now sitting at the desk.");
  107596. .
  107597. #294:0
  107598. player:tell("Sorry, that is attached to the wall by hundreds of wires, and anyway, it isn't yours.");
  107599. .
  107600. #294:1
  107601. player:moveto(#291);
  107602. .
  107603. #300:0
  107604. player:tell("Your mouth waters as you stuff the candy into it. Sure tastes good...");
  107605. suspend(20);
  107606. player:tell("You are starting to feel sick from all that candy you ate.");
  107607. suspend(20);
  107608. player:tell("You seem to be gaining weight.");
  107609. suspend(20);
  107610. player:tell("Your friends give you the nickname Porky.");
  107611. .
  107612. #306:0
  107613. player:tell("Sorry, thats attached to the wall...");
  107614. .
  107615. #306:1
  107616. this.location.description = "You are in Bob's computer. There is an eerie silence here.";
  107617. player:tell("The drive winds down, and it gets quiet...");
  107618. this.description = "The drive is unplugged.";
  107619. .
  107620. #306:2
  107621. this.location:announce_all("a loud whirring starts...");
  107622. this.location.description = "You are in Bob's computer. There is a loud whirring here.";
  107623. this.description = "The drive is plugged in.";
  107624. .
  107625. #308:0
  107626. if (prepstr == "on")
  107627. if (this.active == 1)
  107628. player:tell("The mac is already on.");
  107629. else
  107630. this.description = "You see a Macintosh Plus. Its old and dirty. It seems to be booting up.";
  107631. this.location:announce_all("You hear a loud BING coming from the Mac Plus.");
  107632. suspend(10);
  107633. if (!valid(this:match("floppy")))
  107634. this.description = "You see a macintosh plus. There is a flashing question mark on the screen.";
  107635. while (!valid(this:match("floppy")))
  107636. suspend(3);
  107637. endwhile
  107638. this.description = "The mac plus displays a dialog with \"Welcome to Macintosh\" on it.";
  107639. this.location:announce_all("The flashing question mark turns into a smiling mac icon");
  107640. else
  107641. this.description = "The mac plus displays a dialog with \"Welcome to Macintosh\" on it.";
  107642. this.location:announce_all("The Mac Plus starts reading the system disk.");
  107643. endif
  107644. suspend(10);
  107645. this.description = "You are looking at a Mac Plus. Its displaying the finder.";
  107646. this.location:announce_all("The macintosh is displaying the finder.");
  107647. this.active = 1;
  107648. endif
  107649. else
  107650. this.description = "You are looking at a Mac Plus. Its off.";
  107651. this.active = 0;
  107652. player:tell("The macintosh is now off.");
  107653. endif
  107654. .
  107655. #311:0
  107656. player:tell("You strain your back, but its just too heavy...");
  107657. suspend(30);
  107658. player:tell("Your back hurts. You should visit a chiropractor...");
  107659. .
  107660. #316:0
  107661. player:tell("You strain your back trying to pick up ", this.name);
  107662. suspend(120);
  107663. player:tell("Man your back hurts. Maybe you shouldn't have tried to pick up ", this.name);
  107664. .
  107665. #319:0
  107666. if (this != #319)
  107667. player:tell("You eat the ", this.name, ". It sure tastes good!");
  107668. recycle(this);
  107669. endif
  107670. .
  107671. #324:0
  107672. player:tell("Thats attached to the wall.");
  107673. .
  107674. #326:0
  107675. player:tell("Its no use...");
  107676. .
  107677. #327:0
  107678. this.description = "Soft and spongy.  Three inches long.";
  107679. .
  107680. #327:1
  107681. this.description = "All shrivelled up.  The glans penis is white and cold.";
  107682. .
  107683. #327:2
  107684. this.description = "Engorged, red and fully erect.  It is exactly six inches long.";
  107685. .
  107686. #328:0
  107687. selector = random(10);
  107688. if (selector == 1)
  107689. s = "Bite the wax tadpole";
  107690. elseif (selector == 2)
  107691. s = "Chicken or Fish?";
  107692. elseif (selector == 3)
  107693. s = "breath mint";
  107694. elseif (selector == 4)
  107695. s = "anwar sadat";
  107696. elseif (selector == 5)
  107697. s = "token cheesecake";
  107698. elseif (selector == 6)
  107699. s = "whistlestop cafe";
  107700. elseif (selector == 7)
  107701. s = "Power PC";
  107702. elseif (selector == 8)
  107703. s = "Mick Jagger";
  107704. elseif (selector == 9)
  107705. s = "cornucopia";
  107706. elseif (selector == 10)
  107707. s = "perversion";
  107708. endif
  107709. player:tell(this.name, " translates that as \"", s, "\"");
  107710. .
  107711. #329:0
  107712. player:tell("Leave it alone! What are you trying to do?  Kill it?");
  107713. .
  107714. #331:0
  107715. player:tell("The turd squishes with a thick, wet sound.  The smell of yesterday's dog food rises up through your olfactory senses.");
  107716. .
  107717. #331:1
  107718. player:tell("You feel, dizzy.  In fact you think you might die. Why did you smell it it anyway.");
  107719. player:moveto(#168);
  107720. .
  107721. #332:0
  107722. player:tell("Hmmm, pretty good!");
  107723. this:moveto($nothing);
  107724. suspend(10);
  107725. player:tell("You feel sick...");
  107726. suspend(10);
  107727. player:tell("You vomit...");
  107728. player.location:announce_all_but({player}, player.name, " vomits up ", this.name);
  107729. this:moveto(player.location);
  107730. .
  107731. #333:0
  107732. players = $player_db:find_all("");
  107733. for x in (players)
  107734. player:tell(x, ", ", x.name);
  107735. endfor
  107736. .
  107737. #333:1
  107738. this.puppy.location:announce_all(player.name, " calls ", this.puppy.name, " who bounds off joyfully");
  107739. this.puppy:moveto(player.location);
  107740. .
  107741. #333:2
  107742. player:tell(this.puppy.location.name);
  107743. .
  107744. #333:3
  107745. player:moveto(this.puppy.location);
  107746. .
  107747. #333:4
  107748. this.puppy.tracer = player;
  107749. .
  107750. #333:5
  107751. this.puppy.tracer = 0;
  107752. .
  107753. #333:6
  107754. if (this.puppy != 0)
  107755. this.puppy.eavesdropper = player;
  107756. endif
  107757. .
  107758. #333:7
  107759. if (this.puppy != 0)
  107760. this.puppy.eavesdropper = 0;
  107761. endif
  107762. .
  107763. #333:8
  107764. theVerbs = verbs(dobj);
  107765. nVerbs = length(theVerbs);
  107766. for i in [0..nVerbs - 1]
  107767. vargs = verb_args(dobj, tostr(i));
  107768. player:tell("@verb \"", dobj.name, "\":\"", theVerbs[i + 1], "\" ", vargs[1], " ", vargs[2], " ", vargs[3]);
  107769. endfor
  107770. .
  107771. #334:0
  107772. player:tell("A mighty fine cup of coffee!");
  107773. player.location:announce_all_but({player}, tostr(player.name, " slugs down the 3 day old coffee."));
  107774. suspend(10);
  107775. player.location:announce_all_but({player}, "You notice ", player.name, " talking slightly faster.");
  107776. suspend(120);
  107777. player:tell("You feel tired. Maybe you need another cup of coffee?");
  107778. .
  107779. #342:0
  107780. this.location:announce_all_but({player}, player.name, " burns the cash. Smoke is everywhere...");
  107781. player:tell("Your eyes are burning from the smoke...");
  107782. .
  107783. #343:0
  107784. player:tell("A valiant effort...");
  107785. .
  107786. #343:1
  107787. n = random(10);
  107788. if (n == 1)
  107789. s = "You see a fat lady walking a very small chihuahua up the street.";
  107790. elseif (n == 2)
  107791. s = "You notice that the window is very dirty.";
  107792. elseif (n == 3)
  107793. s = "You see a man breaking into your car parked outside in the lot.";
  107794. elseif (n == 4)
  107795. s = "You watch a girl in a skimpy dress walk down the street towards \"Faces\" Salon.";
  107796. elseif (n == 5)
  107797. s = "As you stare out the window, you daydream about lobsters.";
  107798. elseif (n == 6)
  107799. s = "A man suddenly swings into view outside the window, and starts cleaning it.";
  107800. elseif (n == 7)
  107801. s = "As you stare at the apartments across the street, you notice a naked woman sunbathing on the roof.";
  107802. elseif (n == 8)
  107803. s = "You see an ugly person in the reflection.";
  107804. elseif (n == 9)
  107805. s = "You aren't supposed to be looking out the window. You are supposed to be WORKING!";
  107806. elseif (n == 10)
  107807. s = "As you watch the beautiful clouds roll by, you wonder about the meaning of life.";
  107808. endif
  107809. player:tell(s);
  107810. .
  107811. #352:0
  107812. this.movetask = 0;
  107813. this.leaving_room_msg = "%N leaves the room.";
  107814. this.entering_room_msg = "%N enters the room.";
  107815. this.prior_location = $nothing;
  107816. this.tracers = {};
  107817. this.eavesdroppers = {};
  107818. this.lazyness = 10;
  107819. .
  107820. #352:1
  107821. if (this.movetask == 0)
  107822. fork tid (0)
  107823. while (1)
  107824. if (this:do_i_like_it_here())
  107825. this:do_something_here();
  107826. else
  107827. "We should move...";
  107828. if ($object_utils:isa(this.location, $room))
  107829. exits = {};
  107830. for x in (this.location.exits)
  107831. if (x.dest != this.prior_location)
  107832. exits = {@exits, x};
  107833. endif
  107834. endfor
  107835. if (exits == {})
  107836. if (this.location.exits == {})
  107837. dest = $nothing;
  107838. else
  107839. dest = this.prior_location;
  107840. endif
  107841. else
  107842. theExit = exits[random(length(exits))];
  107843. dest = theExit.dest;
  107844. endif
  107845. if (dest == $nothing)
  107846. this.location:announce_all_but({this}, this.name, " is trapped!");
  107847. this:stop();
  107848. else
  107849. this:leaving_room();
  107850. this.prior_location = this.location;
  107851. this:moveto(dest);
  107852. this:entering_room();
  107853. this:announce_to_tracers("%N moves to %l");
  107854. endif
  107855. endif
  107856. endif
  107857. this:dawdle();
  107858. endwhile
  107859. endfork
  107860. this.movetask = tid;
  107861. endif
  107862. .
  107863. #352:2
  107864. if (this.movetask != 0)
  107865. kill_task(this.movetask);
  107866. this.movetask = 0;
  107867. endif
  107868. .
  107869. #352:3
  107870. if (this.movetask != 0)
  107871. this:stop();
  107872. this:start();
  107873. endif
  107874. .
  107875. #352:4
  107876. return this.movetask != 0;
  107877. .
  107878. #352:5
  107879. if (typeof(this.leaving_room_msg) == STR)
  107880. this.location:announce_all_but({this}, $string_utils:pronoun_sub(this.entering_room_msg, this));
  107881. endif
  107882. .
  107883. #352:6
  107884. if (typeof(this.leaving_room_msg) == STR)
  107885. this.location:announce_all_but({this}, $string_utils:pronoun_sub(this.leaving_room_msg, this));
  107886. endif
  107887. .
  107888. #352:7
  107889. if (!(player in this.tracers))
  107890. player:tell("You are now tracing ", this.name);
  107891. this.tracers = {@this.tracers, player};
  107892. else
  107893. player:tell("You are already tracing ", this.name);
  107894. endif
  107895. .
  107896. #352:8
  107897. if (x = (player in this.tracers))
  107898. player:tell("You are no longer tracing ", this.name);
  107899. this.tracers = listdelete(this.tracers, x);
  107900. else
  107901. player:tell("You weren't tracing ", this.name);
  107902. endif
  107903. .
  107904. #352:9
  107905. for tracer in (this.tracers)
  107906. if (((tracer != 0) && is_player(tracer)) && (tracer.location != this.location))
  107907. tracer:tell($string_utils:pronoun_sub(args[1], this));
  107908. endif
  107909. endfor
  107910. .
  107911. #352:10
  107912. if (!(player in this.eavesdroppers))
  107913. player:tell("You are now eavesdropping on ", this.name);
  107914. this.eavesdroppers = {@this.eavesdroppers, player};
  107915. else
  107916. player:tell("You are already eavesdropping on ", this.name);
  107917. endif
  107918. .
  107919. #352:11
  107920. if (x = (player in this.eavesdroppers))
  107921. player:tell("You are no longer eavesdropping on ", this.name);
  107922. this.eavesdroppers = listdelete(this.eavesdroppers, x);
  107923. else
  107924. player:tell("You weren't eavesdropping on ", this.name);
  107925. endif
  107926. .
  107927. #352:12
  107928. for eavesdropper in (this.eavesdroppers)
  107929. if ((eavesdropper && is_player(eavesdropper)) && (this.location != eavesdropper.location))
  107930. eavesdropper:tell("(", this.name, " from ", this.location.name, ") ", @args);
  107931. endif
  107932. endfor
  107933. .
  107934. #352:13
  107935. suspend(this.lazyness);
  107936. .
  107937. #352:14
  107938. "Override this to make the robot hang around somewhere";
  107939. return 0;
  107940. .
  107941. #352:15
  107942. "Override this to make the robot do something";
  107943. return 0;
  107944. .
  107945. #353:0
  107946. if ($object_utils:isa(this.location, $room))
  107947. for x in (this.location.contents)
  107948. if (is_player(x) && x:is_listening())
  107949. if (this.ticks <= 0)
  107950. this.ticks = 5;
  107951. return 0;
  107952. else
  107953. this.ticks = (this.ticks - 1);
  107954. return 1;
  107955. endif
  107956. endif
  107957. endfor
  107958. endif
  107959. return 0;
  107960. .
  107961. #353:1
  107962. if ($object_utils:isa(this.location, $room))
  107963. victims = {};
  107964. for x in (this.location.contents)
  107965. if (is_player(x) && x:is_listening())
  107966. victims = {@victims, x};
  107967. endif
  107968. endfor
  107969. selector = random(5);
  107970. victim = victims[random(length(victims))];
  107971. if (selector == 1)
  107972. this.location:announce_all_but({victim}, this.name, " looks sadly at ", victim.name);
  107973. victim:tell(this.name, " looks at you sadly");
  107974. elseif (selector == 2)
  107975. this.location:announce_all_but({victim}, this.name, " makes fun of ", victim.name);
  107976. victim:tell(this.name, " makes fun of you");
  107977. elseif (selector == 3)
  107978. this.location:announce_all_but({victim}, this.name, " smiles at ", victim.name);
  107979. victim:tell(this.name, " smiles at you");
  107980. elseif (selector == 4)
  107981. this.location:announce_all_but({victim}, this.name, " looks angrily at ", victim.name);
  107982. victim:tell(this.name, " looks kinda mad");
  107983. elseif (selector == 5)
  107984. this.location:announce_all_but({victim}, this.name, " looks sadly at ", victim.name);
  107985. victim:tell(this.name, " looks at you sadly");
  107986. endif
  107987. endif
  107988. .
  107989. #422:0
  107990. player:tell("You take the old, useless binders, 400K diskettes, and manuals to products that were out of date in 1987");
  107991. this:moveto(player);
  107992. .
  107993. #423:0
  107994. if ($object_utils:isa(this.location, $room))
  107995. for x in (this.location.contents)
  107996. if (is_player(x) && x:is_listening())
  107997. if (this.ticks <= 0)
  107998. this.ticks = 5;
  107999. return 0;
  108000. else
  108001. this.ticks = (this.ticks - 1);
  108002. return 1;
  108003. endif
  108004. endif
  108005. endfor
  108006. endif
  108007. return 0;
  108008. .
  108009. #423:1
  108010. if ($object_utils:isa(this.location, $room))
  108011. victims = {};
  108012. for x in (this.location.contents)
  108013. if (is_player(x) && x:is_listening())
  108014. victims = {@victims, x};
  108015. endif
  108016. endfor
  108017. selector = random(10);
  108018. victim = victims[random(length(victims))];
  108019. if (selector == 1)
  108020. this.location:announce_all_but({this}, this.name, " eats a starburst");
  108021. elseif (selector == 2)
  108022. this.location:announce_all_but({this}, this.name, " eats some jelly bellys");
  108023. elseif (selector == 3)
  108024. this.location:announce_all_but({this}, this.name, " invites you to go scuba diving");
  108025. elseif (selector == 4)
  108026. this.location:announce_all_but({this}, this.name, " reminisces about texas");
  108027. elseif (selector == 5)
  108028. this.location:announce_all_but({victim, this}, this.name, " fires ", victim.name);
  108029. victim:tell(this.name, " looks at you sadly, then fires you.");
  108030. elseif (selector == 6)
  108031. this.location:announce_all_but({victim, this}, this.name, " smiles knowingly at ", victim.name);
  108032. victim:tell(this.name, " smiles knowingly at you.");
  108033. elseif (selector == 7)
  108034. this.location:announce_all_but({victim, this}, this.name, " looks over ", victim.name, "'s shoulder.");
  108035. victim:tell(this.name, " seems concerned about your recent performance.");
  108036. elseif (selector == 8)
  108037. this.location:announce_all_but({victim, this}, this.name, " tells ", victim.name, " to get to work.");
  108038. victim:tell(this.name, " tells you to get to work.");
  108039. elseif (selector == 9)
  108040. this.location:announce_all_but({victim, this}, this.name, " wonders what ", victim.name, " is doing.");
  108041. victim:tell(this.name, " wonders what you are doing.");
  108042. elseif (selector == 10)
  108043. this.location:announce_all_but({victim, this}, this.name, " gives a pink slip to ", victim.name);
  108044. victim:tell(this.name, " gives you a pink slip");
  108045. ps = this:match("Pink Slip");
  108046. if (valid(ps))
  108047. ps:moveto(victim);
  108048. endif
  108049. endif
  108050. endif
  108051. .
  108052. #423:2
  108053. c = args[1];
  108054. if (c)
  108055. longear = {};
  108056. gear = {};
  108057. width = player:linelen();
  108058. half = (width / 2);
  108059. player:tell("Carrying:");
  108060. for thing in (c)
  108061. cx = tostr(" ", thing:title());
  108062. if (length(cx) > half)
  108063. longear = {@longear, cx};
  108064. else
  108065. gear = {@gear, cx};
  108066. endif
  108067. endfor
  108068. player:tell_lines($string_utils:columnize(gear, 2, width));
  108069. player:tell_lines(longear);
  108070. endif
  108071. .
  108072. #423:3
  108073. pass();
  108074. player:tell("She is awake and looks alert.");
  108075. if (c = this:contents())
  108076. this:tell_contents(c);
  108077. endif
  108078. .
  108079. #424:0
  108080. p = {};
  108081. if ($object_utils:isa(this.location, $room))
  108082. for x in (this.location.contents)
  108083. if (is_player(x) && x:is_listening())
  108084. return 0;
  108085. endif
  108086. endfor
  108087. endif
  108088. if (this.location == #101)
  108089. return 1;
  108090. else
  108091. return 0;
  108092. endif
  108093. .
  108094. #424:1
  108095. .
  108096. #428:0
  108097. n = random(10);
  108098. if (n == 1)
  108099. s = "You see a fat lady walking a very small chihuahua up the street.";
  108100. elseif (n == 2)
  108101. s = "You notice that the window is very dirty.";
  108102. elseif (n == 3)
  108103. s = "You see a man breaking into your car parked outside in the lot.";
  108104. elseif (n == 4)
  108105. s = "You watch a girl in a skimpy dress walk down the street towards \"Faces\" Salon.";
  108106. elseif (n == 5)
  108107. s = "As you stare out the window, you daydream about lobsters.";
  108108. elseif (n == 6)
  108109. s = "A man suddenly swings into view outside the window, and starts cleaning it.";
  108110. elseif (n == 7)
  108111. s = "As you stare at the apartments across the street, you notice a naked woman sunbathing on the roof.";
  108112. elseif (n == 8)
  108113. s = "You see an ugly person in the reflection.";
  108114. elseif (n == 9)
  108115. s = "You aren't supposed to be looking out the window. You are supposed to be WORKING!";
  108116. elseif (n == 10)
  108117. s = "As you watch the beautiful clouds roll by, you wonder about the meaning of life.";
  108118. endif
  108119. player:tell(s);
  108120. .
  108121. 0 clocks
  108122. 2 queued tasks
  108123. 0 2 751898346 16320
  108124. 0
  108125. -111
  108126. 82 -7 -8 2 -9 2 3 -10 8
  108127. No
  108128. More
  108129. Parse
  108130. Infos
  108131. disfunc
  108132. disfunc
  108133. 17 variables
  108134. NUM
  108135. 0
  108136. 0
  108137. OBJ
  108138. 0
  108139. 1
  108140. STR
  108141. 0
  108142. 2
  108143. LIST
  108144. 0
  108145. 4
  108146. ERR
  108147. 0
  108148. 3
  108149. player
  108150. 1
  108151. 2
  108152. this
  108153. 1
  108154. 82
  108155. caller
  108156. 1
  108157. 0
  108158. verb
  108159. 2
  108160. disfunc
  108161. args
  108162. 4
  108163. 1
  108164. 1
  108165. 2
  108166. argstr
  108167. 2
  108168.  
  108169. dobj
  108170. 1
  108171. -1
  108172. dobjstr
  108173. 2
  108174.  
  108175. prepstr
  108176. 2
  108177.  
  108178. iobj
  108179. 1
  108180. -1
  108181. iobjstr
  108182. 2
  108183.  
  108184. start
  108185. 255
  108186. if ((((valid(player) && (!(player in connected_players()))) && ((player.last_connect_time + 300) < time())) && (this != player.home)) && (player.location != player.home))
  108187. fork (0)
  108188. "This is forked so that it's protected from aborts due to errors in the player's :moveto verb.";
  108189. if (player.location != player.home)
  108190. move(player, $player_start);
  108191. endif
  108192. endfork
  108193. start = player.location;
  108194. player:moveto(player.home);
  108195. if (player.location != start)
  108196. start:announce("The housekeeper arrives to cart ", player.name, " off to bed.");
  108197. endif
  108198. if (player.location == player.home)
  108199. player.home:announce("The housekeeper arrives to drop off ", player.name, ", who is sound asleep.");
  108200. endif
  108201. endif
  108202. .
  108203. 0 2 751898354 3025
  108204. 0
  108205. -111
  108206. 82 -7 -8 2 -9 2 3 -10 8
  108207. No
  108208. More
  108209. Parse
  108210. Infos
  108211. disfunc
  108212. disfunc
  108213. 17 variables
  108214. NUM
  108215. 0
  108216. 0
  108217. OBJ
  108218. 0
  108219. 1
  108220. STR
  108221. 0
  108222. 2
  108223. LIST
  108224. 0
  108225. 4
  108226. ERR
  108227. 0
  108228. 3
  108229. player
  108230. 1
  108231. 2
  108232. this
  108233. 1
  108234. 82
  108235. caller
  108236. 1
  108237. 0
  108238. verb
  108239. 2
  108240. disfunc
  108241. args
  108242. 4
  108243. 1
  108244. 1
  108245. 2
  108246. argstr
  108247. 2
  108248.  
  108249. dobj
  108250. 1
  108251. -1
  108252. dobjstr
  108253. 2
  108254.  
  108255. prepstr
  108256. 2
  108257.  
  108258. iobj
  108259. 1
  108260. -1
  108261. iobjstr
  108262. 2
  108263.  
  108264. start
  108265. 255
  108266. if ((((valid(player) && (!(player in connected_players()))) && ((player.last_connect_time + 300) < time())) && (this != player.home)) && (player.location != player.home))
  108267. fork (0)
  108268. "This is forked so that it's protected from aborts due to errors in the player's :moveto verb.";
  108269. if (player.location != player.home)
  108270. move(player, $player_start);
  108271. endif
  108272. endfork
  108273. start = player.location;
  108274. player:moveto(player.home);
  108275. if (player.location != start)
  108276. start:announce("The housekeeper arrives to cart ", player.name, " off to bed.");
  108277. endif
  108278. if (player.location == player.home)
  108279. player.home:announce("The housekeeper arrives to drop off ", player.name, ", who is sound asleep.");
  108280. endif
  108281. endif
  108282. .
  108283. 0 suspended tasks
  108284.